diff --git a/composer.lock b/composer.lock
deleted file mode 100644
index 5e3c5c962ac6b04a688e11f7d373acf3bd5f6a53..0000000000000000000000000000000000000000
--- a/composer.lock
+++ /dev/null
@@ -1,7988 +0,0 @@
-{
-    "_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": "aea8a7723ba0f3cb502ae7f1679b9578",
-    "packages": [
-        {
-            "name": "aferrandini/phpqrcode",
-            "version": "1.0.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/aferrandini/PHPQRCode.git",
-                "reference": "3c1c0454d43710ab5bbe19a51ad4cb41c22e3d46"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/aferrandini/PHPQRCode/zipball/3c1c0454d43710ab5bbe19a51ad4cb41c22e3d46",
-                "reference": "3c1c0454d43710ab5bbe19a51ad4cb41c22e3d46",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.0"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-0": {
-                    "PHPQRCode": "lib/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Ariel Ferrandini",
-                    "email": "arielferrandini@gmail.com",
-                    "homepage": "http://www.ferrandini.com/",
-                    "role": "Developer"
-                }
-            ],
-            "description": "PHPQRCode porting and changed for PHP 5.3 compatibility",
-            "homepage": "https://github.com/aferrandini/PHPQRCode",
-            "keywords": [
-                "barcode",
-                "php",
-                "qrcode"
-            ],
-            "time": "2013-07-08T09:39:08+00:00"
-        },
-        {
-            "name": "ahand/mobileesp",
-            "version": "dev-master",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/ahand/mobileesp.git",
-                "reference": "c02055dbe9baee63aab11438f4d7b5d25075d347"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/ahand/mobileesp/zipball/c02055dbe9baee63aab11438f4d7b5d25075d347",
-                "reference": "c02055dbe9baee63aab11438f4d7b5d25075d347",
-                "shasum": ""
-            },
-            "type": "library",
-            "autoload": {
-                "classmap": [
-                    "PHP"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "Apache-2.0"
-            ],
-            "authors": [
-                {
-                    "name": "Anthony Hand",
-                    "email": "anthony.hand@gmail.com",
-                    "role": "Maintainer"
-                }
-            ],
-            "description": "Since 2008, MobileESP provides web site developers an easy-to-use and lightweight API for detecting whether visitors are using a mobile device, and if so, what kind. The APIs provide simple boolean results ('true' or 'false') for identifying individual device categories (such as iPhone, BlackBerry, Android, and Windows Mobile), device capabilities (e.g., J2ME), and broad classes of devices, such as 'iPhone Tier' (iPhone/Android/Tizen) or 'Tablet Tier.' APIs are available in PHP, JavaScript, Java, C#, Ruby Python, and more.",
-            "homepage": "http://www.mobileesp.org",
-            "keywords": [
-                "Mobile-Detect",
-                "browser",
-                "detect android",
-                "detect ipad",
-                "detect iphone",
-                "detect tablet",
-                "mobile",
-                "mobile detect",
-                "mobile detector",
-                "mobile device",
-                "mobile esp",
-                "mobile redirect",
-                "mobile view managing",
-                "mobiledetect",
-                "responsive web",
-                "user agent",
-                "useragent"
-            ],
-            "time": "2017-06-06 22:20:56"
-        },
-        {
-            "name": "cap60552/php-sip2",
-            "version": "v1.0.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/cap60552/php-sip2.git",
-                "reference": "9904f94e857b7d4d4fd494f2d6634dcaf0d6e2c1"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/cap60552/php-sip2/zipball/9904f94e857b7d4d4fd494f2d6634dcaf0d6e2c1",
-                "reference": "9904f94e857b7d4d4fd494f2d6634dcaf0d6e2c1",
-                "shasum": ""
-            },
-            "type": "library",
-            "autoload": {
-                "classmap": [
-                    "/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "GPL-3.0"
-            ],
-            "authors": [
-                {
-                    "name": "John Wohlers",
-                    "email": "john@wohlershome.net",
-                    "role": "Maintainer"
-                }
-            ],
-            "description": "PHP class library to facilitate communication with Integrated Library System (ILS) servers via 3M's SIP2.",
-            "homepage": "https://github.com/cap60552/php-sip2",
-            "time": "2015-11-03T04:42:39+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",
-            "time": "2017-02-14T19:40:03+00:00"
-        },
-        {
-            "name": "jasig/phpcas",
-            "version": "1.3.5",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/Jasig/phpCAS.git",
-                "reference": "61c8899c8f91204e8b9135d795461e50fe5c2db0"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/Jasig/phpCAS/zipball/61c8899c8f91204e8b9135d795461e50fe5c2db0",
-                "reference": "61c8899c8f91204e8b9135d795461e50fe5c2db0",
-                "shasum": ""
-            },
-            "require": {
-                "ext-curl": "*",
-                "php": ">=5.4.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "~3.7.10"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.3.x-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "source/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "Apache-2.0"
-            ],
-            "authors": [
-                {
-                    "name": "Joachim Fritschi",
-                    "homepage": "https://wiki.jasig.org/display/~fritschi"
-                },
-                {
-                    "name": "Adam Franco",
-                    "homepage": "https://wiki.jasig.org/display/~adamfranco"
-                }
-            ],
-            "description": "Provides a simple API for authenticating users against a CAS server",
-            "homepage": "https://wiki.jasig.org/display/CASC/phpCAS",
-            "keywords": [
-                "cas",
-                "jasig"
-            ],
-            "time": "2017-04-10T19:12:45+00:00"
-        },
-        {
-            "name": "matthiasmullie/minify",
-            "version": "1.3.45",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/matthiasmullie/minify.git",
-                "reference": "09b83e9dbdc50cf6734c6a9652a54891c0651998"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/matthiasmullie/minify/zipball/09b83e9dbdc50cf6734c6a9652a54891c0651998",
-                "reference": "09b83e9dbdc50cf6734c6a9652a54891c0651998",
-                "shasum": ""
-            },
-            "require": {
-                "ext-pcre": "*",
-                "matthiasmullie/path-converter": "~1.1",
-                "php": ">=5.3.0"
-            },
-            "require-dev": {
-                "friendsofphp/php-cs-fixer": "~1.0",
-                "matthiasmullie/scrapbook": "~1.0",
-                "phpunit/phpunit": "~4.8"
-            },
-            "suggest": {
-                "psr/cache-implementation": "Cache implementation to use with Minify::cache"
-            },
-            "bin": [
-                "bin/minifycss",
-                "bin/minifyjs"
-            ],
-            "type": "library",
-            "autoload": {
-                "psr-4": {
-                    "MatthiasMullie\\Minify\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Matthias Mullie",
-                    "email": "minify@mullie.eu",
-                    "homepage": "http://www.mullie.eu",
-                    "role": "Developer"
-                }
-            ],
-            "description": "CSS & JS minifier",
-            "homepage": "http://www.minifier.org",
-            "keywords": [
-                "JS",
-                "css",
-                "javascript",
-                "minifier",
-                "minify"
-            ],
-            "time": "2017-06-13T15:54:31+00:00"
-        },
-        {
-            "name": "matthiasmullie/path-converter",
-            "version": "1.1.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/matthiasmullie/path-converter.git",
-                "reference": "08551ec1b156e923c242a10ab484bd4d6ead6631"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/matthiasmullie/path-converter/zipball/08551ec1b156e923c242a10ab484bd4d6ead6631",
-                "reference": "08551ec1b156e923c242a10ab484bd4d6ead6631",
-                "shasum": ""
-            },
-            "require": {
-                "ext-pcre": "*",
-                "php": ">=5.3.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "~4.8"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-4": {
-                    "MatthiasMullie\\PathConverter\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Matthias Mullie",
-                    "email": "pathconverter@mullie.eu",
-                    "homepage": "http://www.mullie.eu",
-                    "role": "Developer"
-                }
-            ],
-            "description": "Relative path converter",
-            "homepage": "http://github.com/matthiasmullie/path-converter",
-            "keywords": [
-                "converter",
-                "path",
-                "paths",
-                "relative"
-            ],
-            "time": "2017-01-26T08:54:49+00:00"
-        },
-        {
-            "name": "ocramius/proxy-manager",
-            "version": "1.0.2",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/Ocramius/ProxyManager.git",
-                "reference": "57e9272ec0e8deccf09421596e0e2252df440e11"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/57e9272ec0e8deccf09421596e0e2252df440e11",
-                "reference": "57e9272ec0e8deccf09421596e0e2252df440e11",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.3",
-                "zendframework/zend-code": ">2.2.5,<3.0"
-            },
-            "require-dev": {
-                "ext-phar": "*",
-                "phpunit/phpunit": "~4.0",
-                "squizlabs/php_codesniffer": "1.5.*"
-            },
-            "suggest": {
-                "ocramius/generated-hydrator": "To have very fast object to array to object conversion for ghost objects",
-                "zendframework/zend-json": "To have the JsonRpc adapter (Remote Object feature)",
-                "zendframework/zend-soap": "To have the Soap adapter (Remote Object feature)",
-                "zendframework/zend-stdlib": "To use the hydrator proxy",
-                "zendframework/zend-xmlrpc": "To have the XmlRpc adapter (Remote Object feature)"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.0.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-0": {
-                    "ProxyManager\\": "src"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Marco Pivetta",
-                    "email": "ocramius@gmail.com",
-                    "homepage": "http://ocramius.github.com/"
-                }
-            ],
-            "description": "A library providing utilities to generate, instantiate and generally operate with Object Proxies",
-            "homepage": "https://github.com/Ocramius/ProxyManager",
-            "keywords": [
-                "aop",
-                "lazy loading",
-                "proxy",
-                "proxy pattern",
-                "service proxies"
-            ],
-            "time": "2015-08-09T04:28:19+00:00"
-        },
-        {
-            "name": "oyejorge/less.php",
-            "version": "v1.7.0.14",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/oyejorge/less.php.git",
-                "reference": "42925c5a01a07d67ca7e82dfc8fb31814d557bc9"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/oyejorge/less.php/zipball/42925c5a01a07d67ca7e82dfc8fb31814d557bc9",
-                "reference": "42925c5a01a07d67ca7e82dfc8fb31814d557bc9",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "~4.8.24"
-            },
-            "bin": [
-                "bin/lessc"
-            ],
-            "type": "library",
-            "autoload": {
-                "psr-0": {
-                    "Less": "lib/"
-                },
-                "classmap": [
-                    "lessc.inc.php"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "Apache-2.0"
-            ],
-            "authors": [
-                {
-                    "name": "Matt Agar",
-                    "homepage": "https://github.com/agar"
-                },
-                {
-                    "name": "Martin Jantošovič",
-                    "homepage": "https://github.com/Mordred"
-                },
-                {
-                    "name": "Josh Schmidt",
-                    "homepage": "https://github.com/oyejorge"
-                }
-            ],
-            "description": "PHP port of the Javascript version of LESS http://lesscss.org (Originally maintained by Josh Schmidt)",
-            "homepage": "http://lessphp.gpeasy.com",
-            "keywords": [
-                "css",
-                "less",
-                "less.js",
-                "lesscss",
-                "php",
-                "stylesheet"
-            ],
-            "time": "2017-03-28T22:19:25+00:00"
-        },
-        {
-            "name": "paragonie/random_compat",
-            "version": "v2.0.10",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/paragonie/random_compat.git",
-                "reference": "634bae8e911eefa89c1abfbf1b66da679ac8f54d"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/paragonie/random_compat/zipball/634bae8e911eefa89c1abfbf1b66da679ac8f54d",
-                "reference": "634bae8e911eefa89c1abfbf1b66da679ac8f54d",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.2.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "4.*|5.*"
-            },
-            "suggest": {
-                "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
-            },
-            "type": "library",
-            "autoload": {
-                "files": [
-                    "lib/random.php"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Paragon Initiative Enterprises",
-                    "email": "security@paragonie.com",
-                    "homepage": "https://paragonie.com"
-                }
-            ],
-            "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
-            "keywords": [
-                "csprng",
-                "pseudorandom",
-                "random"
-            ],
-            "time": "2017-03-13T16:27:32+00:00"
-        },
-        {
-            "name": "pear/archive_tar",
-            "version": "1.4.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/pear/Archive_Tar.git",
-                "reference": "43455c960da70e655c6bdf8ea2bc8cc1a6034afb"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/pear/Archive_Tar/zipball/43455c960da70e655c6bdf8ea2bc8cc1a6034afb",
-                "reference": "43455c960da70e655c6bdf8ea2bc8cc1a6034afb",
-                "shasum": ""
-            },
-            "require": {
-                "pear/pear-core-minimal": "^1.10.0alpha2",
-                "php": ">=5.2.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "*"
-            },
-            "suggest": {
-                "ext-bz2": "bz2 compression support.",
-                "ext-xz": "lzma2 compression support.",
-                "ext-zlib": "Gzip compression support."
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.4.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-0": {
-                    "Archive_Tar": ""
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "include-path": [
-                "./"
-            ],
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Vincent Blavet",
-                    "email": "vincent@phpconcept.net"
-                },
-                {
-                    "name": "Greg Beaver",
-                    "email": "greg@chiaraquartet.net"
-                },
-                {
-                    "name": "Michiel Rook",
-                    "email": "mrook@php.net"
-                }
-            ],
-            "description": "Tar file management class",
-            "homepage": "https://github.com/pear/Archive_Tar",
-            "keywords": [
-                "archive",
-                "tar"
-            ],
-            "time": "2017-06-11T17:28:11+00:00"
-        },
-        {
-            "name": "pear/console_getopt",
-            "version": "v1.4.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/pear/Console_Getopt.git",
-                "reference": "82f05cd1aa3edf34e19aa7c8ca312ce13a6a577f"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/pear/Console_Getopt/zipball/82f05cd1aa3edf34e19aa7c8ca312ce13a6a577f",
-                "reference": "82f05cd1aa3edf34e19aa7c8ca312ce13a6a577f",
-                "shasum": ""
-            },
-            "type": "library",
-            "autoload": {
-                "psr-0": {
-                    "Console": "./"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "include-path": [
-                "./"
-            ],
-            "license": [
-                "BSD-2-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Greg Beaver",
-                    "email": "cellog@php.net",
-                    "role": "Helper"
-                },
-                {
-                    "name": "Andrei Zmievski",
-                    "email": "andrei@php.net",
-                    "role": "Lead"
-                },
-                {
-                    "name": "Stig Bakken",
-                    "email": "stig@php.net",
-                    "role": "Developer"
-                }
-            ],
-            "description": "More info available on: http://pear.php.net/package/Console_Getopt",
-            "time": "2015-07-20T20:28:12+00:00"
-        },
-        {
-            "name": "pear/file_marc",
-            "version": "1.1.5",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/pear/File_MARC.git",
-                "reference": "ecf5a79661595e3804ad4c0ede984757b4fe8d8f"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/pear/File_MARC/zipball/ecf5a79661595e3804ad4c0ede984757b4fe8d8f",
-                "reference": "ecf5a79661595e3804ad4c0ede984757b4fe8d8f",
-                "shasum": ""
-            },
-            "require": {
-                "pear/pear_exception": "1.*"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "*"
-            },
-            "suggest": {
-                "pear/validate_ispn": "Install optionally via your project's composer.json"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-0": {
-                    "File": "./"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "include-path": [
-                "./"
-            ],
-            "license": [
-                "LGPL-2.1"
-            ],
-            "authors": [
-                {
-                    "name": "Dan Scott",
-                    "email": "dbs@php.net",
-                    "homepage": "https://coffeecode.net",
-                    "role": "Lead"
-                }
-            ],
-            "description": "Supports the MAchine Readable Cataloging (MARC) file format documented at http://loc.gov/marc/",
-            "time": "2017-01-23T16:49:13+00:00"
-        },
-        {
-            "name": "pear/http_request2",
-            "version": "v2.3.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/pear/HTTP_Request2.git",
-                "reference": "3599cf0fe455a4e281da464f6510bfc5c2ce54c4"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/pear/HTTP_Request2/zipball/3599cf0fe455a4e281da464f6510bfc5c2ce54c4",
-                "reference": "3599cf0fe455a4e281da464f6510bfc5c2ce54c4",
-                "shasum": ""
-            },
-            "require": {
-                "pear/net_url2": "^2.2.0",
-                "pear/pear_exception": "^1.0.0",
-                "php": ">=5.2.0"
-            },
-            "suggest": {
-                "ext-fileinfo": "Adds support for looking up mime-types using finfo.",
-                "ext-zlib": "Allows handling gzip compressed responses.",
-                "lib-curl": "Allows using cURL as a request backend.",
-                "lib-openssl": "Allows handling SSL requests when not using cURL."
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-trunk": "2.2-dev"
-                }
-            },
-            "autoload": {
-                "psr-0": {
-                    "HTTP_Request2": ""
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "include-path": [
-                "./"
-            ],
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Alexey Borzov",
-                    "email": "avb@php.net"
-                }
-            ],
-            "description": "Provides an easy way to perform HTTP requests.",
-            "homepage": "http://pear.php.net/package/HTTP_Request2",
-            "keywords": [
-                "PEAR",
-                "curl",
-                "http",
-                "request"
-            ],
-            "time": "2016-02-13T20:20:39+00:00"
-        },
-        {
-            "name": "pear/net_url2",
-            "version": "v2.2.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/pear/Net_URL2.git",
-                "reference": "43a87606daf52efe6685c92131be083143108e37"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/pear/Net_URL2/zipball/43a87606daf52efe6685c92131be083143108e37",
-                "reference": "43a87606daf52efe6685c92131be083143108e37",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.1.4"
-            },
-            "require-dev": {
-                "phpunit/phpunit": ">=3.3.0"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.2.x-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "Net/URL2.php"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "David Coallier",
-                    "email": "davidc@php.net"
-                },
-                {
-                    "name": "Tom Klingenberg",
-                    "email": "tkli@php.net"
-                },
-                {
-                    "name": "Christian Schmidt",
-                    "email": "chmidt@php.net"
-                }
-            ],
-            "description": "Class for parsing and handling URL. Provides parsing of URLs into their constituent parts (scheme, host, path etc.), URL generation, and resolving of relative URLs.",
-            "homepage": "https://github.com/pear/Net_URL2",
-            "keywords": [
-                "PEAR",
-                "net",
-                "networking",
-                "rfc3986",
-                "uri",
-                "url"
-            ],
-            "time": "2016-04-18T22:24:01+00:00"
-        },
-        {
-            "name": "pear/pear-core-minimal",
-            "version": "v1.10.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/pear/pear-core-minimal.git",
-                "reference": "070f0b600b2caca2501e2c9b7e553016e4b0d115"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/pear/pear-core-minimal/zipball/070f0b600b2caca2501e2c9b7e553016e4b0d115",
-                "reference": "070f0b600b2caca2501e2c9b7e553016e4b0d115",
-                "shasum": ""
-            },
-            "require": {
-                "pear/console_getopt": "~1.4",
-                "pear/pear_exception": "~1.0"
-            },
-            "replace": {
-                "rsky/pear-core-min": "self.version"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-0": {
-                    "": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "include-path": [
-                "src/"
-            ],
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Christian Weiske",
-                    "email": "cweiske@php.net",
-                    "role": "Lead"
-                }
-            ],
-            "description": "Minimal set of PEAR core files to be used as composer dependency",
-            "time": "2017-02-28T16:46:11+00:00"
-        },
-        {
-            "name": "pear/pear_exception",
-            "version": "v1.0.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/pear/PEAR_Exception.git",
-                "reference": "8c18719fdae000b690e3912be401c76e406dd13b"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/pear/PEAR_Exception/zipball/8c18719fdae000b690e3912be401c76e406dd13b",
-                "reference": "8c18719fdae000b690e3912be401c76e406dd13b",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=4.4.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "*"
-            },
-            "type": "class",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.0.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-0": {
-                    "PEAR": ""
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "include-path": [
-                "."
-            ],
-            "license": [
-                "BSD-2-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Helgi Thormar",
-                    "email": "dufuz@php.net"
-                },
-                {
-                    "name": "Greg Beaver",
-                    "email": "cellog@php.net"
-                }
-            ],
-            "description": "The PEAR Exception base class.",
-            "homepage": "https://github.com/pear/PEAR_Exception",
-            "keywords": [
-                "exception"
-            ],
-            "time": "2015-02-10T20:07:52+00:00"
-        },
-        {
-            "name": "pear/validate",
-            "version": "v0.8.5",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/pear/Validate.git",
-                "reference": "d055541ee2d7165329d5e5b8e91907d7fae1cff2"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/pear/Validate/zipball/d055541ee2d7165329d5e5b8e91907d7fae1cff2",
-                "reference": "d055541ee2d7165329d5e5b8e91907d7fae1cff2",
-                "shasum": ""
-            },
-            "suggest": {
-                "pear/date": "Install optionally via your project's composer.json"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-0": {
-                    "Validate": "./"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "include-path": [
-                "./"
-            ],
-            "license": [
-                "New BSD"
-            ],
-            "authors": [
-                {
-                    "name": "Pierre-Alain Joye",
-                    "email": "pierre.php@gmail.com",
-                    "role": "Lead"
-                },
-                {
-                    "name": "Thomas V.V.Cox",
-                    "email": "cox@php.net",
-                    "role": "Lead"
-                },
-                {
-                    "name": "Helgi Þormar Þorbjörnsson",
-                    "email": "dufuz@php.net",
-                    "role": "Lead"
-                },
-                {
-                    "name": "Amir Mohammad Saied",
-                    "email": "amirsaied@gmail.com",
-                    "role": "Lead"
-                },
-                {
-                    "name": "David Coallier",
-                    "email": "david@echolibre.com",
-                    "role": "Lead"
-                },
-                {
-                    "name": "bertrand Gugger",
-                    "email": "bertrand@toggg.com",
-                    "role": "Lead"
-                },
-                {
-                    "name": "Stefan Neufeind",
-                    "email": "pear.neufeind@speedpartner.de",
-                    "role": "Developer"
-                }
-            ],
-            "description": "Validate numbers, email, strings, dates, URIs and more",
-            "homepage": "http://pear.php.net/package/Validate",
-            "time": "2015-02-20T09:16:13+00:00"
-        },
-        {
-            "name": "pear/validate_ispn",
-            "version": "dev-master",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/pear/Validate_ISPN.git",
-                "reference": "9ea9312a0841b5d745742c737772aeffa6d06e96"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/pear/Validate_ISPN/zipball/9ea9312a0841b5d745742c737772aeffa6d06e96",
-                "reference": "9ea9312a0841b5d745742c737772aeffa6d06e96",
-                "shasum": ""
-            },
-            "require": {
-                "pear/validate": "*"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "*"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-0": {
-                    "Validate": "./"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "include-path": [
-                "./"
-            ],
-            "license": [
-                "BSD-2-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Helgi Þormar",
-                    "email": "dufuz@php.net",
-                    "role": "Lead"
-                },
-                {
-                    "name": "Piotr Klaban",
-                    "email": "makler@man.torun.pl",
-                    "role": "Lead"
-                }
-            ],
-            "description": "More info available on: http://pear.php.net/package/Validate_ISPN",
-            "time": "2015-04-14 04:17:31"
-        },
-        {
-            "name": "phing/phing",
-            "version": "2.16.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/phingofficial/phing.git",
-                "reference": "151a0f4d8cebf7711eccc62dde3f09bc36a00d7b"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/phingofficial/phing/zipball/151a0f4d8cebf7711eccc62dde3f09bc36a00d7b",
-                "reference": "151a0f4d8cebf7711eccc62dde3f09bc36a00d7b",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.2.0",
-                "symfony/yaml": "^3.1"
-            },
-            "require-dev": {
-                "ext-pdo_sqlite": "*",
-                "mikey179/vfsstream": "^1.6",
-                "pdepend/pdepend": "2.x",
-                "pear/archive_tar": "1.4.x",
-                "pear/http_request2": "dev-trunk",
-                "pear/net_growl": "dev-trunk",
-                "pear/pear-core-minimal": "1.10.1",
-                "pear/versioncontrol_git": "@dev",
-                "pear/versioncontrol_svn": "~0.5",
-                "phpdocumentor/phpdocumentor": "2.x",
-                "phploc/phploc": "~2.0.6",
-                "phpmd/phpmd": "~2.2",
-                "phpunit/phpunit": ">=3.7",
-                "sebastian/git": "~1.0",
-                "sebastian/phpcpd": "2.x",
-                "siad007/versioncontrol_hg": "^1.0",
-                "simpletest/simpletest": "^1.1",
-                "squizlabs/php_codesniffer": "~2.2"
-            },
-            "suggest": {
-                "pdepend/pdepend": "PHP version of JDepend",
-                "pear/archive_tar": "Tar file management class",
-                "pear/versioncontrol_git": "A library that provides OO interface to handle Git repository",
-                "pear/versioncontrol_svn": "A simple OO-style interface for Subversion, the free/open-source version control system",
-                "phpdocumentor/phpdocumentor": "Documentation Generator for PHP",
-                "phploc/phploc": "A tool for quickly measuring the size of a PHP project",
-                "phpmd/phpmd": "PHP version of PMD tool",
-                "phpunit/php-code-coverage": "Library that provides collection, processing, and rendering functionality for PHP code coverage information",
-                "phpunit/phpunit": "The PHP Unit Testing Framework",
-                "sebastian/phpcpd": "Copy/Paste Detector (CPD) for PHP code",
-                "siad007/versioncontrol_hg": "A library for interfacing with Mercurial repositories.",
-                "tedivm/jshrink": "Javascript Minifier built in PHP"
-            },
-            "bin": [
-                "bin/phing"
-            ],
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.16.x-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "classes/phing/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "include-path": [
-                "classes"
-            ],
-            "license": [
-                "LGPL-3.0"
-            ],
-            "authors": [
-                {
-                    "name": "Michiel Rook",
-                    "email": "mrook@php.net"
-                },
-                {
-                    "name": "Phing Community",
-                    "homepage": "https://www.phing.info/trac/wiki/Development/Contributors"
-                }
-            ],
-            "description": "PHing Is Not GNU make; it's a PHP project build system or build tool based on Apache Ant.",
-            "homepage": "https://www.phing.info/",
-            "keywords": [
-                "build",
-                "phing",
-                "task",
-                "tool"
-            ],
-            "time": "2016-12-22T20:16:33+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": "psr/http-message",
-            "version": "1.0.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/php-fig/http-message.git",
-                "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
-                "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.0"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.0.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Psr\\Http\\Message\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "PHP-FIG",
-                    "homepage": "http://www.php-fig.org/"
-                }
-            ],
-            "description": "Common interface for HTTP messages",
-            "homepage": "https://github.com/php-fig/http-message",
-            "keywords": [
-                "http",
-                "http-message",
-                "psr",
-                "psr-7",
-                "request",
-                "response"
-            ],
-            "time": "2016-08-06T14:39:51+00:00"
-        },
-        {
-            "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": "serialssolutions/summon",
-            "version": "v1.1.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/summon/Summon.php.git",
-                "reference": "170beb3b0505f2047613b101213379537e651ea2"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/summon/Summon.php/zipball/170beb3b0505f2047613b101213379537e651ea2",
-                "reference": "170beb3b0505f2047613b101213379537e651ea2",
-                "shasum": ""
-            },
-            "type": "library",
-            "autoload": {
-                "psr-0": {
-                    "SerialsSolutions": ""
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "GPL-2.0"
-            ],
-            "authors": [
-                {
-                    "name": "Demian Katz",
-                    "email": "demian.katz@villanova.edu"
-                }
-            ],
-            "description": "Library for interacting with Serials Solutions' Summon API.",
-            "time": "2017-05-17T20:36:35+00:00"
-        },
-        {
-            "name": "swagger-api/swagger-ui",
-            "version": "v2.2.10",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/swagger-api/swagger-ui.git",
-                "reference": "64dc3060b3700b12e466f8d67b7d7ec3574b015f"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/swagger-api/swagger-ui/zipball/64dc3060b3700b12e466f8d67b7d7ec3574b015f",
-                "reference": "64dc3060b3700b12e466f8d67b7d7ec3574b015f",
-                "shasum": ""
-            },
-            "type": "library",
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "Apache-2.0"
-            ],
-            "authors": [
-                {
-                    "name": "Tony Tam",
-                    "email": "fehguy@gmail.com"
-                },
-                {
-                    "name": "Mohsen Azimi",
-                    "email": "me@azimi.me"
-                }
-            ],
-            "description": "Swagger UI is a dependency-free collection of HTML, JavaScript, and CSS assets that dynamically generate beautiful documentation from a Swagger-compliant API",
-            "homepage": "http://swagger.io",
-            "keywords": [
-                "api",
-                "documentation",
-                "openapi",
-                "specification",
-                "swagger",
-                "ui"
-            ],
-            "time": "2017-01-05T08:57:09+00:00"
-        },
-        {
-            "name": "symfony/yaml",
-            "version": "v3.3.2",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/symfony/yaml.git",
-                "reference": "9752a30000a8ca9f4b34b5227d15d0101b96b063"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/symfony/yaml/zipball/9752a30000a8ca9f4b34b5227d15d0101b96b063",
-                "reference": "9752a30000a8ca9f4b34b5227d15d0101b96b063",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.5.9"
-            },
-            "require-dev": {
-                "symfony/console": "~2.8|~3.0"
-            },
-            "suggest": {
-                "symfony/console": "For validating YAML files using the lint command"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.3-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Symfony\\Component\\Yaml\\": ""
-                },
-                "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 Yaml Component",
-            "homepage": "https://symfony.com",
-            "time": "2017-06-02T22:05:06+00:00"
-        },
-        {
-            "name": "vufind-org/vufindcode",
-            "version": "v1.0.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/vufind-org/vufindcode.git",
-                "reference": "f50091c35f50865b926bac549e671347c4d4389d"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/vufind-org/vufindcode/zipball/f50091c35f50865b926bac549e671347c4d4389d",
-                "reference": "f50091c35f50865b926bac549e671347c4d4389d",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.0"
-            },
-            "require-dev": {
-                "friendsofphp/php-cs-fixer": "1.11.3",
-                "phploc/phploc": "2.0.6",
-                "phpmd/phpmd": "1.5.0",
-                "phpunit/phpunit": "4.8.4",
-                "sebastian/phpcpd": "1.4.3",
-                "squizlabs/php_codesniffer": "2.6.0"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-0": {
-                    "VuFindCode\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "GPL-2.0"
-            ],
-            "authors": [
-                {
-                    "name": "Demian Katz",
-                    "email": "demian.katz@villanova.edu"
-                }
-            ],
-            "description": "Class for representing ISBNs (a VuFind support library)",
-            "homepage": "https://vufind.org/",
-            "time": "2016-06-06T19:12:16+00:00"
-        },
-        {
-            "name": "vufind-org/vufindharvest",
-            "version": "v2.3.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/vufind-org/vufindharvest.git",
-                "reference": "c59e0a64b59873120c5cda32cbb8654629a8320e"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/vufind-org/vufindharvest/zipball/c59e0a64b59873120c5cda32cbb8654629a8320e",
-                "reference": "c59e0a64b59873120c5cda32cbb8654629a8320e",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.6",
-                "zendframework/zend-console": ">=2.2",
-                "zendframework/zend-http": ">=2.2"
-            },
-            "require-dev": {
-                "friendsofphp/php-cs-fixer": "1.11.6",
-                "phing/phing": "2.16.0",
-                "phpdocumentor/phpdocumentor": "2.9.0",
-                "phploc/phploc": "3.0.1",
-                "phpmd/phpmd": "2.6.0",
-                "phpunit/phpunit": "5.7.15",
-                "sebastian/phpcpd": "2.0.4",
-                "squizlabs/php_codesniffer": "2.8.1"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-4": {
-                    "VuFindHarvest\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "GPL-2.0"
-            ],
-            "authors": [
-                {
-                    "name": "Demian Katz",
-                    "email": "demian.katz@villanova.edu",
-                    "role": "Maintainer"
-                }
-            ],
-            "description": "VuFind Harvest Tools",
-            "homepage": "https://vufind.org/",
-            "time": "2017-04-06T18:31:39+00:00"
-        },
-        {
-            "name": "vufind-org/vufindhttp",
-            "version": "v2.1.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/vufind-org/vufindhttp.git",
-                "reference": "b1b7dcd5f2c87a199fd3d6d439898cc7ddd0d7ca"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/vufind-org/vufindhttp/zipball/b1b7dcd5f2c87a199fd3d6d439898cc7ddd0d7ca",
-                "reference": "b1b7dcd5f2c87a199fd3d6d439898cc7ddd0d7ca",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.4",
-                "zendframework/zend-http": ">=2.2"
-            },
-            "require-dev": {
-                "friendsofphp/php-cs-fixer": "1.11.3",
-                "phploc/phploc": "2.0.6",
-                "phpmd/phpmd": "1.5.0",
-                "phpunit/phpunit": "4.8.4",
-                "sebastian/phpcpd": "2.0.0",
-                "squizlabs/php_codesniffer": "2.6.0",
-                "zendframework/zend-uri": ">=2.2"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-0": {
-                    "VuFindHttp\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "GPL-2.0"
-            ],
-            "authors": [
-                {
-                    "name": "David Maus",
-                    "email": "maus@hab.de",
-                    "role": "developer"
-                },
-                {
-                    "name": "Demian Katz",
-                    "email": "demian.katz@villanova.edu",
-                    "role": "Maintainer"
-                }
-            ],
-            "description": "VuFind HTTP service library",
-            "homepage": "https://vufind.org/",
-            "time": "2016-09-23T12:51:36+00:00"
-        },
-        {
-            "name": "yajra/laravel-pdo-via-oci8",
-            "version": "v1.3.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/yajra/pdo-via-oci8.git",
-                "reference": "b3e52482af67770a0b3ea620f11ba0a1b38b4afd"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/yajra/pdo-via-oci8/zipball/b3e52482af67770a0b3ea620f11ba0a1b38b4afd",
-                "reference": "b3e52482af67770a0b3ea620f11ba0a1b38b4afd",
-                "shasum": ""
-            },
-            "require-dev": {
-                "phpunit/phpunit": "4.0.*"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-4": {
-                    "Yajra\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Arjay Angeles",
-                    "email": "aqangeles@gmail.com"
-                }
-            ],
-            "description": "PDO userspace driver proxying calls to PHP OCI8 driver",
-            "time": "2017-02-02T02:51:53+00:00"
-        },
-        {
-            "name": "zendframework/zend-cache",
-            "version": "2.7.2",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-cache.git",
-                "reference": "c98331b96d3b9d9b24cf32d02660602edb34d039"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-cache/zipball/c98331b96d3b9d9b24cf32d02660602edb34d039",
-                "reference": "c98331b96d3b9d9b24cf32d02660602edb34d039",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.5 || ^7.0",
-                "zendframework/zend-eventmanager": "^2.6.2 || ^3.0",
-                "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3",
-                "zendframework/zend-stdlib": "^2.7 || ^3.0"
-            },
-            "require-dev": {
-                "phpbench/phpbench": "^0.10.0",
-                "phpunit/phpunit": "^4.8",
-                "zendframework/zend-coding-standard": "~1.0.0",
-                "zendframework/zend-serializer": "^2.6",
-                "zendframework/zend-session": "^2.6.2"
-            },
-            "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-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",
-                "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.7-dev",
-                    "dev-develop": "2.8-dev"
-                },
-                "zf": {
-                    "component": "Zend\\Cache",
-                    "config-provider": "Zend\\Cache\\ConfigProvider"
-                }
-            },
-            "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": "2016-12-16T11:35:47+00:00"
-        },
-        {
-            "name": "zendframework/zend-captcha",
-            "version": "2.7.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-captcha.git",
-                "reference": "2d56293a5ae3e45e7c8ee7030aa8b305768d8014"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-captcha/zipball/2d56293a5ae3e45e7c8ee7030aa8b305768d8014",
-                "reference": "2d56293a5ae3e45e7c8ee7030aa8b305768d8014",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.6 || ^7.0",
-                "zendframework/zend-math": "^2.6 || ^3.0",
-                "zendframework/zend-stdlib": "^2.7 || ^3.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "~4.8",
-                "zendframework/zend-coding-standard": "~1.0.0",
-                "zendframework/zend-session": "^2.6",
-                "zendframework/zend-text": "^2.6",
-                "zendframework/zend-validator": "^2.6",
-                "zendframework/zendservice-recaptcha": "^3.0"
-            },
-            "suggest": {
-                "zendframework/zend-i18n-resources": "Translations of captcha messages",
-                "zendframework/zend-session": "Zend\\Session component",
-                "zendframework/zend-text": "Zend\\Text component",
-                "zendframework/zend-validator": "Zend\\Validator component",
-                "zendframework/zendservice-recaptcha": "ZendService\\ReCaptcha component"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.7-dev",
-                    "dev-develop": "2.8-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Zend\\Captcha\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "homepage": "https://github.com/zendframework/zend-captcha",
-            "keywords": [
-                "captcha",
-                "zf2"
-            ],
-            "time": "2017-02-23T08:09:44+00:00"
-        },
-        {
-            "name": "zendframework/zend-code",
-            "version": "2.6.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-code.git",
-                "reference": "95033f061b083e16cdee60530ec260d7d628b887"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-code/zipball/95033f061b083e16cdee60530ec260d7d628b887",
-                "reference": "95033f061b083e16cdee60530ec260d7d628b887",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.5 || 7.0.0 - 7.0.4 || ^7.0.6",
-                "zendframework/zend-eventmanager": "^2.6 || ^3.0"
-            },
-            "require-dev": {
-                "doctrine/annotations": "~1.0",
-                "fabpot/php-cs-fixer": "1.7.*",
-                "phpunit/phpunit": "^4.8.21",
-                "zendframework/zend-stdlib": "^2.7 || ^3.0"
-            },
-            "suggest": {
-                "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features",
-                "zendframework/zend-stdlib": "Zend\\Stdlib component"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.6-dev",
-                    "dev-develop": "2.7-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Zend\\Code\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "description": "provides facilities to generate arbitrary code using an object oriented interface",
-            "homepage": "https://github.com/zendframework/zend-code",
-            "keywords": [
-                "code",
-                "zf2"
-            ],
-            "time": "2016-04-20T17:26:42+00:00"
-        },
-        {
-            "name": "zendframework/zend-config",
-            "version": "2.6.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"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.6-dev",
-                    "dev-develop": "2.7-dev"
-                }
-            },
-            "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"
-            ],
-            "time": "2016-02-04T23:01:10+00:00"
-        },
-        {
-            "name": "zendframework/zend-console",
-            "version": "2.6.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-console.git",
-                "reference": "cbbdfdfa0564aa20d1c6c6ef3daeafe6aec02360"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-console/zipball/cbbdfdfa0564aa20d1c6c6ef3daeafe6aec02360",
-                "reference": "cbbdfdfa0564aa20d1c6c6ef3daeafe6aec02360",
-                "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-json": "^2.6",
-                "zendframework/zend-validator": "^2.5"
-            },
-            "suggest": {
-                "zendframework/zend-filter": "To support DefaultRouteMatcher usage",
-                "zendframework/zend-validator": "To support DefaultRouteMatcher usage"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.6-dev",
-                    "dev-develop": "2.7-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Zend\\Console\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "homepage": "https://github.com/zendframework/zend-console",
-            "keywords": [
-                "console",
-                "zf2"
-            ],
-            "time": "2016-02-09T17:15:12+00:00"
-        },
-        {
-            "name": "zendframework/zend-crypt",
-            "version": "3.2.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-crypt.git",
-                "reference": "274cdcb77a2165d6aff36b606e9d1c687ba9386c"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-crypt/zipball/274cdcb77a2165d6aff36b606e9d1c687ba9386c",
-                "reference": "274cdcb77a2165d6aff36b606e9d1c687ba9386c",
-                "shasum": ""
-            },
-            "require": {
-                "container-interop/container-interop": "~1.0",
-                "ext-mbstring": "*",
-                "php": "^5.6 || ^7.0",
-                "zendframework/zend-math": "^3.0",
-                "zendframework/zend-stdlib": "^2.7 || ^3.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^5.6.7",
-                "squizlabs/php_codesniffer": "^2.3.1"
-            },
-            "suggest": {
-                "ext-openssl": "Required for most features of Zend\\Crypt"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.1-dev",
-                    "dev-develop": "3.2-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Zend\\Crypt\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "homepage": "https://github.com/zendframework/zend-crypt",
-            "keywords": [
-                "crypt",
-                "zf2"
-            ],
-            "time": "2016-12-06T15:33:37+00:00"
-        },
-        {
-            "name": "zendframework/zend-db",
-            "version": "2.8.2",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-db.git",
-                "reference": "5926a1a2e7e035546b690cb7d4c11a3c47db2c98"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-db/zipball/5926a1a2e7e035546b690cb7d4c11a3c47db2c98",
-                "reference": "5926a1a2e7e035546b690cb7d4c11a3c47db2c98",
-                "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-eventmanager": "^2.6.2 || ^3.0",
-                "zendframework/zend-hydrator": "^1.1 || ^2.1",
-                "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3"
-            },
-            "suggest": {
-                "zendframework/zend-eventmanager": "Zend\\EventManager component",
-                "zendframework/zend-hydrator": "Zend\\Hydrator component for using HydratingResultSets",
-                "zendframework/zend-servicemanager": "Zend\\ServiceManager component"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.8-dev",
-                    "dev-develop": "2.9-dev"
-                },
-                "zf": {
-                    "component": "Zend\\Db",
-                    "config-provider": "Zend\\Db\\ConfigProvider"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Zend\\Db\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "homepage": "https://github.com/zendframework/zend-db",
-            "keywords": [
-                "db",
-                "zf2"
-            ],
-            "time": "2016-08-09T19:28:55+00:00"
-        },
-        {
-            "name": "zendframework/zend-diactoros",
-            "version": "1.4.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-diactoros.git",
-                "reference": "b03f285a333f51e58c95cce54109a4a9ed691436"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/b03f285a333f51e58c95cce54109a4a9ed691436",
-                "reference": "b03f285a333f51e58c95cce54109a4a9ed691436",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.4 || ^7.0",
-                "psr/http-message": "~1.0"
-            },
-            "provide": {
-                "psr/http-message-implementation": "1.0"
-            },
-            "require-dev": {
-                "ext-dom": "*",
-                "ext-libxml": "*",
-                "phpunit/phpunit": "^4.6 || ^5.5",
-                "zendframework/zend-coding-standard": "~1.0.0"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.4-dev",
-                    "dev-develop": "1.5-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Zend\\Diactoros\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-2-Clause"
-            ],
-            "description": "PSR HTTP Message implementations",
-            "homepage": "https://github.com/zendframework/zend-diactoros",
-            "keywords": [
-                "http",
-                "psr",
-                "psr-7"
-            ],
-            "time": "2017-04-06T16:18:34+00:00"
-        },
-        {
-            "name": "zendframework/zend-dom",
-            "version": "2.6.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-dom.git",
-                "reference": "a9e145b2b52fe6de5a7a6b0ddb5c773c2c72d59e"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-dom/zipball/a9e145b2b52fe6de5a7a6b0ddb5c773c2c72d59e",
-                "reference": "a9e145b2b52fe6de5a7a6b0ddb5c773c2c72d59e",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.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\\Dom\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "description": "provides tools for working with DOM documents and structures",
-            "homepage": "https://github.com/zendframework/zend-dom",
-            "keywords": [
-                "dom",
-                "zf2"
-            ],
-            "time": "2015-10-14T03:37:48+00:00"
-        },
-        {
-            "name": "zendframework/zend-escaper",
-            "version": "2.5.2",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-escaper.git",
-                "reference": "2dcd14b61a72d8b8e27d579c6344e12c26141d4e"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-escaper/zipball/2dcd14b61a72d8b8e27d579c6344e12c26141d4e",
-                "reference": "2dcd14b61a72d8b8e27d579c6344e12c26141d4e",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.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\\Escaper\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "homepage": "https://github.com/zendframework/zend-escaper",
-            "keywords": [
-                "escaper",
-                "zf2"
-            ],
-            "time": "2016-06-30T19:48:38+00:00"
-        },
-        {
-            "name": "zendframework/zend-eventmanager",
-            "version": "3.1.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-eventmanager.git",
-                "reference": "c3bce7b7d47c54040b9ae51bc55491c72513b75d"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/c3bce7b7d47c54040b9ae51bc55491c72513b75d",
-                "reference": "c3bce7b7d47c54040b9ae51bc55491c72513b75d",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.6 || ^7.0"
-            },
-            "require-dev": {
-                "athletic/athletic": "^0.1",
-                "container-interop/container-interop": "^1.1.0",
-                "phpunit/phpunit": "^5.6",
-                "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"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.1-dev",
-                    "dev-develop": "3.2-dev"
-                }
-            },
-            "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"
-            ],
-            "time": "2016-12-19T21:47:12+00:00"
-        },
-        {
-            "name": "zendframework/zend-feed",
-            "version": "2.8.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-feed.git",
-                "reference": "94579e805dd108683209fe14b3b5d4276de3de6e"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-feed/zipball/94579e805dd108683209fe14b3b5d4276de3de6e",
-                "reference": "94579e805dd108683209fe14b3b5d4276de3de6e",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.6 || ^7.0",
-                "zendframework/zend-escaper": "^2.5",
-                "zendframework/zend-stdlib": "^2.7 || ^3.1"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^6.0.8 || ^5.7.15",
-                "psr/http-message": "^1.0",
-                "zendframework/zend-cache": "^2.6",
-                "zendframework/zend-coding-standard": "~1.0.0",
-                "zendframework/zend-db": "^2.7",
-                "zendframework/zend-http": "^2.5.4",
-                "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3",
-                "zendframework/zend-validator": "^2.6"
-            },
-            "suggest": {
-                "psr/http-message": "PSR-7 ^1.0, if you wish to use Zend\\Feed\\Reader\\Http\\Psr7ResponseDecorator",
-                "zendframework/zend-cache": "Zend\\Cache component, for optionally caching feeds between requests",
-                "zendframework/zend-db": "Zend\\Db component, for use with PubSubHubbub",
-                "zendframework/zend-http": "Zend\\Http for PubSubHubbub, and optionally for use with Zend\\Feed\\Reader",
-                "zendframework/zend-servicemanager": "Zend\\ServiceManager component, for easily extending ExtensionManager implementations",
-                "zendframework/zend-validator": "Zend\\Validator component, for validating email addresses used in Atom feeds and entries ehen using the Writer subcomponent"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.8-dev",
-                    "dev-develop": "2.9-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Zend\\Feed\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "description": "provides functionality for consuming RSS and Atom feeds",
-            "homepage": "https://github.com/zendframework/zend-feed",
-            "keywords": [
-                "feed",
-                "zf2"
-            ],
-            "time": "2017-04-01T15:03:14+00:00"
-        },
-        {
-            "name": "zendframework/zend-filter",
-            "version": "2.7.2",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-filter.git",
-                "reference": "b8d0ff872f126631bf63a932e33aa2d22d467175"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-filter/zipball/b8d0ff872f126631bf63a932e33aa2d22d467175",
-                "reference": "b8d0ff872f126631bf63a932e33aa2d22d467175",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.5 || ^7.0",
-                "zendframework/zend-stdlib": "^2.7 || ^3.0"
-            },
-            "require-dev": {
-                "pear/archive_tar": "^1.4",
-                "phpunit/phpunit": "^6.0.10 || ^5.7.17",
-                "zendframework/zend-coding-standard": "~1.0.0",
-                "zendframework/zend-crypt": "^2.6 || ^3.0",
-                "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3",
-                "zendframework/zend-uri": "^2.5"
-            },
-            "suggest": {
-                "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"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.7-dev",
-                    "dev-develop": "2.8-dev"
-                },
-                "zf": {
-                    "component": "Zend\\Filter",
-                    "config-provider": "Zend\\Filter\\ConfigProvider"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Zend\\Filter\\": "src/"
-                }
-            },
-            "notification-url": "https://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": "2017-05-17T20:56:17+00:00"
-        },
-        {
-            "name": "zendframework/zend-form",
-            "version": "2.10.2",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-form.git",
-                "reference": "252db729887844025772bb8045f8df605850ed9c"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-form/zipball/252db729887844025772bb8045f8df605850ed9c",
-                "reference": "252db729887844025772bb8045f8df605850ed9c",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^7.0 || ^5.6",
-                "zendframework/zend-hydrator": "^1.1 || ^2.1",
-                "zendframework/zend-inputfilter": "^2.6",
-                "zendframework/zend-stdlib": "^2.7 || ^3.0"
-            },
-            "require-dev": {
-                "doctrine/annotations": "~1.0",
-                "phpunit/phpunit": "^6.0.8 || ^5.7.15",
-                "zendframework/zend-cache": "^2.6.1",
-                "zendframework/zend-captcha": "^2.7.1",
-                "zendframework/zend-code": "^2.6 || ^3.0",
-                "zendframework/zend-coding-standard": "~1.0.0",
-                "zendframework/zend-escaper": "^2.5",
-                "zendframework/zend-eventmanager": "^2.6.2 || ^3.0",
-                "zendframework/zend-filter": "^2.6",
-                "zendframework/zend-i18n": "^2.6",
-                "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3",
-                "zendframework/zend-session": "^2.6.2",
-                "zendframework/zend-text": "^2.6",
-                "zendframework/zend-validator": "^2.6",
-                "zendframework/zend-view": "^2.6.2",
-                "zendframework/zendservice-recaptcha": "^3.0.0"
-            },
-            "suggest": {
-                "zendframework/zend-captcha": "^2.7.1, required for using CAPTCHA form elements",
-                "zendframework/zend-code": "^2.6 || ^3.0, required to use zend-form annotations support",
-                "zendframework/zend-eventmanager": "^2.6.2 || ^3.0, reuired for zend-form annotations support",
-                "zendframework/zend-i18n": "^2.6, required when using zend-form view helpers",
-                "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3, required to use the form factories or provide services",
-                "zendframework/zend-view": "^2.6.2, required for using the zend-form view helpers",
-                "zendframework/zendservice-recaptcha": "in order to use the ReCaptcha form element"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.10-dev",
-                    "dev-develop": "2.11-dev"
-                },
-                "zf": {
-                    "component": "Zend\\Form",
-                    "config-provider": "Zend\\Form\\ConfigProvider"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Zend\\Form\\": "src/"
-                },
-                "files": [
-                    "autoload/formElementManagerPolyfill.php"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "homepage": "https://github.com/zendframework/zend-form",
-            "keywords": [
-                "form",
-                "zf2"
-            ],
-            "time": "2017-05-18T14:59:53+00:00"
-        },
-        {
-            "name": "zendframework/zend-http",
-            "version": "2.6.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-http.git",
-                "reference": "09f4d279f46d86be63171ff62ee0f79eca878678"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-http/zipball/09f4d279f46d86be63171ff62ee0f79eca878678",
-                "reference": "09f4d279f46d86be63171ff62ee0f79eca878678",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.5 || ^7.0",
-                "zendframework/zend-loader": "^2.5",
-                "zendframework/zend-stdlib": "^2.5 || ^3.0",
-                "zendframework/zend-uri": "^2.5",
-                "zendframework/zend-validator": "^2.5"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^4.0",
-                "zendframework/zend-coding-standard": "~1.0.0",
-                "zendframework/zend-config": "^2.5"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.6-dev",
-                    "dev-develop": "2.7-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Zend\\Http\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "description": "provides an easy interface for performing Hyper-Text Transfer Protocol (HTTP) requests",
-            "homepage": "https://github.com/zendframework/zend-http",
-            "keywords": [
-                "http",
-                "zf2"
-            ],
-            "time": "2017-01-31T14:41:02+00:00"
-        },
-        {
-            "name": "zendframework/zend-hydrator",
-            "version": "1.1.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"
-            },
-            "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"
-                }
-            },
-            "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"
-            ],
-            "time": "2016-02-18T22:38:26+00:00"
-        },
-        {
-            "name": "zendframework/zend-i18n",
-            "version": "2.7.4",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-i18n.git",
-                "reference": "d3431e29cc00c2a1c6704e601d4371dbf24f6a31"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-i18n/zipball/d3431e29cc00c2a1c6704e601d4371dbf24f6a31",
-                "reference": "d3431e29cc00c2a1c6704e601d4371dbf24f6a31",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^7.0 || ^5.6",
-                "zendframework/zend-stdlib": "^2.7 || ^3.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^6.0.8 || ^5.7.15",
-                "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": {
-                "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-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"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.7-dev",
-                    "dev-develop": "2.8-dev"
-                },
-                "zf": {
-                    "component": "Zend\\I18n",
-                    "config-provider": "Zend\\I18n\\ConfigProvider"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Zend\\I18n\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "homepage": "https://github.com/zendframework/zend-i18n",
-            "keywords": [
-                "i18n",
-                "zf2"
-            ],
-            "time": "2017-05-17T17:00:12+00:00"
-        },
-        {
-            "name": "zendframework/zend-inputfilter",
-            "version": "2.7.4",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-inputfilter.git",
-                "reference": "699ab4916e0aa73104e1f9ff068ef6d33c5f5fe4"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-inputfilter/zipball/699ab4916e0aa73104e1f9ff068ef6d33c5f5fe4",
-                "reference": "699ab4916e0aa73104e1f9ff068ef6d33c5f5fe4",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^7.0 || ^5.6",
-                "zendframework/zend-filter": "^2.6",
-                "zendframework/zend-stdlib": "^2.7 || ^3.0",
-                "zendframework/zend-validator": "^2.6"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^6.0.8 || ^5.7.15",
-                "zendframework/zend-coding-standard": "~1.0.0",
-                "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3"
-            },
-            "suggest": {
-                "zendframework/zend-servicemanager": "To support plugin manager support"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.7-dev",
-                    "dev-develop": "2.8-dev"
-                },
-                "zf": {
-                    "component": "Zend\\InputFilter",
-                    "config-provider": "Zend\\InputFilter\\ConfigProvider"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Zend\\InputFilter\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "homepage": "https://github.com/zendframework/zend-inputfilter",
-            "keywords": [
-                "inputfilter",
-                "zf2"
-            ],
-            "time": "2017-05-18T14:20:56+00:00"
-        },
-        {
-            "name": "zendframework/zend-json",
-            "version": "3.0.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-json.git",
-                "reference": "f42a1588e75c2a3e338cd94c37906231e616daab"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-json/zipball/f42a1588e75c2a3e338cd94c37906231e616daab",
-                "reference": "f42a1588e75c2a3e338cd94c37906231e616daab",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.5 || ^7.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "~4.0",
-                "squizlabs/php_codesniffer": "^2.3",
-                "zendframework/zend-stdlib": "^2.7 || ^3.0"
-            },
-            "suggest": {
-                "zendframework/zend-json-server": "For implementing JSON-RPC servers",
-                "zendframework/zend-xml2json": "For converting XML documents to JSON"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.0-dev",
-                    "dev-develop": "3.1-dev"
-                }
-            },
-            "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",
-            "homepage": "https://github.com/zendframework/zend-json",
-            "keywords": [
-                "json",
-                "zf2"
-            ],
-            "time": "2016-04-01T02:34:00+00:00"
-        },
-        {
-            "name": "zendframework/zend-loader",
-            "version": "2.5.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-loader.git",
-                "reference": "c5fd2f071bde071f4363def7dea8dec7393e135c"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-loader/zipball/c5fd2f071bde071f4363def7dea8dec7393e135c",
-                "reference": "c5fd2f071bde071f4363def7dea8dec7393e135c",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.23"
-            },
-            "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\\Loader\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "homepage": "https://github.com/zendframework/zend-loader",
-            "keywords": [
-                "loader",
-                "zf2"
-            ],
-            "time": "2015-06-03T14:05:47+00:00"
-        },
-        {
-            "name": "zendframework/zend-log",
-            "version": "2.9.2",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-log.git",
-                "reference": "bf7489578d092d6ff7508117d1d920a4764fbd6a"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-log/zipball/bf7489578d092d6ff7508117d1d920a4764fbd6a",
-                "reference": "bf7489578d092d6ff7508117d1d920a4764fbd6a",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.6 || ^7.0",
-                "psr/log": "^1.0",
-                "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3",
-                "zendframework/zend-stdlib": "^2.7 || ^3.0"
-            },
-            "provide": {
-                "psr/log-implementation": "1.0.0"
-            },
-            "require-dev": {
-                "mikey179/vfsstream": "^1.6",
-                "phpunit/phpunit": "^5.7.15 || ^6.0.8",
-                "zendframework/zend-coding-standard": "~1.0.0",
-                "zendframework/zend-db": "^2.6",
-                "zendframework/zend-escaper": "^2.5",
-                "zendframework/zend-filter": "^2.5",
-                "zendframework/zend-mail": "^2.6.1",
-                "zendframework/zend-validator": "^2.6"
-            },
-            "suggest": {
-                "ext-mongo": "mongo extension to use Mongo writer",
-                "ext-mongodb": "mongodb extension to use MongoDB writer",
-                "zendframework/zend-console": "Zend\\Console component to use the RequestID log processor",
-                "zendframework/zend-db": "Zend\\Db component to use the database log writer",
-                "zendframework/zend-escaper": "Zend\\Escaper component, for use in the XML log formatter",
-                "zendframework/zend-mail": "Zend\\Mail component to use the email log writer",
-                "zendframework/zend-validator": "Zend\\Validator component to block invalid log messages"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.9-dev",
-                    "dev-develop": "2.10-dev"
-                },
-                "zf": {
-                    "component": "Zend\\Log",
-                    "config-provider": "Zend\\Log\\ConfigProvider"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Zend\\Log\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "description": "component for general purpose logging",
-            "homepage": "https://github.com/zendframework/zend-log",
-            "keywords": [
-                "log",
-                "logging",
-                "zf2"
-            ],
-            "time": "2017-05-17T16:03:26+00:00"
-        },
-        {
-            "name": "zendframework/zend-mail",
-            "version": "2.8.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-mail.git",
-                "reference": "248230940ab1453b2a532a8fde76c5a6470d7aad"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-mail/zipball/248230940ab1453b2a532a8fde76c5a6470d7aad",
-                "reference": "248230940ab1453b2a532a8fde76c5a6470d7aad",
-                "shasum": ""
-            },
-            "require": {
-                "ext-iconv": "*",
-                "php": "^7.0 || ^5.6",
-                "zendframework/zend-loader": "^2.5",
-                "zendframework/zend-mime": "^2.5",
-                "zendframework/zend-stdlib": "^2.7 || ^3.0",
-                "zendframework/zend-validator": "^2.6"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^6.0.8 || ^5.7.15",
-                "zendframework/zend-coding-standard": "~1.0.0",
-                "zendframework/zend-config": "^2.6",
-                "zendframework/zend-crypt": "^2.6",
-                "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3"
-            },
-            "suggest": {
-                "ext-intl": "Handle IDN in AddressList hostnames",
-                "zendframework/zend-crypt": "Crammd5 support in SMTP Auth",
-                "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3 when using SMTP to deliver messages"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.8-dev",
-                    "dev-develop": "2.9-dev"
-                },
-                "zf": {
-                    "component": "Zend\\Mail",
-                    "config-provider": "Zend\\Mail\\ConfigProvider"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Zend\\Mail\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "description": "provides generalized functionality to compose and send both text and MIME-compliant multipart e-mail messages",
-            "homepage": "https://github.com/zendframework/zend-mail",
-            "keywords": [
-                "mail",
-                "zf2"
-            ],
-            "time": "2017-06-08T20:03:58+00:00"
-        },
-        {
-            "name": "zendframework/zend-math",
-            "version": "3.0.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-math.git",
-                "reference": "fda3b4e6c3bb15c35adc6db38b2eacabaa243e65"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-math/zipball/fda3b4e6c3bb15c35adc6db38b2eacabaa243e65",
-                "reference": "fda3b4e6c3bb15c35adc6db38b2eacabaa243e65",
-                "shasum": ""
-            },
-            "require": {
-                "ext-mbstring": "*",
-                "paragonie/random_compat": "^2.0.2",
-                "php": "^5.5 || ^7.0"
-            },
-            "require-dev": {
-                "fabpot/php-cs-fixer": "1.7.*",
-                "phpunit/phpunit": "~4.0"
-            },
-            "suggest": {
-                "ext-bcmath": "If using the bcmath functionality",
-                "ext-gmp": "If using the gmp functionality"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.0-dev",
-                    "dev-develop": "3.1-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Zend\\Math\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "homepage": "https://github.com/zendframework/zend-math",
-            "keywords": [
-                "math",
-                "zf2"
-            ],
-            "time": "2016-04-28T17:37:42+00:00"
-        },
-        {
-            "name": "zendframework/zend-mime",
-            "version": "2.6.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-mime.git",
-                "reference": "9e53a97a3c190d45cc5d584daaaf487d509a9285"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-mime/zipball/9e53a97a3c190d45cc5d584daaaf487d509a9285",
-                "reference": "9e53a97a3c190d45cc5d584daaaf487d509a9285",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.5 || ^7.0",
-                "zendframework/zend-stdlib": "^2.7 || ^3.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^4.7 || ^5.7",
-                "zendframework/zend-coding-standard": "~1.0.0",
-                "zendframework/zend-mail": "^2.6"
-            },
-            "suggest": {
-                "zendframework/zend-mail": "Zend\\Mail component"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.6-dev",
-                    "dev-develop": "2.7-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Zend\\Mime\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "homepage": "https://github.com/zendframework/zend-mime",
-            "keywords": [
-                "mime",
-                "zf2"
-            ],
-            "time": "2017-01-16T16:43:38+00:00"
-        },
-        {
-            "name": "zendframework/zend-modulemanager",
-            "version": "2.7.2",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-modulemanager.git",
-                "reference": "2a59ab9a0dd7699a55050dff659ab0f28272b46e"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-modulemanager/zipball/2a59ab9a0dd7699a55050dff659ab0f28272b46e",
-                "reference": "2a59ab9a0dd7699a55050dff659ab0f28272b46e",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.5 || ^7.0",
-                "zendframework/zend-config": "^2.6",
-                "zendframework/zend-eventmanager": "^2.6.2 || ^3.0",
-                "zendframework/zend-stdlib": "^2.7 || ^3.0"
-            },
-            "require-dev": {
-                "fabpot/php-cs-fixer": "1.7.*",
-                "phpunit/phpunit": "~4.0",
-                "zendframework/zend-console": "^2.6",
-                "zendframework/zend-di": "^2.6",
-                "zendframework/zend-loader": "^2.5",
-                "zendframework/zend-mvc": "^2.7",
-                "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3"
-            },
-            "suggest": {
-                "zendframework/zend-config": "Zend\\Config component",
-                "zendframework/zend-console": "Zend\\Console component",
-                "zendframework/zend-loader": "Zend\\Loader component",
-                "zendframework/zend-mvc": "Zend\\Mvc component",
-                "zendframework/zend-servicemanager": "Zend\\ServiceManager component"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.7-dev",
-                    "dev-develop": "2.8-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Zend\\ModuleManager\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "homepage": "https://github.com/zendframework/zend-modulemanager",
-            "keywords": [
-                "modulemanager",
-                "zf2"
-            ],
-            "time": "2016-05-16T21:21:11+00:00"
-        },
-        {
-            "name": "zendframework/zend-mvc",
-            "version": "2.7.8",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-mvc.git",
-                "reference": "d374f7c64ee2b6c491bd3d9f54a5ef45ec492089"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-mvc/zipball/d374f7c64ee2b6c491bd3d9f54a5ef45ec492089",
-                "reference": "d374f7c64ee2b6c491bd3d9f54a5ef45ec492089",
-                "shasum": ""
-            },
-            "require": {
-                "container-interop/container-interop": "^1.1",
-                "php": "^5.5 || ^7.0",
-                "zendframework/zend-eventmanager": "^2.6.2 || ^3.0",
-                "zendframework/zend-form": "^2.7",
-                "zendframework/zend-hydrator": "^1.1 || ^2.1",
-                "zendframework/zend-psr7bridge": "^0.2",
-                "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3",
-                "zendframework/zend-stdlib": "^2.7.5 || ^3.0"
-            },
-            "require-dev": {
-                "fabpot/php-cs-fixer": "1.7.*",
-                "phpunit/phpunit": "^4.5",
-                "sebastian/version": "^1.0.4",
-                "zendframework/zend-authentication": "^2.5.3",
-                "zendframework/zend-cache": "^2.6.1",
-                "zendframework/zend-console": "^2.6",
-                "zendframework/zend-di": "^2.6",
-                "zendframework/zend-filter": "^2.6.1",
-                "zendframework/zend-http": "^2.5.4",
-                "zendframework/zend-i18n": "^2.6",
-                "zendframework/zend-inputfilter": "^2.6",
-                "zendframework/zend-json": "^2.6.1",
-                "zendframework/zend-log": "^2.7.1",
-                "zendframework/zend-modulemanager": "^2.7.1",
-                "zendframework/zend-serializer": "^2.6.1",
-                "zendframework/zend-session": "^2.6.2",
-                "zendframework/zend-text": "^2.6",
-                "zendframework/zend-uri": "^2.5",
-                "zendframework/zend-validator": "^2.6",
-                "zendframework/zend-version": "^2.5",
-                "zendframework/zend-view": "^2.6.3"
-            },
-            "suggest": {
-                "zendframework/zend-authentication": "Zend\\Authentication component for Identity plugin",
-                "zendframework/zend-config": "Zend\\Config component",
-                "zendframework/zend-console": "Zend\\Console component",
-                "zendframework/zend-di": "Zend\\Di component",
-                "zendframework/zend-filter": "Zend\\Filter component",
-                "zendframework/zend-http": "Zend\\Http component",
-                "zendframework/zend-i18n": "Zend\\I18n component for translatable segments",
-                "zendframework/zend-inputfilter": "Zend\\Inputfilter component",
-                "zendframework/zend-json": "Zend\\Json component",
-                "zendframework/zend-log": "Zend\\Log component",
-                "zendframework/zend-modulemanager": "Zend\\ModuleManager component",
-                "zendframework/zend-serializer": "Zend\\Serializer component",
-                "zendframework/zend-session": "Zend\\Session component for FlashMessenger, PRG, and FPRG plugins",
-                "zendframework/zend-text": "Zend\\Text component",
-                "zendframework/zend-uri": "Zend\\Uri component",
-                "zendframework/zend-validator": "Zend\\Validator component",
-                "zendframework/zend-version": "Zend\\Version component",
-                "zendframework/zend-view": "Zend\\View component"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.7-dev",
-                    "dev-develop": "3.0-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Zend\\Mvc\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "homepage": "https://github.com/zendframework/zend-mvc",
-            "keywords": [
-                "mvc",
-                "zf2"
-            ],
-            "time": "2016-05-31T17:18:50+00:00"
-        },
-        {
-            "name": "zendframework/zend-paginator",
-            "version": "2.7.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-paginator.git",
-                "reference": "42211f3e1e8230953c641e91fec5aa9fe964eb95"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-paginator/zipball/42211f3e1e8230953c641e91fec5aa9fe964eb95",
-                "reference": "42211f3e1e8230953c641e91fec5aa9fe964eb95",
-                "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-cache": "^2.6.1",
-                "zendframework/zend-config": "^2.6.0",
-                "zendframework/zend-db": "^2.7",
-                "zendframework/zend-filter": "^2.6.1",
-                "zendframework/zend-json": "^2.6.1",
-                "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3",
-                "zendframework/zend-view": "^2.6.3"
-            },
-            "suggest": {
-                "zendframework/zend-cache": "Zend\\Cache component to support cache features",
-                "zendframework/zend-db": "Zend\\Db component",
-                "zendframework/zend-filter": "Zend\\Filter component",
-                "zendframework/zend-json": "Zend\\Json component",
-                "zendframework/zend-servicemanager": "Zend\\ServiceManager component",
-                "zendframework/zend-view": "Zend\\View component"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.7-dev",
-                    "dev-develop": "2.8-dev"
-                },
-                "zf": {
-                    "component": "Zend\\Paginator",
-                    "config-provider": "Zend\\Paginator\\ConfigProvider"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Zend\\Paginator\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "homepage": "https://github.com/zendframework/zend-paginator",
-            "keywords": [
-                "paginator",
-                "zf2"
-            ],
-            "time": "2016-04-11T21:18:13+00:00"
-        },
-        {
-            "name": "zendframework/zend-psr7bridge",
-            "version": "0.2.2",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-psr7bridge.git",
-                "reference": "86c0b53b0c6381391c4add4a93a56e51d5c74605"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-psr7bridge/zipball/86c0b53b0c6381391c4add4a93a56e51d5c74605",
-                "reference": "86c0b53b0c6381391c4add4a93a56e51d5c74605",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.5",
-                "psr/http-message": "^1.0",
-                "zendframework/zend-diactoros": "^1.1",
-                "zendframework/zend-http": "^2.5"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^4.7",
-                "squizlabs/php_codesniffer": "^2.3"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.0-dev",
-                    "dev-develop": "1.1-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Zend\\Psr7Bridge\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "description": "PSR-7 <-> Zend\\Http bridge",
-            "homepage": "https://github.com/zendframework/zend-psr7bridge",
-            "keywords": [
-                "http",
-                "psr",
-                "psr-7"
-            ],
-            "time": "2016-05-10T21:44:39+00:00"
-        },
-        {
-            "name": "zendframework/zend-serializer",
-            "version": "2.8.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-serializer.git",
-                "reference": "ff74ea020f5f90866eb28365327e9bc765a61a6e"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-serializer/zipball/ff74ea020f5f90866eb28365327e9bc765a61a6e",
-                "reference": "ff74ea020f5f90866eb28365327e9bc765a61a6e",
-                "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": "^4.5",
-                "squizlabs/php_codesniffer": "^2.3.1",
-                "zendframework/zend-math": "^2.6",
-                "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"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.8-dev",
-                    "dev-develop": "2.9-dev"
-                },
-                "zf": {
-                    "component": "Zend\\Serializer",
-                    "config-provider": "Zend\\Serializer\\ConfigProvider"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Zend\\Serializer\\": "src/"
-                }
-            },
-            "notification-url": "https://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": "2016-06-21T17:01:55+00:00"
-        },
-        {
-            "name": "zendframework/zend-server",
-            "version": "2.7.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-server.git",
-                "reference": "7cb617ca3e9b24579f544a244ee79ae61f480914"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-server/zipball/7cb617ca3e9b24579f544a244ee79ae61f480914",
-                "reference": "7cb617ca3e9b24579f544a244ee79ae61f480914",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.6 || ^7.0",
-                "zendframework/zend-code": "^2.5 || ^3.0",
-                "zendframework/zend-stdlib": "^2.5 || ^3.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^4.8",
-                "squizlabs/php_codesniffer": "^2.3.1"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.7-dev",
-                    "dev-develop": "2.8-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Zend\\Server\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "homepage": "https://github.com/zendframework/zend-server",
-            "keywords": [
-                "server",
-                "zf2"
-            ],
-            "time": "2016-06-20T22:27:55+00:00"
-        },
-        {
-            "name": "zendframework/zend-servicemanager",
-            "version": "2.7.5",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-servicemanager.git",
-                "reference": "fb5b54db5ead533b38e311f14e9c01a79218bf2b"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-servicemanager/zipball/fb5b54db5ead533b38e311f14e9c01a79218bf2b",
-                "reference": "fb5b54db5ead533b38e311f14e9c01a79218bf2b",
-                "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"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.7-dev",
-                    "dev-develop": "3.0-dev"
-                }
-            },
-            "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"
-            ],
-            "time": "2016-02-02T14:11:46+00:00"
-        },
-        {
-            "name": "zendframework/zend-session",
-            "version": "2.8.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-session.git",
-                "reference": "b1486c382decc241de8b1c7778eaf2f0a884f67d"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-session/zipball/b1486c382decc241de8b1c7778eaf2f0a884f67d",
-                "reference": "b1486c382decc241de8b1c7778eaf2f0a884f67d",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^7.0 || ^5.6",
-                "zendframework/zend-eventmanager": "^2.6.2 || ^3.0",
-                "zendframework/zend-stdlib": "^2.7 || ^3.0"
-            },
-            "require-dev": {
-                "container-interop/container-interop": "^1.1",
-                "mongodb/mongodb": "^1.0.1",
-                "phpunit/phpunit": "^6.0.8 || ^5.7.15",
-                "zendframework/zend-cache": "^2.6.1",
-                "zendframework/zend-coding-standard": "~1.0.0",
-                "zendframework/zend-db": "^2.7",
-                "zendframework/zend-http": "^2.5.4",
-                "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3",
-                "zendframework/zend-validator": "^2.6"
-            },
-            "suggest": {
-                "mongodb/mongodb": "If you want to use the MongoDB session save handler",
-                "zendframework/zend-cache": "Zend\\Cache component",
-                "zendframework/zend-db": "Zend\\Db component",
-                "zendframework/zend-http": "Zend\\Http component",
-                "zendframework/zend-servicemanager": "Zend\\ServiceManager component",
-                "zendframework/zend-validator": "Zend\\Validator component"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.8-dev",
-                    "dev-develop": "2.9-dev"
-                },
-                "zf": {
-                    "component": "Zend\\Session",
-                    "config-provider": "Zend\\Session\\ConfigProvider"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Zend\\Session\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "description": "manage and preserve session data, a logical complement of cookie data, across multiple page requests by the same client",
-            "homepage": "https://github.com/zendframework/zend-session",
-            "keywords": [
-                "session",
-                "zf2"
-            ],
-            "time": "2017-06-19T21:31:39+00:00"
-        },
-        {
-            "name": "zendframework/zend-soap",
-            "version": "2.6.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-soap.git",
-                "reference": "2d6012e7231cce550219eccfc80836a028d20bf1"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-soap/zipball/2d6012e7231cce550219eccfc80836a028d20bf1",
-                "reference": "2d6012e7231cce550219eccfc80836a028d20bf1",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.5 || ^7.0",
-                "zendframework/zend-server": "^2.6.1",
-                "zendframework/zend-stdlib": "^2.7 || ^3.0",
-                "zendframework/zend-uri": "^2.5.2"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^4.8",
-                "squizlabs/php_codesniffer": "^2.3.1",
-                "zendframework/zend-config": "^2.6",
-                "zendframework/zend-http": "^2.5.4"
-            },
-            "suggest": {
-                "zendframework/zend-http": "Zend\\Http component"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.6-dev",
-                    "dev-develop": "2.7-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Zend\\Soap\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "homepage": "https://github.com/zendframework/zend-soap",
-            "keywords": [
-                "soap",
-                "zf2"
-            ],
-            "time": "2016-04-21T16:06:27+00:00"
-        },
-        {
-            "name": "zendframework/zend-stdlib",
-            "version": "2.7.7",
-            "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"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-release-2.7": "2.7-dev",
-                    "dev-master": "3.0-dev",
-                    "dev-develop": "3.1-dev"
-                }
-            },
-            "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"
-            ],
-            "time": "2016-04-12T21:17:31+00:00"
-        },
-        {
-            "name": "zendframework/zend-text",
-            "version": "2.6.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-text.git",
-                "reference": "07ad9388e4d4f12620ad37b52a5b0e4ee7845f92"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-text/zipball/07ad9388e4d4f12620ad37b52a5b0e4ee7845f92",
-                "reference": "07ad9388e4d4f12620ad37b52a5b0e4ee7845f92",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.5 || ^7.0",
-                "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3",
-                "zendframework/zend-stdlib": "^2.7 || ^3.0"
-            },
-            "require-dev": {
-                "fabpot/php-cs-fixer": "1.7.*",
-                "phpunit/phpunit": "~4.0",
-                "zendframework/zend-config": "^2.6"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.6-dev",
-                    "dev-develop": "2.7-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Zend\\Text\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "homepage": "https://github.com/zendframework/zend-text",
-            "keywords": [
-                "text",
-                "zf2"
-            ],
-            "time": "2016-02-08T19:03:52+00:00"
-        },
-        {
-            "name": "zendframework/zend-uri",
-            "version": "2.5.2",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-uri.git",
-                "reference": "0bf717a239432b1a1675ae314f7c4acd742749ed"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-uri/zipball/0bf717a239432b1a1675ae314f7c4acd742749ed",
-                "reference": "0bf717a239432b1a1675ae314f7c4acd742749ed",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.5 || ^7.0",
-                "zendframework/zend-escaper": "^2.5",
-                "zendframework/zend-validator": "^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\\Uri\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "description": "a component that aids in manipulating and validating » Uniform Resource Identifiers (URIs)",
-            "homepage": "https://github.com/zendframework/zend-uri",
-            "keywords": [
-                "uri",
-                "zf2"
-            ],
-            "time": "2016-02-17T22:38:51+00:00"
-        },
-        {
-            "name": "zendframework/zend-validator",
-            "version": "2.9.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-validator.git",
-                "reference": "c9a8160a0191e34bb98ac1ecd4e453391c424bb3"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-validator/zipball/c9a8160a0191e34bb98ac1ecd4e453391c424bb3",
-                "reference": "c9a8160a0191e34bb98ac1ecd4e453391c424bb3",
-                "shasum": ""
-            },
-            "require": {
-                "container-interop/container-interop": "^1.1",
-                "php": "^5.6 || ^7.0",
-                "zendframework/zend-stdlib": "^2.7.6 || ^3.1"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^6.0.8 || ^5.7.15",
-                "zendframework/zend-cache": "^2.6.1",
-                "zendframework/zend-coding-standard": "~1.0.0",
-                "zendframework/zend-config": "^2.6",
-                "zendframework/zend-db": "^2.7",
-                "zendframework/zend-filter": "^2.6",
-                "zendframework/zend-http": "^2.5.4",
-                "zendframework/zend-i18n": "^2.6",
-                "zendframework/zend-math": "^2.6",
-                "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3",
-                "zendframework/zend-session": "^2.6.2",
-                "zendframework/zend-uri": "^2.5"
-            },
-            "suggest": {
-                "zendframework/zend-db": "Zend\\Db component, required by the (No)RecordExists validator",
-                "zendframework/zend-filter": "Zend\\Filter component, required by the Digits validator",
-                "zendframework/zend-i18n": "Zend\\I18n component to allow translation of validation error messages",
-                "zendframework/zend-i18n-resources": "Translations of validator messages",
-                "zendframework/zend-math": "Zend\\Math component, required by the Csrf validator",
-                "zendframework/zend-servicemanager": "Zend\\ServiceManager component to allow using the ValidatorPluginManager and validator chains",
-                "zendframework/zend-session": "Zend\\Session component, required by the Csrf validator",
-                "zendframework/zend-uri": "Zend\\Uri component, required by the Uri and Sitemap\\Loc validators"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.9-dev",
-                    "dev-develop": "2.10-dev"
-                },
-                "zf": {
-                    "component": "Zend\\Validator",
-                    "config-provider": "Zend\\Validator\\ConfigProvider"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Zend\\Validator\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "description": "provides a set of commonly needed validators",
-            "homepage": "https://github.com/zendframework/zend-validator",
-            "keywords": [
-                "validator",
-                "zf2"
-            ],
-            "time": "2017-05-17T22:06:13+00:00"
-        },
-        {
-            "name": "zendframework/zend-view",
-            "version": "2.9.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/zend-view.git",
-                "reference": "3b6342c381c4437a03fc81d0064c0bb8924914d3"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-view/zipball/3b6342c381c4437a03fc81d0064c0bb8924914d3",
-                "reference": "3b6342c381c4437a03fc81d0064c0bb8924914d3",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.6 || ^7.0",
-                "zendframework/zend-eventmanager": "^2.6.2 || ^3.0",
-                "zendframework/zend-loader": "^2.5",
-                "zendframework/zend-stdlib": "^2.7 || ^3.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^5.7.15 || ^6.0.8",
-                "zendframework/zend-authentication": "^2.5",
-                "zendframework/zend-cache": "^2.6.1",
-                "zendframework/zend-coding-standard": "~1.0.0",
-                "zendframework/zend-config": "^2.6",
-                "zendframework/zend-console": "^2.6",
-                "zendframework/zend-escaper": "^2.5",
-                "zendframework/zend-feed": "^2.7",
-                "zendframework/zend-filter": "^2.6.1",
-                "zendframework/zend-http": "^2.5.4",
-                "zendframework/zend-i18n": "^2.6",
-                "zendframework/zend-json": "^2.6.1",
-                "zendframework/zend-log": "^2.7",
-                "zendframework/zend-modulemanager": "^2.7.1",
-                "zendframework/zend-mvc": "^2.7 || ^3.0",
-                "zendframework/zend-navigation": "^2.5",
-                "zendframework/zend-paginator": "^2.5",
-                "zendframework/zend-permissions-acl": "^2.6",
-                "zendframework/zend-router": "^3.0.1",
-                "zendframework/zend-serializer": "^2.6.1",
-                "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3",
-                "zendframework/zend-session": "^2.6.2",
-                "zendframework/zend-uri": "^2.5"
-            },
-            "suggest": {
-                "zendframework/zend-authentication": "Zend\\Authentication component",
-                "zendframework/zend-escaper": "Zend\\Escaper component",
-                "zendframework/zend-feed": "Zend\\Feed component",
-                "zendframework/zend-filter": "Zend\\Filter component",
-                "zendframework/zend-http": "Zend\\Http component",
-                "zendframework/zend-i18n": "Zend\\I18n component",
-                "zendframework/zend-json": "Zend\\Json component",
-                "zendframework/zend-mvc": "Zend\\Mvc component",
-                "zendframework/zend-navigation": "Zend\\Navigation component",
-                "zendframework/zend-paginator": "Zend\\Paginator component",
-                "zendframework/zend-permissions-acl": "Zend\\Permissions\\Acl component",
-                "zendframework/zend-servicemanager": "Zend\\ServiceManager component",
-                "zendframework/zend-uri": "Zend\\Uri component"
-            },
-            "bin": [
-                "bin/templatemap_generator.php"
-            ],
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.9-dev",
-                    "dev-develop": "3.0-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Zend\\View\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "description": "provides a system of helpers, output filters, and variable escaping",
-            "homepage": "https://github.com/zendframework/zend-view",
-            "keywords": [
-                "view",
-                "zf2"
-            ],
-            "time": "2017-03-21T15:05:56+00:00"
-        },
-        {
-            "name": "zendframework/zendrest",
-            "version": "2.0.2",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/ZendRest.git",
-                "reference": "7427d242b4546e5aef1206d2c97e402109d8843e"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/ZendRest/zipball/7427d242b4546e5aef1206d2c97e402109d8843e",
-                "reference": "7427d242b4546e5aef1206d2c97e402109d8843e",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.3",
-                "zendframework/zend-http": "~2.0",
-                "zendframework/zend-uri": "~2.0",
-                "zendframework/zendxml": "~1.0-dev"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-0": {
-                    "ZendRest": "library/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "homepage": "http://packages.zendframework.com/",
-            "keywords": [
-                "rest",
-                "zf2"
-            ],
-            "time": "2014-03-05T22:32:09+00:00"
-        },
-        {
-            "name": "zendframework/zendservice-amazon",
-            "version": "2.3.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/ZendService_Amazon.git",
-                "reference": "95347a55fec8adaace67707fdd66de1ea005b346"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/ZendService_Amazon/zipball/95347a55fec8adaace67707fdd66de1ea005b346",
-                "reference": "95347a55fec8adaace67707fdd66de1ea005b346",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.6 || ^7.0",
-                "zendframework/zend-crypt": "^2.6 || ^3.2",
-                "zendframework/zend-http": "^2.6",
-                "zendframework/zend-json": "^2.6 || ^3.0",
-                "zendframework/zendrest": "~2.0",
-                "zendframework/zendxml": "^1.0"
-            },
-            "require-dev": {
-                "malukenho/docheader": "^0.1.5",
-                "phpunit/phpunit": "^6.0.8 || ^5.7.15",
-                "zendframework/zend-coding-standard": "~1.0.0",
-                "zendframework/zend-i18n": "~2.0"
-            },
-            "suggest": {
-                "zendframework/zend-uri": "Zend\\Uri component"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.2.x-dev",
-                    "dev-develop": "2.3.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "ZendService\\Amazon\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "description": "OOP wrapper for the Amazon web service",
-            "homepage": "http://packages.zendframework.com/",
-            "keywords": [
-                "amazon",
-                "ec2",
-                "s3",
-                "simpledb",
-                "sqs",
-                "zf2"
-            ],
-            "time": "2017-06-22T01:59:37+00:00"
-        },
-        {
-            "name": "zendframework/zendservice-recaptcha",
-            "version": "3.0.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/ZendService_ReCaptcha.git",
-                "reference": "6c6877c07c8ac73b187911ea5d264a640b234361"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/ZendService_ReCaptcha/zipball/6c6877c07c8ac73b187911ea5d264a640b234361",
-                "reference": "6c6877c07c8ac73b187911ea5d264a640b234361",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.6 || ^7.0",
-                "zendframework/zend-http": "^2.5.4",
-                "zendframework/zend-json": "^2.6.1 || ^3.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^5.7 || ^6.0",
-                "zendframework/zend-coding-standard": "~1.0.0",
-                "zendframework/zend-config": "^2.0",
-                "zendframework/zend-validator": "^2.8.2"
-            },
-            "suggest": {
-                "zendframework/zend-validator": "~2.0, if using ReCaptcha's Mailhide API"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.0-dev",
-                    "dev-develop": "3.1-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "ZendService\\ReCaptcha\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "description": "OOP wrapper for the ReCaptcha web service",
-            "homepage": "http://packages.zendframework.com/",
-            "keywords": [
-                "recaptcha",
-                "zf2"
-            ],
-            "time": "2017-02-09T21:38:25+00:00"
-        },
-        {
-            "name": "zendframework/zendxml",
-            "version": "1.0.2",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zendframework/ZendXml.git",
-                "reference": "7b64507bc35d841c9c5802d67f6f87ef8e1a58c9"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/ZendXml/zipball/7b64507bc35d841c9c5802d67f6f87ef8e1a58c9",
-                "reference": "7b64507bc35d841c9c5802d67f6f87ef8e1a58c9",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.3.3 || ^7.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^3.7 || ^4.0",
-                "squizlabs/php_codesniffer": "^1.5"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.0-dev"
-                }
-            },
-            "autoload": {
-                "psr-0": {
-                    "ZendXml\\": "library/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "description": "Utility library for XML usage, best practices, and security in PHP",
-            "homepage": "http://packages.zendframework.com/",
-            "keywords": [
-                "security",
-                "xml",
-                "zf2"
-            ],
-            "time": "2016-02-04T21:02:08+00:00"
-        },
-        {
-            "name": "zf-commons/zfc-rbac",
-            "version": "v2.6.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/ZF-Commons/zfc-rbac.git",
-                "reference": "dd1857a88474e2a77996b1fb858f927510762819"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/ZF-Commons/zfc-rbac/zipball/dd1857a88474e2a77996b1fb858f927510762819",
-                "reference": "dd1857a88474e2a77996b1fb858f927510762819",
-                "shasum": ""
-            },
-            "require": {
-                "php": "~5.6 || ~7.0",
-                "zendframework/zend-config": "~2.2 || ^3.1",
-                "zendframework/zend-eventmanager": "^2.6.3 || ^3.0",
-                "zendframework/zend-mvc": "~2.7 || ^3.0",
-                "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3",
-                "zfr/rbac": "~1.2"
-            },
-            "require-dev": {
-                "doctrine/common": "~2.4",
-                "doctrine/doctrine-module": "~1.1",
-                "doctrine/doctrine-orm-module": "^1.0",
-                "phpunit/phpunit": "~4.8.26",
-                "satooshi/php-coveralls": "~0.6",
-                "squizlabs/php_codesniffer": "2.6.*",
-                "zendframework/zend-authentication": "~2.2",
-                "zendframework/zend-developer-tools": "~1.1",
-                "zendframework/zend-http": "~2.2",
-                "zendframework/zend-i18n": "~2.7.3",
-                "zendframework/zend-log": "~2.2",
-                "zendframework/zend-serializer": "~2.2",
-                "zendframework/zend-view": "~2.2"
-            },
-            "suggest": {
-                "doctrine/doctrine-module": "if you want to use Doctrine role provider",
-                "zendframework/zend-developer-tools": "if you want to show information about the roles"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.4-dev",
-                    "dev-develop": "3.0-dev"
-                }
-            },
-            "autoload": {
-                "psr-0": {
-                    "ZfcRbac\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Kyle Spraggs",
-                    "email": "theman@spiffyjr.me",
-                    "homepage": "http://www.spiffyjr.me/"
-                },
-                {
-                    "name": "Jean-Marie Leroux",
-                    "email": "jmleroux.pro@gmail.com"
-                },
-                {
-                    "name": "Michaël Gallego",
-                    "email": "mic.gallego@gmail.com",
-                    "homepage": "http://www.michaelgallego.fr"
-                }
-            ],
-            "description": "Zend Framework 2 Module that provides a layer of features of Zend\\Permissions\\Rbac",
-            "homepage": "http://www.github.com/ZF-Commons/zfc-rbac",
-            "keywords": [
-                "module",
-                "permissions",
-                "rbac",
-                "zf2"
-            ],
-            "time": "2017-05-07T08:45:27+00:00"
-        },
-        {
-            "name": "zfr/rbac",
-            "version": "1.2.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/zf-fr/rbac.git",
-                "reference": "493711bfc2a637fd7c6f23b71b7b55a621c35d9d"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/zf-fr/rbac/zipball/493711bfc2a637fd7c6f23b71b7b55a621c35d9d",
-                "reference": "493711bfc2a637fd7c6f23b71b7b55a621c35d9d",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.4"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "~3.7",
-                "satooshi/php-coveralls": "~0.6",
-                "squizlabs/php_codesniffer": "1.4.*",
-                "zendframework/zend-servicemanager": "~2.2"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-0": {
-                    "Rbac\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Michaël Gallego",
-                    "email": "mic.gallego@gmail.com",
-                    "homepage": "http://michaelgallego.fr"
-                }
-            ],
-            "description": "Zend Framework 3 prototype for Zend\\Permissions\\Rbac.",
-            "homepage": "https://github.com/zf-fr/rbac",
-            "keywords": [
-                "rbac",
-                "security",
-                "zf2",
-                "zf3"
-            ],
-            "time": "2014-02-06T14:18:34+00:00"
-        }
-    ],
-    "packages-dev": [
-        {
-            "name": "behat/mink",
-            "version": "v1.7.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/minkphp/Mink.git",
-                "reference": "e6930b9c74693dff7f4e58577e1b1743399f3ff9"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/minkphp/Mink/zipball/e6930b9c74693dff7f4e58577e1b1743399f3ff9",
-                "reference": "e6930b9c74693dff7f4e58577e1b1743399f3ff9",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.1",
-                "symfony/css-selector": "~2.1|~3.0"
-            },
-            "require-dev": {
-                "symfony/phpunit-bridge": "~2.7|~3.0"
-            },
-            "suggest": {
-                "behat/mink-browserkit-driver": "extremely fast headless driver for Symfony\\Kernel-based apps (Sf2, Silex)",
-                "behat/mink-goutte-driver": "fast headless driver for any app without JS emulation",
-                "behat/mink-selenium2-driver": "slow, but JS-enabled driver for any app (requires Selenium2)",
-                "behat/mink-zombie-driver": "fast and JS-enabled headless driver for any app (requires node.js)"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.7.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Behat\\Mink\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Konstantin Kudryashov",
-                    "email": "ever.zet@gmail.com",
-                    "homepage": "http://everzet.com"
-                }
-            ],
-            "description": "Browser controller/emulator abstraction for PHP",
-            "homepage": "http://mink.behat.org/",
-            "keywords": [
-                "browser",
-                "testing",
-                "web"
-            ],
-            "time": "2016-03-05T08:26:18+00:00"
-        },
-        {
-            "name": "behat/mink-selenium2-driver",
-            "version": "v1.3.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/minkphp/MinkSelenium2Driver.git",
-                "reference": "473a9f3ebe0c134ee1e623ce8a9c852832020288"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/minkphp/MinkSelenium2Driver/zipball/473a9f3ebe0c134ee1e623ce8a9c852832020288",
-                "reference": "473a9f3ebe0c134ee1e623ce8a9c852832020288",
-                "shasum": ""
-            },
-            "require": {
-                "behat/mink": "~1.7@dev",
-                "instaclick/php-webdriver": "~1.1",
-                "php": ">=5.3.1"
-            },
-            "require-dev": {
-                "symfony/phpunit-bridge": "~2.7"
-            },
-            "type": "mink-driver",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.3.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Behat\\Mink\\Driver\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Konstantin Kudryashov",
-                    "email": "ever.zet@gmail.com",
-                    "homepage": "http://everzet.com"
-                },
-                {
-                    "name": "Pete Otaqui",
-                    "email": "pete@otaqui.com",
-                    "homepage": "https://github.com/pete-otaqui"
-                }
-            ],
-            "description": "Selenium2 (WebDriver) driver for Mink framework",
-            "homepage": "http://mink.behat.org/",
-            "keywords": [
-                "ajax",
-                "browser",
-                "javascript",
-                "selenium",
-                "testing",
-                "webdriver"
-            ],
-            "time": "2016-03-05T09:10:18+00:00"
-        },
-        {
-            "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": "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"
-            },
-            "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.4.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/doctrine/annotations.git",
-                "reference": "54cacc9b81758b14e3ce750f205a393d52339e97"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/annotations/zipball/54cacc9b81758b14e3ce750f205a393d52339e97",
-                "reference": "54cacc9b81758b14e3ce750f205a393d52339e97",
-                "shasum": ""
-            },
-            "require": {
-                "doctrine/lexer": "1.*",
-                "php": "^5.6 || ^7.0"
-            },
-            "require-dev": {
-                "doctrine/cache": "1.*",
-                "phpunit/phpunit": "^5.7"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.4.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations"
-                }
-            },
-            "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": "Docblock Annotations Parser",
-            "homepage": "http://www.doctrine-project.org",
-            "keywords": [
-                "annotations",
-                "docblock",
-                "parser"
-            ],
-            "time": "2017-02-24T16:22:25+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": "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.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/erusev/parsedown.git",
-                "reference": "728952b90a333b5c6f77f06ea9422b94b585878d"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/erusev/parsedown/zipball/728952b90a333b5c6f77f06ea9422b94b585878d",
-                "reference": "728952b90a333b5c6f77f06ea9422b94b585878d",
-                "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-05-14T14:47:48+00:00"
-        },
-        {
-            "name": "friendsofphp/php-cs-fixer",
-            "version": "v1.11.6",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git",
-                "reference": "41dc93abd2937a85a3889e28765231d574d2bac8"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/41dc93abd2937a85a3889e28765231d574d2bac8",
-                "reference": "41dc93abd2937a85a3889e28765231d574d2bac8",
-                "shasum": ""
-            },
-            "require": {
-                "ext-tokenizer": "*",
-                "php": ">=5.3.6",
-                "sebastian/diff": "~1.1",
-                "symfony/console": "~2.3|~3.0",
-                "symfony/event-dispatcher": "~2.1|~3.0",
-                "symfony/filesystem": "~2.1|~3.0",
-                "symfony/finder": "~2.1|~3.0",
-                "symfony/process": "~2.3|~3.0",
-                "symfony/stopwatch": "~2.5|~3.0"
-            },
-            "conflict": {
-                "hhvm": "<3.9"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^4.5|^5",
-                "satooshi/php-coveralls": "^0.7.1"
-            },
-            "bin": [
-                "php-cs-fixer"
-            ],
-            "type": "application",
-            "autoload": {
-                "psr-4": {
-                    "Symfony\\CS\\": "Symfony/CS/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Dariusz Rumiński",
-                    "email": "dariusz.ruminski@gmail.com"
-                },
-                {
-                    "name": "Fabien Potencier",
-                    "email": "fabien@symfony.com"
-                }
-            ],
-            "description": "A tool to automatically fix PHP code style",
-            "time": "2016-07-22T06:46:28+00:00"
-        },
-        {
-            "name": "herrera-io/json",
-            "version": "1.0.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/kherge-php/json.git",
-                "reference": "60c696c9370a1e5136816ca557c17f82a6fa83f1"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/kherge-php/json/zipball/60c696c9370a1e5136816ca557c17f82a6fa83f1",
-                "reference": "60c696c9370a1e5136816ca557c17f82a6fa83f1",
-                "shasum": ""
-            },
-            "require": {
-                "ext-json": "*",
-                "justinrainbow/json-schema": ">=1.0,<2.0-dev",
-                "php": ">=5.3.3",
-                "seld/jsonlint": ">=1.0,<2.0-dev"
-            },
-            "require-dev": {
-                "herrera-io/phpunit-test-case": "1.*",
-                "mikey179/vfsstream": "1.1.0",
-                "phpunit/phpunit": "3.7.*"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.0-dev"
-                }
-            },
-            "autoload": {
-                "files": [
-                    "src/lib/json_version.php"
-                ],
-                "psr-0": {
-                    "Herrera\\Json": "src/lib"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Kevin Herrera",
-                    "email": "kevin@herrera.io",
-                    "homepage": "http://kevin.herrera.io"
-                }
-            ],
-            "description": "A library for simplifying JSON linting and validation.",
-            "homepage": "http://herrera-io.github.com/php-json",
-            "keywords": [
-                "json",
-                "lint",
-                "schema",
-                "validate"
-            ],
-            "abandoned": "kherge/json",
-            "time": "2013-10-30T16:51:34+00:00"
-        },
-        {
-            "name": "herrera-io/phar-update",
-            "version": "1.0.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/kherge-abandoned/php-phar-update.git",
-                "reference": "00a79e1d5b8cf3c080a2e3becf1ddf7a7fea025b"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/kherge-abandoned/php-phar-update/zipball/00a79e1d5b8cf3c080a2e3becf1ddf7a7fea025b",
-                "reference": "00a79e1d5b8cf3c080a2e3becf1ddf7a7fea025b",
-                "shasum": ""
-            },
-            "require": {
-                "herrera-io/json": "1.*",
-                "kherge/version": "1.*",
-                "php": ">=5.3.3"
-            },
-            "require-dev": {
-                "herrera-io/phpunit-test-case": "1.*",
-                "mikey179/vfsstream": "1.1.0",
-                "phpunit/phpunit": "3.7.*"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.0-dev"
-                }
-            },
-            "autoload": {
-                "files": [
-                    "src/lib/constants.php"
-                ],
-                "psr-0": {
-                    "Herrera\\Phar\\Update": "src/lib"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Kevin Herrera",
-                    "email": "kevin@herrera.io",
-                    "homepage": "http://kevin.herrera.io"
-                }
-            ],
-            "description": "A library for self-updating Phars.",
-            "homepage": "http://herrera-io.github.com/php-phar-update",
-            "keywords": [
-                "phar",
-                "update"
-            ],
-            "abandoned": true,
-            "time": "2013-10-30T17:23:01+00:00"
-        },
-        {
-            "name": "instaclick/php-webdriver",
-            "version": "1.4.5",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/instaclick/php-webdriver.git",
-                "reference": "6fa959452e774dcaed543faad3a9d1a37d803327"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/instaclick/php-webdriver/zipball/6fa959452e774dcaed543faad3a9d1a37d803327",
-                "reference": "6fa959452e774dcaed543faad3a9d1a37d803327",
-                "shasum": ""
-            },
-            "require": {
-                "ext-curl": "*",
-                "php": ">=5.3.2"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^4.8",
-                "satooshi/php-coveralls": "^1.0||^2.0"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.4.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-0": {
-                    "WebDriver": "lib/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "Apache-2.0"
-            ],
-            "authors": [
-                {
-                    "name": "Justin Bishop",
-                    "email": "jubishop@gmail.com",
-                    "role": "Developer"
-                },
-                {
-                    "name": "Anthon Pang",
-                    "email": "apang@softwaredevelopment.ca",
-                    "role": "Fork Maintainer"
-                }
-            ],
-            "description": "PHP WebDriver for Selenium 2",
-            "homepage": "http://instaclick.com/",
-            "keywords": [
-                "browser",
-                "selenium",
-                "webdriver",
-                "webtest"
-            ],
-            "time": "2017-06-30T04:02:48+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": "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"
-            },
-            "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": "1.8.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/schmittjoh/serializer.git",
-                "reference": "ce65798f722c836f16d5d7d2e3ca9d21e0fb4331"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/ce65798f722c836f16d5d7d2e3ca9d21e0fb4331",
-                "reference": "ce65798f722c836f16d5d7d2e3ca9d21e0fb4331",
-                "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."
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.8-dev"
-                }
-            },
-            "autoload": {
-                "psr-0": {
-                    "JMS\\Serializer": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "Apache-2.0"
-            ],
-            "authors": [
-                {
-                    "name": "Asmir Mustafic",
-                    "email": "goetas@gmail.com"
-                },
-                {
-                    "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"
-            ],
-            "time": "2017-07-13T11:23:56+00:00"
-        },
-        {
-            "name": "justinrainbow/json-schema",
-            "version": "1.6.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/justinrainbow/json-schema.git",
-                "reference": "cc84765fb7317f6b07bd8ac78364747f95b86341"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/cc84765fb7317f6b07bd8ac78364747f95b86341",
-                "reference": "cc84765fb7317f6b07bd8ac78364747f95b86341",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.29"
-            },
-            "require-dev": {
-                "json-schema/json-schema-test-suite": "1.1.0",
-                "phpdocumentor/phpdocumentor": "~2",
-                "phpunit/phpunit": "~3.7"
-            },
-            "bin": [
-                "bin/validate-json"
-            ],
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.6.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "JsonSchema\\": "src/JsonSchema/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Bruno Prieto Reis",
-                    "email": "bruno.p.reis@gmail.com"
-                },
-                {
-                    "name": "Justin Rainbow",
-                    "email": "justin.rainbow@gmail.com"
-                },
-                {
-                    "name": "Igor Wiedler",
-                    "email": "igor@wiedler.ch"
-                },
-                {
-                    "name": "Robert Schönthal",
-                    "email": "seroscho@googlemail.com"
-                }
-            ],
-            "description": "A library to validate a json schema.",
-            "homepage": "https://github.com/justinrainbow/json-schema",
-            "keywords": [
-                "json",
-                "schema"
-            ],
-            "time": "2016-01-25T15:43:01+00:00"
-        },
-        {
-            "name": "kherge/version",
-            "version": "1.0.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/kherge-abandoned/Version.git",
-                "reference": "f07cf83f8ce533be8f93d2893d96d674bbeb7e30"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/kherge-abandoned/Version/zipball/f07cf83f8ce533be8f93d2893d96d674bbeb7e30",
-                "reference": "f07cf83f8ce533be8f93d2893d96d674bbeb7e30",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.3"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.0-dev"
-                }
-            },
-            "autoload": {
-                "psr-0": {
-                    "KevinGH\\Version": "src/lib/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Kevin Herrera",
-                    "email": "me@kevingh.com"
-                }
-            ],
-            "description": "A parsing and comparison library for semantic versioning.",
-            "homepage": "http://github.com/kherge/Version",
-            "abandoned": true,
-            "time": "2012-08-16T17:13:03+00:00"
-        },
-        {
-            "name": "monolog/monolog",
-            "version": "1.23.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/Seldaek/monolog.git",
-                "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd8c787753b3a2ad11bc60c063cff1358a32a3b4",
-                "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4",
-                "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|^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"
-            },
-            "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-06-19T01:22:40+00:00"
-        },
-        {
-            "name": "myclabs/deep-copy",
-            "version": "1.6.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/myclabs/DeepCopy.git",
-                "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/8e6e04167378abf1ddb4d3522d8755c5fd90d102",
-                "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.4.0"
-            },
-            "require-dev": {
-                "doctrine/collections": "1.*",
-                "phpunit/phpunit": "~4.1"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-4": {
-                    "DeepCopy\\": "src/DeepCopy/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "description": "Create deep copies (clones) of your objects",
-            "homepage": "https://github.com/myclabs/DeepCopy",
-            "keywords": [
-                "clone",
-                "copy",
-                "duplicate",
-                "object",
-                "object graph"
-            ],
-            "time": "2017-04-12T18:52:22+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": "pdepend/pdepend",
-            "version": "2.5.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/pdepend/pdepend.git",
-                "reference": "0c50874333149c0dad5a2877801aed148f2767ff"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/pdepend/pdepend/zipball/0c50874333149c0dad5a2877801aed148f2767ff",
-                "reference": "0c50874333149c0dad5a2877801aed148f2767ff",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.7",
-                "symfony/config": "^2.3.0|^3",
-                "symfony/dependency-injection": "^2.3.0|^3",
-                "symfony/filesystem": "^2.3.0|^3"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^4.4.0,<4.8",
-                "squizlabs/php_codesniffer": "^2.0.0"
-            },
-            "bin": [
-                "src/bin/pdepend"
-            ],
-            "type": "library",
-            "autoload": {
-                "psr-4": {
-                    "PDepend\\": "src/main/php/PDepend"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "description": "Official version of pdepend to be handled with Composer",
-            "time": "2017-01-19T14:23:36+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": "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"
-            },
-            "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/phpdocumentor",
-            "version": "v2.9.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/phpDocumentor/phpDocumentor2.git",
-                "reference": "be607da0eef9b9249c43c5b4820d25d631c73667"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/phpDocumentor/phpDocumentor2/zipball/be607da0eef9b9249c43c5b4820d25d631c73667",
-                "reference": "be607da0eef9b9249c43c5b4820d25d631c73667",
-                "shasum": ""
-            },
-            "require": {
-                "cilex/cilex": "~1.0",
-                "erusev/parsedown": "~1.0",
-                "herrera-io/phar-update": "1.0.3",
-                "jms/serializer": ">=0.12",
-                "monolog/monolog": "~1.6",
-                "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",
-                "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."
-            },
-            "bin": [
-                "bin/phpdoc.php",
-                "bin/phpdoc"
-            ],
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-develop": "2.9-dev"
-                }
-            },
-            "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"
-            ],
-            "time": "2016-05-22T09:50:56+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": "phploc/phploc",
-            "version": "3.0.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/phploc.git",
-                "reference": "74f917e6f80f291856989960d31afa44a4196859"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phploc/zipball/74f917e6f80f291856989960d31afa44a4196859",
-                "reference": "74f917e6f80f291856989960d31afa44a4196859",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.6",
-                "sebastian/finder-facade": "~1.1",
-                "sebastian/git": "~2.1",
-                "sebastian/version": "~1.0.3|~2.0",
-                "symfony/console": "~2.5|~3.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "~5"
-            },
-            "bin": [
-                "phploc"
-            ],
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.0-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": "A tool for quickly measuring the size of a PHP project.",
-            "homepage": "https://github.com/sebastianbergmann/phploc",
-            "time": "2016-04-25T08:11:21+00:00"
-        },
-        {
-            "name": "phpmd/phpmd",
-            "version": "2.6.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/phpmd/phpmd.git",
-                "reference": "4e9924b2c157a3eb64395460fcf56b31badc8374"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/phpmd/phpmd/zipball/4e9924b2c157a3eb64395460fcf56b31badc8374",
-                "reference": "4e9924b2c157a3eb64395460fcf56b31badc8374",
-                "shasum": ""
-            },
-            "require": {
-                "ext-xml": "*",
-                "pdepend/pdepend": "^2.5",
-                "php": ">=5.3.9"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^4.0",
-                "squizlabs/php_codesniffer": "^2.0"
-            },
-            "bin": [
-                "src/bin/phpmd"
-            ],
-            "type": "project",
-            "autoload": {
-                "psr-0": {
-                    "PHPMD\\": "src/main/php"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Manuel Pichler",
-                    "email": "github@manuel-pichler.de",
-                    "homepage": "https://github.com/manuelpichler",
-                    "role": "Project Founder"
-                },
-                {
-                    "name": "Other contributors",
-                    "homepage": "https://github.com/phpmd/phpmd/graphs/contributors",
-                    "role": "Contributors"
-                },
-                {
-                    "name": "Marc Würth",
-                    "email": "ravage@bluewin.ch",
-                    "homepage": "https://github.com/ravage84",
-                    "role": "Project Maintainer"
-                }
-            ],
-            "description": "PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD.",
-            "homepage": "http://phpmd.org/",
-            "keywords": [
-                "mess detection",
-                "mess detector",
-                "pdepend",
-                "phpmd",
-                "pmd"
-            ],
-            "time": "2017-01-20T14:41:10+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": "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": "4.0.8",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
-                "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d",
-                "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d",
-                "shasum": ""
-            },
-            "require": {
-                "ext-dom": "*",
-                "ext-xmlwriter": "*",
-                "php": "^5.6 || ^7.0",
-                "phpunit/php-file-iterator": "^1.3",
-                "phpunit/php-text-template": "^1.2",
-                "phpunit/php-token-stream": "^1.4.2 || ^2.0",
-                "sebastian/code-unit-reverse-lookup": "^1.0",
-                "sebastian/environment": "^1.3.2 || ^2.0",
-                "sebastian/version": "^1.0 || ^2.0"
-            },
-            "require-dev": {
-                "ext-xdebug": "^2.1.4",
-                "phpunit/phpunit": "^5.7"
-            },
-            "suggest": {
-                "ext-xdebug": "^2.5.1"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "4.0.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": "2017-04-02T07:44:40+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": "5.7.15",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/phpunit.git",
-                "reference": "b99112aecc01f62acf3d81a3f59646700a1849e5"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b99112aecc01f62acf3d81a3f59646700a1849e5",
-                "reference": "b99112aecc01f62acf3d81a3f59646700a1849e5",
-                "shasum": ""
-            },
-            "require": {
-                "ext-dom": "*",
-                "ext-json": "*",
-                "ext-libxml": "*",
-                "ext-mbstring": "*",
-                "ext-xml": "*",
-                "myclabs/deep-copy": "~1.3",
-                "php": "^5.6 || ^7.0",
-                "phpspec/prophecy": "^1.6.2",
-                "phpunit/php-code-coverage": "^4.0.4",
-                "phpunit/php-file-iterator": "~1.4",
-                "phpunit/php-text-template": "~1.2",
-                "phpunit/php-timer": "^1.0.6",
-                "phpunit/phpunit-mock-objects": "^3.2",
-                "sebastian/comparator": "^1.2.4",
-                "sebastian/diff": "~1.2",
-                "sebastian/environment": "^1.3.4 || ^2.0",
-                "sebastian/exporter": "~2.0",
-                "sebastian/global-state": "^1.1",
-                "sebastian/object-enumerator": "~2.0",
-                "sebastian/resource-operations": "~1.0",
-                "sebastian/version": "~1.0.3|~2.0",
-                "symfony/yaml": "~2.1|~3.0"
-            },
-            "conflict": {
-                "phpdocumentor/reflection-docblock": "3.0.2"
-            },
-            "require-dev": {
-                "ext-pdo": "*"
-            },
-            "suggest": {
-                "ext-xdebug": "*",
-                "phpunit/php-invoker": "~1.1"
-            },
-            "bin": [
-                "phpunit"
-            ],
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "5.7.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-03-02T15:22:43+00:00"
-        },
-        {
-            "name": "phpunit/phpunit-mock-objects",
-            "version": "3.4.4",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
-                "reference": "a23b761686d50a560cc56233b9ecf49597cc9118"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/a23b761686d50a560cc56233b9ecf49597cc9118",
-                "reference": "a23b761686d50a560cc56233b9ecf49597cc9118",
-                "shasum": ""
-            },
-            "require": {
-                "doctrine/instantiator": "^1.0.2",
-                "php": "^5.6 || ^7.0",
-                "phpunit/php-text-template": "^1.2",
-                "sebastian/exporter": "^1.2 || ^2.0"
-            },
-            "conflict": {
-                "phpunit/phpunit": "<5.4.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^5.4"
-            },
-            "suggest": {
-                "ext-soap": "*"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.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": "Mock Object library for PHPUnit",
-            "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
-            "keywords": [
-                "mock",
-                "xunit"
-            ],
-            "time": "2017-06-30T09:13:00+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": "sebastian/code-unit-reverse-lookup",
-            "version": "1.0.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
-                "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
-                "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.6 || ^7.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^5.7 || ^6.0"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.0.x-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de"
-                }
-            ],
-            "description": "Looks up which function or method a line of code belongs to",
-            "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
-            "time": "2017-03-04T06:30:41+00:00"
-        },
-        {
-            "name": "sebastian/comparator",
-            "version": "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.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/diff.git",
-                "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4",
-                "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4",
-                "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.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": "2017-05-22T07:24:03+00:00"
-        },
-        {
-            "name": "sebastian/environment",
-            "version": "2.0.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/environment.git",
-                "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
-                "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.6 || ^7.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^5.0"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.0.x-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de"
-                }
-            ],
-            "description": "Provides functionality to handle HHVM/PHP environments",
-            "homepage": "http://www.github.com/sebastianbergmann/environment",
-            "keywords": [
-                "Xdebug",
-                "environment",
-                "hhvm"
-            ],
-            "time": "2016-11-26T07:53:53+00:00"
-        },
-        {
-            "name": "sebastian/exporter",
-            "version": "2.0.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/exporter.git",
-                "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
-                "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.3",
-                "sebastian/recursion-context": "~2.0"
-            },
-            "require-dev": {
-                "ext-mbstring": "*",
-                "phpunit/phpunit": "~4.4"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.0.x-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "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-11-19T08:54:04+00:00"
-        },
-        {
-            "name": "sebastian/finder-facade",
-            "version": "1.2.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/finder-facade.git",
-                "reference": "2a6f7f57efc0aa2d23297d9fd9e2a03111a8c0b9"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/finder-facade/zipball/2a6f7f57efc0aa2d23297d9fd9e2a03111a8c0b9",
-                "reference": "2a6f7f57efc0aa2d23297d9fd9e2a03111a8c0b9",
-                "shasum": ""
-            },
-            "require": {
-                "symfony/finder": "~2.3|~3.0",
-                "theseer/fdomdocument": "~1.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": "FinderFacade is a convenience wrapper for Symfony's Finder component.",
-            "homepage": "https://github.com/sebastianbergmann/finder-facade",
-            "time": "2016-02-17T07:02:23+00:00"
-        },
-        {
-            "name": "sebastian/git",
-            "version": "2.1.4",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/git.git",
-                "reference": "815bbbc963cf35e5413df195aa29df58243ecd24"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/git/zipball/815bbbc963cf35e5413df195aa29df58243ecd24",
-                "reference": "815bbbc963cf35e5413df195aa29df58243ecd24",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.3"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.1-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de"
-                }
-            ],
-            "description": "Simple wrapper for Git",
-            "homepage": "http://www.github.com/sebastianbergmann/git",
-            "keywords": [
-                "git"
-            ],
-            "abandoned": true,
-            "time": "2017-01-23T20:57:12+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/object-enumerator",
-            "version": "2.0.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/object-enumerator.git",
-                "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7",
-                "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.6",
-                "sebastian/recursion-context": "~2.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "~5"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.0.x-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de"
-                }
-            ],
-            "description": "Traverses array structures and object graphs to enumerate all referenced objects",
-            "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
-            "time": "2017-02-18T15:18:39+00:00"
-        },
-        {
-            "name": "sebastian/phpcpd",
-            "version": "2.0.4",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/phpcpd.git",
-                "reference": "24d9a880deadb0b8c9680e9cfe78e30b704225db"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpcpd/zipball/24d9a880deadb0b8c9680e9cfe78e30b704225db",
-                "reference": "24d9a880deadb0b8c9680e9cfe78e30b704225db",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.3",
-                "phpunit/php-timer": ">=1.0.6",
-                "sebastian/finder-facade": "~1.1",
-                "sebastian/version": "~1.0|~2.0",
-                "symfony/console": "~2.7|^3.0",
-                "theseer/fdomdocument": "~1.4"
-            },
-            "bin": [
-                "phpcpd"
-            ],
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.0-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de",
-                    "role": "lead"
-                }
-            ],
-            "description": "Copy/Paste Detector (CPD) for PHP code.",
-            "homepage": "https://github.com/sebastianbergmann/phpcpd",
-            "time": "2016-04-17T19:32:49+00:00"
-        },
-        {
-            "name": "sebastian/recursion-context",
-            "version": "2.0.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/recursion-context.git",
-                "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a",
-                "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.3"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "~4.4"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.0.x-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "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-11-19T07:33:16+00:00"
-        },
-        {
-            "name": "sebastian/resource-operations",
-            "version": "1.0.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/resource-operations.git",
-                "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
-                "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.6.0"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.0.x-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de"
-                }
-            ],
-            "description": "Provides a list of PHP built-in functions that operate on resources",
-            "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
-            "time": "2015-07-28T20:34:47+00:00"
-        },
-        {
-            "name": "sebastian/version",
-            "version": "2.0.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/version.git",
-                "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
-                "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.6"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.0.x-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de",
-                    "role": "lead"
-                }
-            ],
-            "description": "Library that helps with managing the version number of Git-hosted PHP projects",
-            "homepage": "https://github.com/sebastianbergmann/version",
-            "time": "2016-10-03T07:35:21+00:00"
-        },
-        {
-            "name": "seld/jsonlint",
-            "version": "1.6.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/Seldaek/jsonlint.git",
-                "reference": "50d63f2858d87c4738d5b76a7dcbb99fa8cf7c77"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/50d63f2858d87c4738d5b76a7dcbb99fa8cf7c77",
-                "reference": "50d63f2858d87c4738d5b76a7dcbb99fa8cf7c77",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.3 || ^7.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^4.5"
-            },
-            "bin": [
-                "bin/jsonlint"
-            ],
-            "type": "library",
-            "autoload": {
-                "psr-4": {
-                    "Seld\\JsonLint\\": "src/Seld/JsonLint/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Jordi Boggiano",
-                    "email": "j.boggiano@seld.be",
-                    "homepage": "http://seld.be"
-                }
-            ],
-            "description": "JSON Linter",
-            "keywords": [
-                "json",
-                "linter",
-                "parser",
-                "validator"
-            ],
-            "time": "2017-06-18T15:11:04+00:00"
-        },
-        {
-            "name": "squizlabs/php_codesniffer",
-            "version": "2.8.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
-                "reference": "d7cf0d894e8aa4c73712ee4a331cc1eaa37cdc7d"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/d7cf0d894e8aa4c73712ee4a331cc1eaa37cdc7d",
-                "reference": "d7cf0d894e8aa4c73712ee4a331cc1eaa37cdc7d",
-                "shasum": ""
-            },
-            "require": {
-                "ext-simplexml": "*",
-                "ext-tokenizer": "*",
-                "ext-xmlwriter": "*",
-                "php": ">=5.1.2"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "~4.0"
-            },
-            "bin": [
-                "scripts/phpcs",
-                "scripts/phpcbf"
-            ],
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.x-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "CodeSniffer.php",
-                    "CodeSniffer/CLI.php",
-                    "CodeSniffer/Exception.php",
-                    "CodeSniffer/File.php",
-                    "CodeSniffer/Fixer.php",
-                    "CodeSniffer/Report.php",
-                    "CodeSniffer/Reporting.php",
-                    "CodeSniffer/Sniff.php",
-                    "CodeSniffer/Tokens.php",
-                    "CodeSniffer/Reports/",
-                    "CodeSniffer/Tokenizers/",
-                    "CodeSniffer/DocGenerators/",
-                    "CodeSniffer/Standards/AbstractPatternSniff.php",
-                    "CodeSniffer/Standards/AbstractScopeSniff.php",
-                    "CodeSniffer/Standards/AbstractVariableSniff.php",
-                    "CodeSniffer/Standards/IncorrectPatternException.php",
-                    "CodeSniffer/Standards/Generic/Sniffs/",
-                    "CodeSniffer/Standards/MySource/Sniffs/",
-                    "CodeSniffer/Standards/PEAR/Sniffs/",
-                    "CodeSniffer/Standards/PSR1/Sniffs/",
-                    "CodeSniffer/Standards/PSR2/Sniffs/",
-                    "CodeSniffer/Standards/Squiz/Sniffs/",
-                    "CodeSniffer/Standards/Zend/Sniffs/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Greg Sherwood",
-                    "role": "lead"
-                }
-            ],
-            "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
-            "homepage": "http://www.squizlabs.com/php-codesniffer",
-            "keywords": [
-                "phpcs",
-                "standards"
-            ],
-            "time": "2017-03-01T22:17:45+00:00"
-        },
-        {
-            "name": "symfony/config",
-            "version": "v2.8.25",
-            "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.25",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/symfony/console.git",
-                "reference": "46e65f8d98c9ab629bbfcc16a4ff023f61c37fb2"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/symfony/console/zipball/46e65f8d98c9ab629bbfcc16a4ff023f61c37fb2",
-                "reference": "46e65f8d98c9ab629bbfcc16a4ff023f61c37fb2",
-                "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-07-03T08:04:30+00:00"
-        },
-        {
-            "name": "symfony/css-selector",
-            "version": "v3.3.5",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/symfony/css-selector.git",
-                "reference": "4d882dced7b995d5274293039370148e291808f2"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/symfony/css-selector/zipball/4d882dced7b995d5274293039370148e291808f2",
-                "reference": "4d882dced7b995d5274293039370148e291808f2",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.5.9"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.3-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Symfony\\Component\\CssSelector\\": ""
-                },
-                "exclude-from-classmap": [
-                    "/Tests/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Jean-François Simon",
-                    "email": "jeanfrancois.simon@sensiolabs.com"
-                },
-                {
-                    "name": "Fabien Potencier",
-                    "email": "fabien@symfony.com"
-                },
-                {
-                    "name": "Symfony Community",
-                    "homepage": "https://symfony.com/contributors"
-                }
-            ],
-            "description": "Symfony CssSelector Component",
-            "homepage": "https://symfony.com",
-            "time": "2017-05-01T15:01:29+00:00"
-        },
-        {
-            "name": "symfony/debug",
-            "version": "v3.0.9",
-            "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"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.0-dev"
-                }
-            },
-            "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",
-            "time": "2016-07-30T07:22:48+00:00"
-        },
-        {
-            "name": "symfony/dependency-injection",
-            "version": "v3.2.12",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/symfony/dependency-injection.git",
-                "reference": "c1170b063674f000b154a5809bb9e373a773d4c0"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/c1170b063674f000b154a5809bb9e373a773d4c0",
-                "reference": "c1170b063674f000b154a5809bb9e373a773d4c0",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.5.9"
-            },
-            "conflict": {
-                "symfony/yaml": "<3.2"
-            },
-            "require-dev": {
-                "symfony/config": "~2.8|~3.0",
-                "symfony/expression-language": "~2.8|~3.0",
-                "symfony/yaml": "~3.2"
-            },
-            "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": "3.2-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Symfony\\Component\\DependencyInjection\\": ""
-                },
-                "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 DependencyInjection Component",
-            "homepage": "https://symfony.com",
-            "time": "2017-07-17T14:04:01+00:00"
-        },
-        {
-            "name": "symfony/event-dispatcher",
-            "version": "v2.8.25",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/symfony/event-dispatcher.git",
-                "reference": "1377400fd641d7d1935981546aaef780ecd5bf6d"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/1377400fd641d7d1935981546aaef780ecd5bf6d",
-                "reference": "1377400fd641d7d1935981546aaef780ecd5bf6d",
-                "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-06-02T07:47:27+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.25",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/symfony/finder.git",
-                "reference": "4f4e84811004e065a3bb5ceeb1d9aa592630f9ad"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/symfony/finder/zipball/4f4e84811004e065a3bb5ceeb1d9aa592630f9ad",
-                "reference": "4f4e84811004e065a3bb5ceeb1d9aa592630f9ad",
-                "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-06-01T20:52:29+00:00"
-        },
-        {
-            "name": "symfony/polyfill-mbstring",
-            "version": "v1.4.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/symfony/polyfill-mbstring.git",
-                "reference": "f29dca382a6485c3cbe6379f0c61230167681937"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/f29dca382a6485c3cbe6379f0c61230167681937",
-                "reference": "f29dca382a6485c3cbe6379f0c61230167681937",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.3"
-            },
-            "suggest": {
-                "ext-mbstring": "For best performance"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.4-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": "2017-06-09T14:24:12+00:00"
-        },
-        {
-            "name": "symfony/process",
-            "version": "v2.8.25",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/symfony/process.git",
-                "reference": "57e52a0a6a80ea0aec4fc1b785a7920a95cb88a8"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/symfony/process/zipball/57e52a0a6a80ea0aec4fc1b785a7920a95cb88a8",
-                "reference": "57e52a0a6a80ea0aec4fc1b785a7920a95cb88a8",
-                "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-07-03T08:04:30+00:00"
-        },
-        {
-            "name": "symfony/stopwatch",
-            "version": "v2.8.25",
-            "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": "v3.0.9",
-            "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": ""
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.0-dev"
-                }
-            },
-            "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",
-            "time": "2016-07-30T07:22:48+00:00"
-        },
-        {
-            "name": "symfony/validator",
-            "version": "v2.8.25",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/symfony/validator.git",
-                "reference": "6c019627f2a69b9ab2ac41fd53102148a55af564"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/symfony/validator/zipball/6c019627f2a69b9ab2ac41fd53102148a55af564",
-                "reference": "6c019627f2a69b9ab2ac41fd53102148a55af564",
-                "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-07-03T08:04:30+00:00"
-        },
-        {
-            "name": "theseer/fdomdocument",
-            "version": "1.6.6",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/theseer/fDOMDocument.git",
-                "reference": "6e8203e40a32a9c770bcb62fe37e68b948da6dca"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/theseer/fDOMDocument/zipball/6e8203e40a32a9c770bcb62fe37e68b948da6dca",
-                "reference": "6e8203e40a32a9c770bcb62fe37e68b948da6dca",
-                "shasum": ""
-            },
-            "require": {
-                "ext-dom": "*",
-                "lib-libxml": "*",
-                "php": ">=5.3.3"
-            },
-            "type": "library",
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Arne Blankerts",
-                    "email": "arne@blankerts.de",
-                    "role": "lead"
-                }
-            ],
-            "description": "The classes contained within this repository extend the standard DOM to use exceptions at all occasions of errors instead of PHP warnings or notices. They also add various custom methods and shortcuts for convenience and to simplify the usage of DOM.",
-            "homepage": "https://github.com/theseer/fDOMDocument",
-            "time": "2017-06-30T11:53:12+00:00"
-        },
-        {
-            "name": "twig/twig",
-            "version": "v1.27.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/twigphp/Twig.git",
-                "reference": "3c6c0033fd3b5679c6e1cb60f4f9766c2b424d97"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/twigphp/Twig/zipball/3c6c0033fd3b5679c6e1cb60f4f9766c2b424d97",
-                "reference": "3c6c0033fd3b5679c6e1cb60f4f9766c2b424d97",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.2.7"
-            },
-            "require-dev": {
-                "symfony/debug": "~2.7",
-                "symfony/phpunit-bridge": "~2.7"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.27-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": "2016-10-25T19:17:17+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"
-        }
-    ],
-    "aliases": [],
-    "minimum-stability": "stable",
-    "stability-flags": {
-        "ahand/mobileesp": 20,
-        "pear/validate_ispn": 20
-    },
-    "prefer-stable": false,
-    "prefer-lowest": false,
-    "platform": {
-        "php": ">=5.6"
-    },
-    "platform-dev": []
-}
diff --git a/module/finc/config/module.config.php b/module/finc/config/module.config.php
index 4c071f3962def87920607b82452a83f388a91fec..535795b490fc47f99aa29e7bb1026895f9cecbde 100644
--- a/module/finc/config/module.config.php
+++ b/module/finc/config/module.config.php
@@ -18,10 +18,8 @@ $config = [
         'factories' => [
             'record' => 'finc\Controller\Factory::getRecordController',
             'dds' => 'finc\Controller\Factory::getDocumentDeliveryServiceController',
-        ],
-        'invokables' => [
-            'ajax' => 'finc\Controller\AjaxController',
-            'my-research' => 'finc\Controller\MyResearchController'
+            'ajax' => 'finc\Controller\Factory::getAjaxController',
+            'my-research' => 'finc\Controller\Factory::getMyResearchController',
         ],
     ],
     'controller_plugins' => [
diff --git a/module/finc/src/finc/Controller/Factory.php b/module/finc/src/finc/Controller/Factory.php
index 49bf39a6b8969957e38b3f68f3417701175474e1..e1c53af2e72a14f61ef111b33dc61b95d4aeca60 100644
--- a/module/finc/src/finc/Controller/Factory.php
+++ b/module/finc/src/finc/Controller/Factory.php
@@ -26,8 +26,11 @@
  * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
  * @link     https://vufind.org/wiki/development Wiki
  */
+
 namespace finc\Controller;
-use Zend\ServiceManager\ServiceManager;
+
+use Zend\ServiceManager\ServiceManager,
+    VuFind\Controller\Factory as FactoryBase;
 
 /**
  * Factory for various top-level VuFind services.
@@ -41,22 +44,18 @@ use Zend\ServiceManager\ServiceManager;
  *
  * @codeCoverageIgnore
  */
-class Factory
+class Factory extends FactoryBase
 {
-    /**
-     * Construct the RecordController.
-     *
-     * @param ServiceManager $sm Service manager.
-     *
-     * @return RecordController
-     */
-    public static function getRecordController(ServiceManager $sm)
+    public static function getGenericController($name, ServiceManager $sm)
     {
-        return new RecordController(
-            $sm->getServiceLocator()->get('VuFind\Config')->get('config')
-        );
+        $class = (strpos($name, '\\') === false)
+            ? static::getNamespace() . '\\' . $name : $name;
+        if (!class_exists($class)) {
+            throw new \Exception('Cannot construct ' . $class);
+        }
+        return new $class($sm->getServiceLocator());
     }
-    
+
     /**
      * Construct the DocumentDeliveryServiceController.
      *
@@ -64,7 +63,9 @@ class Factory
      *
      * @return DocumentDeliveryServiceController
      */
-    public static function getDocumentDeliveryServiceController(ServiceManager $sm)
+    public static function getDocumentDeliveryServiceController(
+        ServiceManager $sm
+    )
     {
         $container = new \Zend\Session\Container(
             'DDS', $sm->getServiceLocator()->get('VuFind\SessionManager')
@@ -75,6 +76,12 @@ class Factory
             $container
         );
     }
-    
-    
+
+    private static function getNamespace()
+    {
+        return substr(
+            static::class, 0,
+            strrpos(static::class, '\\')
+        );
+    }
 }
\ No newline at end of file
diff --git a/module/finc/src/finc/Controller/RecordController.php b/module/finc/src/finc/Controller/RecordController.php
index 1907a2de4d774895763c914edd993faea227b600..c682e76482a3dd4ef2f63e01c7cceda0cd06d0da 100644
--- a/module/finc/src/finc/Controller/RecordController.php
+++ b/module/finc/src/finc/Controller/RecordController.php
@@ -49,17 +49,6 @@ class RecordController extends \VuFind\Controller\RecordController implements
     use CustomTraits\PdaTrait;
     use CustomTraits\EmailProfileTrait;
 
-    /**
-     * Constructor
-     *
-     * @param \Zend\Config\Config $config VuFind configuration
-     */
-    public function __construct(\Zend\Config\Config $config)
-    {
-        // Call standard record controller initialization:
-        parent::__construct($config);
-    }
-
     /**
      * Returns rewrite object
      *
diff --git a/module/finc/src/finc/RecordDriver/SolrDefault.php b/module/finc/src/finc/RecordDriver/SolrDefault.php
index 2d76e76412e32ed12fb4c2b9811f5c61589a1fc4..cc5ec8d325953ffb6b8ac9ffeb2c114537256639 100644
--- a/module/finc/src/finc/RecordDriver/SolrDefault.php
+++ b/module/finc/src/finc/RecordDriver/SolrDefault.php
@@ -96,4 +96,31 @@ class SolrDefault extends \VuFind\RecordDriver\SolrDefault implements
         }
         return null;
     }
+
+    /**
+     * Helper function to restructure author arrays including relators
+     *
+     * @param array $authors Array of authors
+     * @param array $roles   Array with relators of authors
+     *
+     * @return array
+     */
+    protected function getAuthorRolesArray($authors = [], $roles = [])
+    {
+        $authorRolesArray = [];
+
+        if (!empty($authors)) {
+            foreach ($authors as $index => $author) {
+                if (!isset($authorRolesArray[$author])) {
+                    $authorRolesArray[$author] = [];
+                }
+                if (isset($roles[$index]) && !empty($roles[$index])
+                ) {
+                    $authorRolesArray[$author][] = $roles[$index];
+                }
+            }
+        }
+
+        return $authorRolesArray;
+    }
 }
diff --git a/vendor/bin/generate_vcards b/vendor/bin/generate_vcards
new file mode 120000
index 0000000000000000000000000000000000000000..cb76da13a1b2f677ac4c3ac186a3417767798c34
--- /dev/null
+++ b/vendor/bin/generate_vcards
@@ -0,0 +1 @@
+../sabre/vobject/bin/generate_vcards
\ No newline at end of file
diff --git a/vendor/bin/vobject b/vendor/bin/vobject
new file mode 120000
index 0000000000000000000000000000000000000000..f5b111eacd6a7c71d6c0953e6bc305d25d8d65fa
--- /dev/null
+++ b/vendor/bin/vobject
@@ -0,0 +1 @@
+../sabre/vobject/bin/vobject
\ No newline at end of file
diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php
index 08502c333362e218fd410cd6988edebe1cd4a722..aa458b43d8e43ee8bebe12f248b926772b9870b0 100644
--- a/vendor/composer/autoload_files.php
+++ b/vendor/composer/autoload_files.php
@@ -12,4 +12,5 @@ return array(
     'fe1bcd0336136e435eaf197895daf81a' => $vendorDir . '/nikic/php-parser/lib/bootstrap.php',
     '742b7e606e92b28dd726e835467f413a' => $vendorDir . '/herrera-io/json/src/lib/json_version.php',
     'f0e9d233388e461ee3c460665eb265f0' => $vendorDir . '/herrera-io/phar-update/src/lib/constants.php',
+    '6124b4c8570aa390c21fafd04a26c69f' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php',
 );
diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php
index 1983ae7ba665b3728254ceecfab50f0132c1d721..07859531189539fa08983b4e57648b997ffae1aa 100644
--- a/vendor/composer/autoload_psr4.php
+++ b/vendor/composer/autoload_psr4.php
@@ -64,6 +64,7 @@ return array(
     'Symfony\\Component\\Config\\' => array($vendorDir . '/symfony/config'),
     'Symfony\\CS\\' => array($vendorDir . '/friendsofphp/php-cs-fixer/Symfony/CS'),
     'Seld\\JsonLint\\' => array($vendorDir . '/seld/jsonlint/src/Seld/JsonLint'),
+    'Sabre\\VObject\\' => array($vendorDir . '/sabre/vobject/lib'),
     'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
     'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
     'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index ebf741a2803f8fc11ba83ab3fc37db529714bac9..77c905cd2e2ab76482bbc801d2a8375e0c59cae2 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -13,6 +13,7 @@ class ComposerStaticInit08c3df1f8e0a68efe6e746ad882c7074
         'fe1bcd0336136e435eaf197895daf81a' => __DIR__ . '/..' . '/nikic/php-parser/lib/bootstrap.php',
         '742b7e606e92b28dd726e835467f413a' => __DIR__ . '/..' . '/herrera-io/json/src/lib/json_version.php',
         'f0e9d233388e461ee3c460665eb265f0' => __DIR__ . '/..' . '/herrera-io/phar-update/src/lib/constants.php',
+        '6124b4c8570aa390c21fafd04a26c69f' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php',
     );
 
     public static $prefixLengthsPsr4 = array (
@@ -85,6 +86,7 @@ class ComposerStaticInit08c3df1f8e0a68efe6e746ad882c7074
             'Symfony\\Component\\Config\\' => 25,
             'Symfony\\CS\\' => 11,
             'Seld\\JsonLint\\' => 14,
+            'Sabre\\VObject\\' => 14,
         ),
         'P' => 
         array (
@@ -353,6 +355,10 @@ class ComposerStaticInit08c3df1f8e0a68efe6e746ad882c7074
         array (
             0 => __DIR__ . '/..' . '/seld/jsonlint/src/Seld/JsonLint',
         ),
+        'Sabre\\VObject\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/sabre/vobject/lib',
+        ),
         'Psr\\Log\\' => 
         array (
             0 => __DIR__ . '/..' . '/psr/log/Psr/Log',
diff --git a/vendor/composer/include_paths.php b/vendor/composer/include_paths.php
index 6019b802f1cae0bf03def779d8c397cb1206eab6..08fd00d4cee2af0c4fe0002ee041d13babf52a3e 100644
--- a/vendor/composer/include_paths.php
+++ b/vendor/composer/include_paths.php
@@ -15,4 +15,5 @@ return array(
     $vendorDir . '/pear/validate',
     $vendorDir . '/pear/validate_ispn',
     $vendorDir . '/phing/phing/classes',
+    $vendorDir . '/pear/net_url2',
 );
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index 4cfd636c667ae992ed3178d6e436d522b4683bf5..1182357ae24a34ed3f71b4ef25b068c8d1663ffb 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -144,12 +144,12 @@
         "version_normalized": "1.3.5.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/Jasig/phpCAS.git",
+            "url": "https://github.com/apereo/phpCAS.git",
             "reference": "61c8899c8f91204e8b9135d795461e50fe5c2db0"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/Jasig/phpCAS/zipball/61c8899c8f91204e8b9135d795461e50fe5c2db0",
+            "url": "https://api.github.com/repos/apereo/phpCAS/zipball/61c8899c8f91204e8b9135d795461e50fe5c2db0",
             "reference": "61c8899c8f91204e8b9135d795461e50fe5c2db0",
             "shasum": ""
         },
@@ -815,69 +815,6 @@
         ],
         "description": "Supports the MAchine Readable Cataloging (MARC) file format documented at http://loc.gov/marc/"
     },
-    {
-        "name": "pear/net_url2",
-        "version": "v2.2.1",
-        "version_normalized": "2.2.1.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/pear/Net_URL2.git",
-            "reference": "43a87606daf52efe6685c92131be083143108e37"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/pear/Net_URL2/zipball/43a87606daf52efe6685c92131be083143108e37",
-            "reference": "43a87606daf52efe6685c92131be083143108e37",
-            "shasum": ""
-        },
-        "require": {
-            "php": ">=5.1.4"
-        },
-        "require-dev": {
-            "phpunit/phpunit": ">=3.3.0"
-        },
-        "time": "2016-04-18T22:24:01+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "2.2.x-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "classmap": [
-                "Net/URL2.php"
-            ]
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "BSD-3-Clause"
-        ],
-        "authors": [
-            {
-                "name": "David Coallier",
-                "email": "davidc@php.net"
-            },
-            {
-                "name": "Tom Klingenberg",
-                "email": "tkli@php.net"
-            },
-            {
-                "name": "Christian Schmidt",
-                "email": "chmidt@php.net"
-            }
-        ],
-        "description": "Class for parsing and handling URL. Provides parsing of URLs into their constituent parts (scheme, host, path etc.), URL generation, and resolving of relative URLs.",
-        "homepage": "https://github.com/pear/Net_URL2",
-        "keywords": [
-            "PEAR",
-            "net",
-            "networking",
-            "rfc3986",
-            "uri",
-            "url"
-        ]
-    },
     {
         "name": "pear/http_request2",
         "version": "v2.3.0",
@@ -2009,56 +1946,6 @@
         ],
         "description": "PDO userspace driver proxying calls to PHP OCI8 driver"
     },
-    {
-        "name": "paragonie/random_compat",
-        "version": "v2.0.10",
-        "version_normalized": "2.0.10.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/paragonie/random_compat.git",
-            "reference": "634bae8e911eefa89c1abfbf1b66da679ac8f54d"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/paragonie/random_compat/zipball/634bae8e911eefa89c1abfbf1b66da679ac8f54d",
-            "reference": "634bae8e911eefa89c1abfbf1b66da679ac8f54d",
-            "shasum": ""
-        },
-        "require": {
-            "php": ">=5.2.0"
-        },
-        "require-dev": {
-            "phpunit/phpunit": "4.*|5.*"
-        },
-        "suggest": {
-            "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
-        },
-        "time": "2017-03-13T16:27:32+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "files": [
-                "lib/random.php"
-            ]
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Paragon Initiative Enterprises",
-                "email": "security@paragonie.com",
-                "homepage": "https://paragonie.com"
-            }
-        ],
-        "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
-        "keywords": [
-            "csprng",
-            "pseudorandom",
-            "random"
-        ]
-    },
     {
         "name": "zendframework/zend-math",
         "version": "3.0.0",
@@ -2401,63 +2288,6 @@
             "zf2"
         ]
     },
-    {
-        "name": "zendframework/zend-inputfilter",
-        "version": "2.7.4",
-        "version_normalized": "2.7.4.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/zendframework/zend-inputfilter.git",
-            "reference": "699ab4916e0aa73104e1f9ff068ef6d33c5f5fe4"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/zendframework/zend-inputfilter/zipball/699ab4916e0aa73104e1f9ff068ef6d33c5f5fe4",
-            "reference": "699ab4916e0aa73104e1f9ff068ef6d33c5f5fe4",
-            "shasum": ""
-        },
-        "require": {
-            "php": "^7.0 || ^5.6",
-            "zendframework/zend-filter": "^2.6",
-            "zendframework/zend-stdlib": "^2.7 || ^3.0",
-            "zendframework/zend-validator": "^2.6"
-        },
-        "require-dev": {
-            "phpunit/phpunit": "^6.0.8 || ^5.7.15",
-            "zendframework/zend-coding-standard": "~1.0.0",
-            "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3"
-        },
-        "suggest": {
-            "zendframework/zend-servicemanager": "To support plugin manager support"
-        },
-        "time": "2017-05-18T14:20:56+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "2.7-dev",
-                "dev-develop": "2.8-dev"
-            },
-            "zf": {
-                "component": "Zend\\InputFilter",
-                "config-provider": "Zend\\InputFilter\\ConfigProvider"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Zend\\InputFilter\\": "src/"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "BSD-3-Clause"
-        ],
-        "homepage": "https://github.com/zendframework/zend-inputfilter",
-        "keywords": [
-            "inputfilter",
-            "zf2"
-        ]
-    },
     {
         "name": "zendframework/zend-form",
         "version": "2.10.2",
@@ -3065,60 +2895,6 @@
             "response"
         ]
     },
-    {
-        "name": "zendframework/zend-diactoros",
-        "version": "1.4.0",
-        "version_normalized": "1.4.0.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/zendframework/zend-diactoros.git",
-            "reference": "b03f285a333f51e58c95cce54109a4a9ed691436"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/b03f285a333f51e58c95cce54109a4a9ed691436",
-            "reference": "b03f285a333f51e58c95cce54109a4a9ed691436",
-            "shasum": ""
-        },
-        "require": {
-            "php": "^5.4 || ^7.0",
-            "psr/http-message": "~1.0"
-        },
-        "provide": {
-            "psr/http-message-implementation": "1.0"
-        },
-        "require-dev": {
-            "ext-dom": "*",
-            "ext-libxml": "*",
-            "phpunit/phpunit": "^4.6 || ^5.5",
-            "zendframework/zend-coding-standard": "~1.0.0"
-        },
-        "time": "2017-04-06T16:18:34+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.4-dev",
-                "dev-develop": "1.5-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Zend\\Diactoros\\": "src/"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "BSD-2-Clause"
-        ],
-        "description": "PSR HTTP Message implementations",
-        "homepage": "https://github.com/zendframework/zend-diactoros",
-        "keywords": [
-            "http",
-            "psr",
-            "psr-7"
-        ]
-    },
     {
         "name": "zendframework/zend-psr7bridge",
         "version": "0.2.2",
@@ -4074,61 +3850,6 @@
             "webtest"
         ]
     },
-    {
-        "name": "symfony/css-selector",
-        "version": "v3.3.5",
-        "version_normalized": "3.3.5.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/symfony/css-selector.git",
-            "reference": "4d882dced7b995d5274293039370148e291808f2"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/symfony/css-selector/zipball/4d882dced7b995d5274293039370148e291808f2",
-            "reference": "4d882dced7b995d5274293039370148e291808f2",
-            "shasum": ""
-        },
-        "require": {
-            "php": ">=5.5.9"
-        },
-        "time": "2017-05-01T15:01:29+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "3.3-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Symfony\\Component\\CssSelector\\": ""
-            },
-            "exclude-from-classmap": [
-                "/Tests/"
-            ]
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Jean-François Simon",
-                "email": "jeanfrancois.simon@sensiolabs.com"
-            },
-            {
-                "name": "Fabien Potencier",
-                "email": "fabien@symfony.com"
-            },
-            {
-                "name": "Symfony Community",
-                "homepage": "https://symfony.com/contributors"
-            }
-        ],
-        "description": "Symfony CssSelector Component",
-        "homepage": "https://symfony.com"
-    },
     {
         "name": "behat/mink",
         "version": "v1.7.1",
@@ -4253,74 +3974,13 @@
         ]
     },
     {
-        "name": "symfony/polyfill-mbstring",
-        "version": "v1.4.0",
-        "version_normalized": "1.4.0.0",
+        "name": "symfony/debug",
+        "version": "v3.0.9",
+        "version_normalized": "3.0.9.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/polyfill-mbstring.git",
-            "reference": "f29dca382a6485c3cbe6379f0c61230167681937"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/f29dca382a6485c3cbe6379f0c61230167681937",
-            "reference": "f29dca382a6485c3cbe6379f0c61230167681937",
-            "shasum": ""
-        },
-        "require": {
-            "php": ">=5.3.3"
-        },
-        "suggest": {
-            "ext-mbstring": "For best performance"
-        },
-        "time": "2017-06-09T14:24:12+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.4-dev"
-            }
-        },
-        "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"
-        ]
-    },
-    {
-        "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"
+            "url": "https://github.com/symfony/debug.git",
+            "reference": "697c527acd9ea1b2d3efac34d9806bf255278b0a"
         },
         "dist": {
             "type": "zip",
@@ -4372,69 +4032,6 @@
         "description": "Symfony Debug Component",
         "homepage": "https://symfony.com"
     },
-    {
-        "name": "symfony/console",
-        "version": "v2.8.25",
-        "version_normalized": "2.8.25.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/symfony/console.git",
-            "reference": "46e65f8d98c9ab629bbfcc16a4ff023f61c37fb2"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/symfony/console/zipball/46e65f8d98c9ab629bbfcc16a4ff023f61c37fb2",
-            "reference": "46e65f8d98c9ab629bbfcc16a4ff023f61c37fb2",
-            "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": ""
-        },
-        "time": "2017-07-03T08:04:30+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": "pimple/pimple",
         "version": "v1.1.1",
@@ -4671,34 +4268,34 @@
         ]
     },
     {
-        "name": "symfony/stopwatch",
-        "version": "v2.8.25",
-        "version_normalized": "2.8.25.0",
+        "name": "symfony/filesystem",
+        "version": "v3.0.9",
+        "version_normalized": "3.0.9.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/stopwatch.git",
-            "reference": "e02577b841394a78306d7b547701bb7bb705bad5"
+            "url": "https://github.com/symfony/filesystem.git",
+            "reference": "b2da5009d9bacbd91d83486aa1f44c793a8c380d"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/stopwatch/zipball/e02577b841394a78306d7b547701bb7bb705bad5",
-            "reference": "e02577b841394a78306d7b547701bb7bb705bad5",
+            "url": "https://api.github.com/repos/symfony/filesystem/zipball/b2da5009d9bacbd91d83486aa1f44c793a8c380d",
+            "reference": "b2da5009d9bacbd91d83486aa1f44c793a8c380d",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.9"
+            "php": ">=5.5.9"
         },
-        "time": "2017-04-12T14:07:15+00:00",
+        "time": "2016-07-20T05:43:46+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "2.8-dev"
+                "dev-master": "3.0-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "Symfony\\Component\\Stopwatch\\": ""
+                "Symfony\\Component\\Filesystem\\": ""
             },
             "exclude-from-classmap": [
                 "/Tests/"
@@ -4718,93 +4315,106 @@
                 "homepage": "https://symfony.com/contributors"
             }
         ],
-        "description": "Symfony Stopwatch Component",
+        "description": "Symfony Filesystem Component",
         "homepage": "https://symfony.com"
     },
     {
-        "name": "symfony/process",
-        "version": "v2.8.25",
-        "version_normalized": "2.8.25.0",
+        "name": "sebastian/diff",
+        "version": "1.4.3",
+        "version_normalized": "1.4.3.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/process.git",
-            "reference": "57e52a0a6a80ea0aec4fc1b785a7920a95cb88a8"
+            "url": "https://github.com/sebastianbergmann/diff.git",
+            "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/process/zipball/57e52a0a6a80ea0aec4fc1b785a7920a95cb88a8",
-            "reference": "57e52a0a6a80ea0aec4fc1b785a7920a95cb88a8",
+            "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4",
+            "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.9"
+            "php": "^5.3.3 || ^7.0"
+        },
+        "require-dev": {
+            "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
         },
-        "time": "2017-07-03T08:04:30+00:00",
+        "time": "2017-05-22T07:24:03+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "2.8-dev"
+                "dev-master": "1.4-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
-            "psr-4": {
-                "Symfony\\Component\\Process\\": ""
-            },
-            "exclude-from-classmap": [
-                "/Tests/"
+            "classmap": [
+                "src/"
             ]
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
-            "MIT"
+            "BSD-3-Clause"
         ],
         "authors": [
             {
-                "name": "Fabien Potencier",
-                "email": "fabien@symfony.com"
+                "name": "Kore Nordmann",
+                "email": "mail@kore-nordmann.de"
             },
             {
-                "name": "Symfony Community",
-                "homepage": "https://symfony.com/contributors"
+                "name": "Sebastian Bergmann",
+                "email": "sebastian@phpunit.de"
             }
         ],
-        "description": "Symfony Process Component",
-        "homepage": "https://symfony.com"
+        "description": "Diff implementation",
+        "homepage": "https://github.com/sebastianbergmann/diff",
+        "keywords": [
+            "diff"
+        ]
     },
     {
-        "name": "symfony/finder",
-        "version": "v2.8.25",
-        "version_normalized": "2.8.25.0",
+        "name": "friendsofphp/php-cs-fixer",
+        "version": "v1.11.6",
+        "version_normalized": "1.11.6.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/finder.git",
-            "reference": "4f4e84811004e065a3bb5ceeb1d9aa592630f9ad"
+            "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git",
+            "reference": "41dc93abd2937a85a3889e28765231d574d2bac8"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/finder/zipball/4f4e84811004e065a3bb5ceeb1d9aa592630f9ad",
-            "reference": "4f4e84811004e065a3bb5ceeb1d9aa592630f9ad",
+            "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/41dc93abd2937a85a3889e28765231d574d2bac8",
+            "reference": "41dc93abd2937a85a3889e28765231d574d2bac8",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.9"
+            "ext-tokenizer": "*",
+            "php": ">=5.3.6",
+            "sebastian/diff": "~1.1",
+            "symfony/console": "~2.3|~3.0",
+            "symfony/event-dispatcher": "~2.1|~3.0",
+            "symfony/filesystem": "~2.1|~3.0",
+            "symfony/finder": "~2.1|~3.0",
+            "symfony/process": "~2.3|~3.0",
+            "symfony/stopwatch": "~2.5|~3.0"
         },
-        "time": "2017-06-01T20:52:29+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "2.8-dev"
-            }
+        "conflict": {
+            "hhvm": "<3.9"
+        },
+        "require-dev": {
+            "phpunit/phpunit": "^4.5|^5",
+            "satooshi/php-coveralls": "^0.7.1"
         },
+        "time": "2016-07-22T06:46:28+00:00",
+        "bin": [
+            "php-cs-fixer"
+        ],
+        "type": "application",
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "Symfony\\Component\\Finder\\": ""
-            },
-            "exclude-from-classmap": [
-                "/Tests/"
-            ]
+                "Symfony\\CS\\": "Symfony/CS/"
+            }
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
@@ -4812,270 +4422,42 @@
         ],
         "authors": [
             {
-                "name": "Fabien Potencier",
-                "email": "fabien@symfony.com"
+                "name": "Dariusz Rumiński",
+                "email": "dariusz.ruminski@gmail.com"
             },
             {
-                "name": "Symfony Community",
-                "homepage": "https://symfony.com/contributors"
+                "name": "Fabien Potencier",
+                "email": "fabien@symfony.com"
             }
         ],
-        "description": "Symfony Finder Component",
-        "homepage": "https://symfony.com"
+        "description": "A tool to automatically fix PHP code style"
     },
     {
-        "name": "symfony/filesystem",
-        "version": "v3.0.9",
-        "version_normalized": "3.0.9.0",
+        "name": "seld/jsonlint",
+        "version": "1.6.1",
+        "version_normalized": "1.6.1.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/filesystem.git",
-            "reference": "b2da5009d9bacbd91d83486aa1f44c793a8c380d"
+            "url": "https://github.com/Seldaek/jsonlint.git",
+            "reference": "50d63f2858d87c4738d5b76a7dcbb99fa8cf7c77"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/filesystem/zipball/b2da5009d9bacbd91d83486aa1f44c793a8c380d",
-            "reference": "b2da5009d9bacbd91d83486aa1f44c793a8c380d",
+            "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/50d63f2858d87c4738d5b76a7dcbb99fa8cf7c77",
+            "reference": "50d63f2858d87c4738d5b76a7dcbb99fa8cf7c77",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.5.9"
+            "php": "^5.3 || ^7.0"
         },
-        "time": "2016-07-20T05:43:46+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "3.0-dev"
-            }
+        "require-dev": {
+            "phpunit/phpunit": "^4.5"
         },
-        "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/event-dispatcher",
-        "version": "v2.8.25",
-        "version_normalized": "2.8.25.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/symfony/event-dispatcher.git",
-            "reference": "1377400fd641d7d1935981546aaef780ecd5bf6d"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/1377400fd641d7d1935981546aaef780ecd5bf6d",
-            "reference": "1377400fd641d7d1935981546aaef780ecd5bf6d",
-            "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": "2017-06-02T07:47:27+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": "sebastian/diff",
-        "version": "1.4.3",
-        "version_normalized": "1.4.3.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/sebastianbergmann/diff.git",
-            "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4",
-            "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4",
-            "shasum": ""
-        },
-        "require": {
-            "php": "^5.3.3 || ^7.0"
-        },
-        "require-dev": {
-            "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
-        },
-        "time": "2017-05-22T07:24:03+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.4-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"
-        ]
-    },
-    {
-        "name": "friendsofphp/php-cs-fixer",
-        "version": "v1.11.6",
-        "version_normalized": "1.11.6.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git",
-            "reference": "41dc93abd2937a85a3889e28765231d574d2bac8"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/41dc93abd2937a85a3889e28765231d574d2bac8",
-            "reference": "41dc93abd2937a85a3889e28765231d574d2bac8",
-            "shasum": ""
-        },
-        "require": {
-            "ext-tokenizer": "*",
-            "php": ">=5.3.6",
-            "sebastian/diff": "~1.1",
-            "symfony/console": "~2.3|~3.0",
-            "symfony/event-dispatcher": "~2.1|~3.0",
-            "symfony/filesystem": "~2.1|~3.0",
-            "symfony/finder": "~2.1|~3.0",
-            "symfony/process": "~2.3|~3.0",
-            "symfony/stopwatch": "~2.5|~3.0"
-        },
-        "conflict": {
-            "hhvm": "<3.9"
-        },
-        "require-dev": {
-            "phpunit/phpunit": "^4.5|^5",
-            "satooshi/php-coveralls": "^0.7.1"
-        },
-        "time": "2016-07-22T06:46:28+00:00",
-        "bin": [
-            "php-cs-fixer"
-        ],
-        "type": "application",
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Symfony\\CS\\": "Symfony/CS/"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Dariusz Rumiński",
-                "email": "dariusz.ruminski@gmail.com"
-            },
-            {
-                "name": "Fabien Potencier",
-                "email": "fabien@symfony.com"
-            }
-        ],
-        "description": "A tool to automatically fix PHP code style"
-    },
-    {
-        "name": "seld/jsonlint",
-        "version": "1.6.1",
-        "version_normalized": "1.6.1.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/Seldaek/jsonlint.git",
-            "reference": "50d63f2858d87c4738d5b76a7dcbb99fa8cf7c77"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/50d63f2858d87c4738d5b76a7dcbb99fa8cf7c77",
-            "reference": "50d63f2858d87c4738d5b76a7dcbb99fa8cf7c77",
-            "shasum": ""
-        },
-        "require": {
-            "php": "^5.3 || ^7.0"
-        },
-        "require-dev": {
-            "phpunit/phpunit": "^4.5"
-        },
-        "time": "2017-06-18T15:11:04+00:00",
-        "bin": [
-            "bin/jsonlint"
-        ],
-        "type": "library",
+        "time": "2017-06-18T15:11:04+00:00",
+        "bin": [
+            "bin/jsonlint"
+        ],
+        "type": "library",
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
@@ -5916,164 +5298,31 @@
         "homepage": "https://symfony.com"
     },
     {
-        "name": "symfony/validator",
-        "version": "v2.8.25",
-        "version_normalized": "2.8.25.0",
+        "name": "phpdocumentor/reflection-docblock",
+        "version": "2.0.5",
+        "version_normalized": "2.0.5.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/validator.git",
-            "reference": "6c019627f2a69b9ab2ac41fd53102148a55af564"
+            "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+            "reference": "e6a969a640b00d8daa3c66518b0405fb41ae0c4b"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/validator/zipball/6c019627f2a69b9ab2ac41fd53102148a55af564",
-            "reference": "6c019627f2a69b9ab2ac41fd53102148a55af564",
+            "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/e6a969a640b00d8daa3c66518b0405fb41ae0c4b",
+            "reference": "e6a969a640b00d8daa3c66518b0405fb41ae0c4b",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.9",
-            "symfony/polyfill-mbstring": "~1.0",
-            "symfony/translation": "~2.4|~3.0.0"
+            "php": ">=5.3.3"
         },
         "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"
+            "phpunit/phpunit": "~4.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": ""
+            "dflydev/markdown": "~1.0",
+            "erusev/parsedown": "~1.0"
         },
-        "time": "2017-07-03T08:04:30+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/config",
-        "version": "v2.8.25",
-        "version_normalized": "2.8.25.0",
-        "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"
-        },
-        "time": "2017-04-12T14:07:15+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": "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",
+        "time": "2016-01-25T08:17:30+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -6426,91 +5675,6 @@
             "instantiate"
         ]
     },
-    {
-        "name": "jms/serializer",
-        "version": "1.8.1",
-        "version_normalized": "1.8.1.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/schmittjoh/serializer.git",
-            "reference": "ce65798f722c836f16d5d7d2e3ca9d21e0fb4331"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/ce65798f722c836f16d5d7d2e3ca9d21e0fb4331",
-            "reference": "ce65798f722c836f16d5d7d2e3ca9d21e0fb4331",
-            "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-07-13T11:23:56+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": "Asmir Mustafic",
-                "email": "goetas@gmail.com"
-            },
-            {
-                "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": "herrera-io/phar-update",
         "version": "1.0.3",
@@ -6571,50 +5735,6 @@
         ],
         "abandoned": true
     },
-    {
-        "name": "erusev/parsedown",
-        "version": "1.6.3",
-        "version_normalized": "1.6.3.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/erusev/parsedown.git",
-            "reference": "728952b90a333b5c6f77f06ea9422b94b585878d"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/erusev/parsedown/zipball/728952b90a333b5c6f77f06ea9422b94b585878d",
-            "reference": "728952b90a333b5c6f77f06ea9422b94b585878d",
-            "shasum": ""
-        },
-        "require": {
-            "php": ">=5.3.0"
-        },
-        "time": "2017-05-14T14:47:48+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": "cilex/cilex",
         "version": "1.1.0",
@@ -6903,81 +6023,40 @@
         "homepage": "https://github.com/theseer/fDOMDocument"
     },
     {
-        "name": "sebastian/finder-facade",
-        "version": "1.2.1",
-        "version_normalized": "1.2.1.0",
+        "name": "phploc/phploc",
+        "version": "3.0.1",
+        "version_normalized": "3.0.1.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/sebastianbergmann/finder-facade.git",
-            "reference": "2a6f7f57efc0aa2d23297d9fd9e2a03111a8c0b9"
+            "url": "https://github.com/sebastianbergmann/phploc.git",
+            "reference": "74f917e6f80f291856989960d31afa44a4196859"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/sebastianbergmann/finder-facade/zipball/2a6f7f57efc0aa2d23297d9fd9e2a03111a8c0b9",
-            "reference": "2a6f7f57efc0aa2d23297d9fd9e2a03111a8c0b9",
+            "url": "https://api.github.com/repos/sebastianbergmann/phploc/zipball/74f917e6f80f291856989960d31afa44a4196859",
+            "reference": "74f917e6f80f291856989960d31afa44a4196859",
             "shasum": ""
         },
         "require": {
-            "symfony/finder": "~2.3|~3.0",
-            "theseer/fdomdocument": "~1.3"
+            "php": ">=5.6",
+            "sebastian/finder-facade": "~1.1",
+            "sebastian/git": "~2.1",
+            "sebastian/version": "~1.0.3|~2.0",
+            "symfony/console": "~2.5|~3.0"
+        },
+        "require-dev": {
+            "phpunit/phpunit": "~5"
         },
-        "time": "2016-02-17T07:02:23+00:00",
+        "time": "2016-04-25T08:11:21+00:00",
+        "bin": [
+            "phploc"
+        ],
         "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": "FinderFacade is a convenience wrapper for Symfony's Finder component.",
-        "homepage": "https://github.com/sebastianbergmann/finder-facade"
-    },
-    {
-        "name": "phploc/phploc",
-        "version": "3.0.1",
-        "version_normalized": "3.0.1.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/sebastianbergmann/phploc.git",
-            "reference": "74f917e6f80f291856989960d31afa44a4196859"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/sebastianbergmann/phploc/zipball/74f917e6f80f291856989960d31afa44a4196859",
-            "reference": "74f917e6f80f291856989960d31afa44a4196859",
-            "shasum": ""
-        },
-        "require": {
-            "php": ">=5.6",
-            "sebastian/finder-facade": "~1.1",
-            "sebastian/git": "~2.1",
-            "sebastian/version": "~1.0.3|~2.0",
-            "symfony/console": "~2.5|~3.0"
-        },
-        "require-dev": {
-            "phpunit/phpunit": "~5"
-        },
-        "time": "2016-04-25T08:11:21+00:00",
-        "bin": [
-            "phploc"
-        ],
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "3.0-dev"
-            }
-        },
+        "extra": {
+            "branch-alias": {
+                "dev-master": "3.0-dev"
+            }
+        },
         "installation-source": "dist",
         "autoload": {
             "classmap": [
@@ -6998,71 +6077,6 @@
         "description": "A tool for quickly measuring the size of a PHP project.",
         "homepage": "https://github.com/sebastianbergmann/phploc"
     },
-    {
-        "name": "symfony/dependency-injection",
-        "version": "v3.2.12",
-        "version_normalized": "3.2.12.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/symfony/dependency-injection.git",
-            "reference": "c1170b063674f000b154a5809bb9e373a773d4c0"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/c1170b063674f000b154a5809bb9e373a773d4c0",
-            "reference": "c1170b063674f000b154a5809bb9e373a773d4c0",
-            "shasum": ""
-        },
-        "require": {
-            "php": ">=5.5.9"
-        },
-        "conflict": {
-            "symfony/yaml": "<3.2"
-        },
-        "require-dev": {
-            "symfony/config": "~2.8|~3.0",
-            "symfony/expression-language": "~2.8|~3.0",
-            "symfony/yaml": "~3.2"
-        },
-        "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": ""
-        },
-        "time": "2017-07-17T14:04:01+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "3.2-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Symfony\\Component\\DependencyInjection\\": ""
-            },
-            "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 DependencyInjection Component",
-        "homepage": "https://symfony.com"
-    },
     {
         "name": "pdepend/pdepend",
         "version": "2.5.0",
@@ -7173,57 +6187,6 @@
             "pmd"
         ]
     },
-    {
-        "name": "phpunit/php-token-stream",
-        "version": "1.4.11",
-        "version_normalized": "1.4.11.0",
-        "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"
-        },
-        "time": "2017-02-27T10:12:30+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.4-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": "sebastian/resource-operations",
         "version": "1.0.0",
@@ -7927,115 +6890,6 @@
             "xunit"
         ]
     },
-    {
-        "name": "phpspec/prophecy",
-        "version": "v1.7.0",
-        "version_normalized": "1.7.0.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"
-        },
-        "time": "2017-03-02T20:05:34+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.6.x-dev"
-            }
-        },
-        "installation-source": "dist",
-        "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"
-        ]
-    },
-    {
-        "name": "myclabs/deep-copy",
-        "version": "1.6.1",
-        "version_normalized": "1.6.1.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/myclabs/DeepCopy.git",
-            "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/8e6e04167378abf1ddb4d3522d8755c5fd90d102",
-            "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102",
-            "shasum": ""
-        },
-        "require": {
-            "php": ">=5.4.0"
-        },
-        "require-dev": {
-            "doctrine/collections": "1.*",
-            "phpunit/phpunit": "~4.1"
-        },
-        "time": "2017-04-12T18:52:22+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "DeepCopy\\": "src/DeepCopy/"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "description": "Create deep copies (clones) of your objects",
-        "homepage": "https://github.com/myclabs/DeepCopy",
-        "keywords": [
-            "clone",
-            "copy",
-            "duplicate",
-            "object",
-            "object graph"
-        ]
-    },
     {
         "name": "phpunit/phpunit",
         "version": "5.7.15",
@@ -8252,5 +7106,1228 @@
             "phpcs",
             "standards"
         ]
+    },
+    {
+        "name": "symfony/process",
+        "version": "v2.8.31",
+        "version_normalized": "2.8.31.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/process.git",
+            "reference": "d25449e031f600807949aab7cadbf267712f4eee"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony/process/zipball/d25449e031f600807949aab7cadbf267712f4eee",
+            "reference": "d25449e031f600807949aab7cadbf267712f4eee",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.9"
+        },
+        "time": "2017-11-05T15:25:56+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": "erusev/parsedown",
+        "version": "1.6.4",
+        "version_normalized": "1.6.4.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/erusev/parsedown.git",
+            "reference": "fbe3fe878f4fe69048bb8a52783a09802004f548"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/erusev/parsedown/zipball/fbe3fe878f4fe69048bb8a52783a09802004f548",
+            "reference": "fbe3fe878f4fe69048bb8a52783a09802004f548",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.0"
+        },
+        "require-dev": {
+            "phpunit/phpunit": "^4.8.35"
+        },
+        "time": "2017-11-14T20:44:03+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": "jms/serializer",
+        "version": "1.9.2",
+        "version_normalized": "1.9.2.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/schmittjoh/serializer.git",
+            "reference": "995270cddce65b9c14a58c11cf77116d28d9336c"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/995270cddce65b9c14a58c11cf77116d28d9336c",
+            "reference": "995270cddce65b9c14a58c11cf77116d28d9336c",
+            "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-11-22T16:45:19+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.9-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "JMS\\Serializer": "src/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "Apache-2.0"
+        ],
+        "authors": [
+            {
+                "name": "Asmir Mustafic",
+                "email": "goetas@gmail.com"
+            },
+            {
+                "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": "symfony/config",
+        "version": "v2.8.31",
+        "version_normalized": "2.8.31.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/config.git",
+            "reference": "f4f3f1d7090c464434bbbc3e8aa2b41149c59196"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony/config/zipball/f4f3f1d7090c464434bbbc3e8aa2b41149c59196",
+            "reference": "f4f3f1d7090c464434bbbc3e8aa2b41149c59196",
+            "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"
+        },
+        "time": "2017-11-07T11:56:23+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/polyfill-mbstring",
+        "version": "v1.6.0",
+        "version_normalized": "1.6.0.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/polyfill-mbstring.git",
+            "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296",
+            "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.3"
+        },
+        "suggest": {
+            "ext-mbstring": "For best performance"
+        },
+        "time": "2017-10-11T12:05:26+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.6-dev"
+            }
+        },
+        "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"
+        ]
+    },
+    {
+        "name": "symfony/console",
+        "version": "v2.8.31",
+        "version_normalized": "2.8.31.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/console.git",
+            "reference": "7cad097cf081c0ab3d0322cc38d34ee80484d86f"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony/console/zipball/7cad097cf081c0ab3d0322cc38d34ee80484d86f",
+            "reference": "7cad097cf081c0ab3d0322cc38d34ee80484d86f",
+            "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": ""
+        },
+        "time": "2017-11-16T15:20:19+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/event-dispatcher",
+        "version": "v2.8.31",
+        "version_normalized": "2.8.31.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/event-dispatcher.git",
+            "reference": "b59aacf238fadda50d612c9de73b74751872a903"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b59aacf238fadda50d612c9de73b74751872a903",
+            "reference": "b59aacf238fadda50d612c9de73b74751872a903",
+            "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": "2017-11-05T15:25:56+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/stopwatch",
+        "version": "v2.8.31",
+        "version_normalized": "2.8.31.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/stopwatch.git",
+            "reference": "533bb9d7c2da1c6d2da163ecf0f22043ea98f59b"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony/stopwatch/zipball/533bb9d7c2da1c6d2da163ecf0f22043ea98f59b",
+            "reference": "533bb9d7c2da1c6d2da163ecf0f22043ea98f59b",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.9"
+        },
+        "time": "2017-11-10T18:59:36+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/validator",
+        "version": "v2.8.31",
+        "version_normalized": "2.8.31.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/validator.git",
+            "reference": "2c5ae6fa983b65c58cb7c4481cd54871a3bfd10a"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony/validator/zipball/2c5ae6fa983b65c58cb7c4481cd54871a3bfd10a",
+            "reference": "2c5ae6fa983b65c58cb7c4481cd54871a3bfd10a",
+            "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": ""
+        },
+        "time": "2017-11-10T18:59:36+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": "pear/net_url2",
+        "version": "v2.2.2",
+        "version_normalized": "2.2.2.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/pear/Net_URL2.git",
+            "reference": "07fd055820dbf466ee3990abe96d0e40a8791f9d"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/pear/Net_URL2/zipball/07fd055820dbf466ee3990abe96d0e40a8791f9d",
+            "reference": "07fd055820dbf466ee3990abe96d0e40a8791f9d",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.1.4"
+        },
+        "require-dev": {
+            "phpunit/phpunit": ">=3.3.0"
+        },
+        "time": "2017-08-25T06:16:11+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "2.2.x-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "classmap": [
+                "Net/URL2.php"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "include-path": [
+            "./"
+        ],
+        "license": [
+            "BSD-3-Clause"
+        ],
+        "authors": [
+            {
+                "name": "David Coallier",
+                "email": "davidc@php.net"
+            },
+            {
+                "name": "Tom Klingenberg",
+                "email": "tkli@php.net"
+            },
+            {
+                "name": "Christian Schmidt",
+                "email": "chmidt@php.net"
+            }
+        ],
+        "description": "Class for parsing and handling URL. Provides parsing of URLs into their constituent parts (scheme, host, path etc.), URL generation, and resolving of relative URLs.",
+        "homepage": "https://github.com/pear/Net_URL2",
+        "keywords": [
+            "PEAR",
+            "net",
+            "networking",
+            "rfc3986",
+            "uri",
+            "url"
+        ]
+    },
+    {
+        "name": "symfony/css-selector",
+        "version": "v3.3.13",
+        "version_normalized": "3.3.13.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/css-selector.git",
+            "reference": "66e6e046032ebdf1f562c26928549f613d428bd1"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony/css-selector/zipball/66e6e046032ebdf1f562c26928549f613d428bd1",
+            "reference": "66e6e046032ebdf1f562c26928549f613d428bd1",
+            "shasum": ""
+        },
+        "require": {
+            "php": "^5.5.9|>=7.0.8"
+        },
+        "time": "2017-11-05T15:47:03+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "3.3-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Symfony\\Component\\CssSelector\\": ""
+            },
+            "exclude-from-classmap": [
+                "/Tests/"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Jean-François Simon",
+                "email": "jeanfrancois.simon@sensiolabs.com"
+            },
+            {
+                "name": "Fabien Potencier",
+                "email": "fabien@symfony.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
+            }
+        ],
+        "description": "Symfony CssSelector Component",
+        "homepage": "https://symfony.com"
+    },
+    {
+        "name": "myclabs/deep-copy",
+        "version": "1.7.0",
+        "version_normalized": "1.7.0.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/myclabs/DeepCopy.git",
+            "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e",
+            "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e",
+            "shasum": ""
+        },
+        "require": {
+            "php": "^5.6 || ^7.0"
+        },
+        "require-dev": {
+            "doctrine/collections": "^1.0",
+            "doctrine/common": "^2.6",
+            "phpunit/phpunit": "^4.1"
+        },
+        "time": "2017-10-19T19:58:43+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"
+        ]
+    },
+    {
+        "name": "phpspec/prophecy",
+        "version": "v1.7.2",
+        "version_normalized": "1.7.2.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/phpspec/prophecy.git",
+            "reference": "c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/phpspec/prophecy/zipball/c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6",
+            "reference": "c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6",
+            "shasum": ""
+        },
+        "require": {
+            "doctrine/instantiator": "^1.0.2",
+            "php": "^5.3|^7.0",
+            "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0",
+            "sebastian/comparator": "^1.1|^2.0",
+            "sebastian/recursion-context": "^1.0|^2.0|^3.0"
+        },
+        "require-dev": {
+            "phpspec/phpspec": "^2.5|^3.2",
+            "phpunit/phpunit": "^4.8 || ^5.6.5"
+        },
+        "time": "2017-09-04T11:05:03+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.7.x-dev"
+            }
+        },
+        "installation-source": "dist",
+        "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"
+        ]
+    },
+    {
+        "name": "phpunit/php-token-stream",
+        "version": "2.0.1",
+        "version_normalized": "2.0.1.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+            "reference": "9a02332089ac48e704c70f6cefed30c224e3c0b0"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/9a02332089ac48e704c70f6cefed30c224e3c0b0",
+            "reference": "9a02332089ac48e704c70f6cefed30c224e3c0b0",
+            "shasum": ""
+        },
+        "require": {
+            "ext-tokenizer": "*",
+            "php": "^7.0"
+        },
+        "require-dev": {
+            "phpunit/phpunit": "^6.2.4"
+        },
+        "time": "2017-08-20T05:47:52+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": "Wrapper around PHP's tokenizer extension.",
+        "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+        "keywords": [
+            "tokenizer"
+        ]
+    },
+    {
+        "name": "symfony/finder",
+        "version": "v2.8.31",
+        "version_normalized": "2.8.31.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/finder.git",
+            "reference": "efeceae6a05a9b2fcb3391333f1d4a828ff44ab8"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony/finder/zipball/efeceae6a05a9b2fcb3391333f1d4a828ff44ab8",
+            "reference": "efeceae6a05a9b2fcb3391333f1d4a828ff44ab8",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.9"
+        },
+        "time": "2017-11-05T15:25:56+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": "sebastian/finder-facade",
+        "version": "1.2.2",
+        "version_normalized": "1.2.2.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/sebastianbergmann/finder-facade.git",
+            "reference": "4a3174709c2dc565fe5fb26fcf827f6a1fc7b09f"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/sebastianbergmann/finder-facade/zipball/4a3174709c2dc565fe5fb26fcf827f6a1fc7b09f",
+            "reference": "4a3174709c2dc565fe5fb26fcf827f6a1fc7b09f",
+            "shasum": ""
+        },
+        "require": {
+            "symfony/finder": "~2.3|~3.0|~4.0",
+            "theseer/fdomdocument": "~1.3"
+        },
+        "time": "2017-11-18T17:31:49+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": "FinderFacade is a convenience wrapper for Symfony's Finder component.",
+        "homepage": "https://github.com/sebastianbergmann/finder-facade"
+    },
+    {
+        "name": "paragonie/random_compat",
+        "version": "v2.0.11",
+        "version_normalized": "2.0.11.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/paragonie/random_compat.git",
+            "reference": "5da4d3c796c275c55f057af5a643ae297d96b4d8"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/paragonie/random_compat/zipball/5da4d3c796c275c55f057af5a643ae297d96b4d8",
+            "reference": "5da4d3c796c275c55f057af5a643ae297d96b4d8",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.2.0"
+        },
+        "require-dev": {
+            "phpunit/phpunit": "4.*|5.*"
+        },
+        "suggest": {
+            "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
+        },
+        "time": "2017-09-27T21:40:39+00:00",
+        "type": "library",
+        "installation-source": "dist",
+        "autoload": {
+            "files": [
+                "lib/random.php"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Paragon Initiative Enterprises",
+                "email": "security@paragonie.com",
+                "homepage": "https://paragonie.com"
+            }
+        ],
+        "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
+        "keywords": [
+            "csprng",
+            "pseudorandom",
+            "random"
+        ]
+    },
+    {
+        "name": "zendframework/zend-inputfilter",
+        "version": "2.7.5",
+        "version_normalized": "2.7.5.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/zendframework/zend-inputfilter.git",
+            "reference": "02bbc6b5fc54991e43e7471e54e2173077708d7b"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/zendframework/zend-inputfilter/zipball/02bbc6b5fc54991e43e7471e54e2173077708d7b",
+            "reference": "02bbc6b5fc54991e43e7471e54e2173077708d7b",
+            "shasum": ""
+        },
+        "require": {
+            "php": "^7.0 || ^5.6",
+            "zendframework/zend-filter": "^2.6",
+            "zendframework/zend-stdlib": "^2.7 || ^3.0",
+            "zendframework/zend-validator": "^2.6"
+        },
+        "require-dev": {
+            "phpunit/phpunit": "^6.0.8 || ^5.7.15",
+            "zendframework/zend-coding-standard": "~1.0.0",
+            "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3"
+        },
+        "suggest": {
+            "zendframework/zend-servicemanager": "To support plugin manager support"
+        },
+        "time": "2017-11-07T17:08:00+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "2.7-dev",
+                "dev-develop": "2.8-dev"
+            },
+            "zf": {
+                "component": "Zend\\InputFilter",
+                "config-provider": "Zend\\InputFilter\\ConfigProvider"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Zend\\InputFilter\\": "src/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "BSD-3-Clause"
+        ],
+        "homepage": "https://github.com/zendframework/zend-inputfilter",
+        "keywords": [
+            "inputfilter",
+            "zf2"
+        ]
+    },
+    {
+        "name": "zendframework/zend-diactoros",
+        "version": "1.6.1",
+        "version_normalized": "1.6.1.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/zendframework/zend-diactoros.git",
+            "reference": "c8664b92a6d5bc229e48b0923486c097e45a7877"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/c8664b92a6d5bc229e48b0923486c097e45a7877",
+            "reference": "c8664b92a6d5bc229e48b0923486c097e45a7877",
+            "shasum": ""
+        },
+        "require": {
+            "php": "^5.6 || ^7.0",
+            "psr/http-message": "^1.0"
+        },
+        "provide": {
+            "psr/http-message-implementation": "1.0"
+        },
+        "require-dev": {
+            "ext-dom": "*",
+            "ext-libxml": "*",
+            "phpunit/phpunit": "^5.7.16 || ^6.0.8",
+            "zendframework/zend-coding-standard": "~1.0"
+        },
+        "time": "2017-10-12T15:24:51+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.6-dev",
+                "dev-develop": "1.7-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Zend\\Diactoros\\": "src/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "BSD-2-Clause"
+        ],
+        "description": "PSR HTTP Message implementations",
+        "homepage": "https://github.com/zendframework/zend-diactoros",
+        "keywords": [
+            "http",
+            "psr",
+            "psr-7"
+        ]
+    },
+    {
+        "name": "symfony/dependency-injection",
+        "version": "v3.2.14",
+        "version_normalized": "3.2.14.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/dependency-injection.git",
+            "reference": "d9f2e62e1a93d52ad4e4f6faaf66f6eef723d761"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/d9f2e62e1a93d52ad4e4f6faaf66f6eef723d761",
+            "reference": "d9f2e62e1a93d52ad4e4f6faaf66f6eef723d761",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.5.9"
+        },
+        "conflict": {
+            "symfony/yaml": "<3.2"
+        },
+        "require-dev": {
+            "symfony/config": "~2.8|~3.0",
+            "symfony/expression-language": "~2.8|~3.0",
+            "symfony/yaml": "~3.2"
+        },
+        "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": ""
+        },
+        "time": "2017-07-28T15:22:55+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "3.2-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Symfony\\Component\\DependencyInjection\\": ""
+            },
+            "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 DependencyInjection Component",
+        "homepage": "https://symfony.com"
+    },
+    {
+        "name": "sabre/vobject",
+        "version": "3.5.3",
+        "version_normalized": "3.5.3.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/sabre-io/vobject.git",
+            "reference": "129d80533a9ec0d9cacfb50b51180c34edb6874c"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/sabre-io/vobject/zipball/129d80533a9ec0d9cacfb50b51180c34edb6874c",
+            "reference": "129d80533a9ec0d9cacfb50b51180c34edb6874c",
+            "shasum": ""
+        },
+        "require": {
+            "ext-mbstring": "*",
+            "php": ">=5.3.1"
+        },
+        "require-dev": {
+            "phpunit/phpunit": "*",
+            "squizlabs/php_codesniffer": "*"
+        },
+        "time": "2016-10-07T03:20:40+00:00",
+        "bin": [
+            "bin/vobject",
+            "bin/generate_vcards"
+        ],
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "3.2.x-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Sabre\\VObject\\": "lib/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "BSD-3-Clause"
+        ],
+        "authors": [
+            {
+                "name": "Evert Pot",
+                "email": "me@evertpot.com",
+                "homepage": "http://evertpot.com/",
+                "role": "Developer"
+            },
+            {
+                "name": "Dominik Tobschall",
+                "email": "dominik@fruux.com",
+                "homepage": "http://tobschall.de/",
+                "role": "Developer"
+            }
+        ],
+        "description": "The VObject library for PHP allows you to easily parse and manipulate iCalendar and vCard objects",
+        "homepage": "http://sabre.io/vobject/",
+        "keywords": [
+            "VObject",
+            "iCalendar",
+            "jCal",
+            "jCard",
+            "vCard"
+        ]
     }
 ]
diff --git a/vendor/erusev/parsedown/README.md b/vendor/erusev/parsedown/README.md
index ffe3116fd60fea28d2ddeb5eed398b810104f74f..5f5c38e3d1c217a93c6c4dcb00a9e5ef6bbabb44 100644
--- a/vendor/erusev/parsedown/README.md
+++ b/vendor/erusev/parsedown/README.md
@@ -15,6 +15,7 @@ Better Markdown Parser in PHP
 ### Features
 
 * One File
+* No Dependencies
 * Super Fast
 * Extensible
 * [GitHub flavored](https://help.github.com/articles/github-flavored-markdown)
@@ -35,6 +36,10 @@ echo $Parsedown->text('Hello _Parsedown_!'); # prints: <p>Hello <em>Parsedown</e
 
 More examples in [the wiki](https://github.com/erusev/parsedown/wiki/) and in [this video tutorial](http://youtu.be/wYZBY8DEikI).
 
+### Security
+
+Parsedown does not sanitize the HTML that it generates. When you deal with untrusted content (ex: user commnets) you should also use a HTML sanitizer like [HTML Purifier](http://htmlpurifier.org/).
+
 ### Questions
 
 **How does Parsedown work?**
diff --git a/vendor/erusev/parsedown/composer.json b/vendor/erusev/parsedown/composer.json
index 28145af68cace03259cd61d674c431bb3a2da241..b7f8aea3b5418459537f6363e9fde253f5a7ad86 100644
--- a/vendor/erusev/parsedown/composer.json
+++ b/vendor/erusev/parsedown/composer.json
@@ -15,6 +15,9 @@
     "require": {
         "php": ">=5.3.0"
     },
+    "require-dev": {
+        "phpunit/phpunit": "^4.8.35"
+    },
     "autoload": {
         "psr-0": {"Parsedown": ""}
     }
diff --git a/vendor/jms/serializer/.travis.yml b/vendor/jms/serializer/.travis.yml
index 9aef5f78f342abaec0a2177c07ef2ce1c4b0ec22..f6b54587bf6c81fdb2a20f052b19d11cbfdfa4be 100644
--- a/vendor/jms/serializer/.travis.yml
+++ b/vendor/jms/serializer/.travis.yml
@@ -22,6 +22,8 @@ matrix:
         - php: 5.5
         - php: 5.6
         - php: 7.0
+        - php: 7.1
+        - php: 7.2
         - php: 5.5
           env: COMPOSER_FLAGS='--prefer-lowest --prefer-stable'
     fast_finish: true
diff --git a/vendor/jms/serializer/CHANGELOG.md b/vendor/jms/serializer/CHANGELOG.md
index 2d5c9241a0043c1c1b4416aaef77adb16b435b22..be1231df285f7d764d27f1d1a7a8a04abc766bae 100644
--- a/vendor/jms/serializer/CHANGELOG.md
+++ b/vendor/jms/serializer/CHANGELOG.md
@@ -1,5 +1,73 @@
 # Change Log
 
+## [1.9.2](https://github.com/schmittjoh/serializer/tree/1.9.2) (2017-11-22)
+
+**Fixed bugs:**
+
+- Missing ClassMetadata deserialization data [\#841](https://github.com/schmittjoh/serializer/pull/841) ([TristanMogwai](https://github.com/TristanMogwai))
+
+**Closed issues:**
+
+- DateTime format documentation [\#836](https://github.com/schmittjoh/serializer/issues/836)
+- Deserialization not working with camelCase [\#831](https://github.com/schmittjoh/serializer/issues/831)
+
+**Merged pull requests:**
+
+- Fix documentation syntax errors on available types [\#839](https://github.com/schmittjoh/serializer/pull/839) ([andy-morgan](https://github.com/andy-morgan))
+- Improve documentation about default DateTime format [\#838](https://github.com/schmittjoh/serializer/pull/838) ([enumag](https://github.com/enumag))
+
+## [1.9.1](https://github.com/schmittjoh/serializer/tree/1.9.1) (2017-10-27)
+**Fixed bugs:**
+
+- Dynamic exclusion strategy, Variable "object" is not valid [\#826](https://github.com/schmittjoh/serializer/issues/826)
+
+**Closed issues:**
+
+- Allow DateTime or Null [\#779](https://github.com/schmittjoh/serializer/issues/779)
+
+**Merged pull requests:**
+
+- Alow to use "object" var in expressions when deserializing [\#827](https://github.com/schmittjoh/serializer/pull/827) ([goetas](https://github.com/goetas))
+
+## [1.9.0](https://github.com/schmittjoh/serializer/tree/1.9.0) (2017-09-28)
+**Implemented enhancements:**
+
+- Doctrine LazyCriteriaCollection not supported [\#814](https://github.com/schmittjoh/serializer/issues/814)
+- Do not require the translator [\#824](https://github.com/schmittjoh/serializer/pull/824) ([goetas](https://github.com/goetas))
+- Added mapping for guid type [\#802](https://github.com/schmittjoh/serializer/pull/802) ([develth](https://github.com/develth))
+- Added translation domain to FormErrorHandler [\#783](https://github.com/schmittjoh/serializer/pull/783) ([prosalov](https://github.com/prosalov))
+
+**Fixed bugs:**
+
+-  Node no longer exists - Deserialize Error [\#817](https://github.com/schmittjoh/serializer/issues/817)
+- Serializer fails if there is no AnnotationDriver in the DriverChain instance [\#815](https://github.com/schmittjoh/serializer/issues/815)
+- Evaluate XML xsi:nil="1" to null  [\#799](https://github.com/schmittjoh/serializer/pull/799) ([Bouwdie](https://github.com/Bouwdie))
+
+**Closed issues:**
+
+- Empty array removed from XML serialization [\#816](https://github.com/schmittjoh/serializer/issues/816)
+- XML Discriminator tags don't work in YAML metadata [\#811](https://github.com/schmittjoh/serializer/issues/811)
+- Launching phpunit does not execute any test [\#809](https://github.com/schmittjoh/serializer/issues/809)
+- Add "bool" Annotation/Type [\#807](https://github.com/schmittjoh/serializer/issues/807)
+- Add support for overriding default annotation driver configuration [\#804](https://github.com/schmittjoh/serializer/issues/804)
+- Add description to PropertyMetadata? [\#800](https://github.com/schmittjoh/serializer/issues/800)
+
+**Merged pull requests:**
+
+- Workaround to avoid triggering simplexml warning [\#825](https://github.com/schmittjoh/serializer/pull/825) ([goetas](https://github.com/goetas))
+- Added null metadata driver [\#822](https://github.com/schmittjoh/serializer/pull/822) ([goetas](https://github.com/goetas))
+- Run Travis tests against modern PHP [\#819](https://github.com/schmittjoh/serializer/pull/819) ([Majkl578](https://github.com/Majkl578))
+- Added bool type alias [\#818](https://github.com/schmittjoh/serializer/pull/818) ([Majkl578](https://github.com/Majkl578))
+
+## [1.8.1](https://github.com/schmittjoh/serializer/tree/1.8.1) (2017-07-13)
+**Closed issues:**
+
+- Version 1.8 is breaking backwards compatibility [\#796](https://github.com/schmittjoh/serializer/issues/796)
+
+**Merged pull requests:**
+
+- Revert back to PSR-0 [\#797](https://github.com/schmittjoh/serializer/pull/797) ([goetas](https://github.com/goetas))
+
 ## [1.8.0](https://github.com/schmittjoh/serializer/tree/1.8.0) (2017-07-12)
 **Implemented enhancements:**
 
diff --git a/vendor/jms/serializer/composer.json b/vendor/jms/serializer/composer.json
index 46cee1c23aefcf67970fe8815dd51746fb2b7f74..cde6cce8baff1cb6440855c3d60ee2e9118af1d4 100644
--- a/vendor/jms/serializer/composer.json
+++ b/vendor/jms/serializer/composer.json
@@ -60,7 +60,7 @@
     },
     "extra": {
         "branch-alias": {
-            "dev-master": "1.8-dev"
+            "dev-master": "1.9-dev"
         }
     }
 }
diff --git a/vendor/jms/serializer/doc/reference/annotations.rst b/vendor/jms/serializer/doc/reference/annotations.rst
index bac1f5ae59198e17498dc5036fa17073024682cf..c606a2febf8656034c333a360d436d8e68ad3d46 100644
--- a/vendor/jms/serializer/doc/reference/annotations.rst
+++ b/vendor/jms/serializer/doc/reference/annotations.rst
@@ -333,7 +333,7 @@ Available Types:
 +----------------------------------------------------------+--------------------------------------------------+
 | Type                                                     | Description                                      |
 +==========================================================+==================================================+
-| boolean                                                  | Primitive boolean                                |
+| boolean or bool                                          | Primitive boolean                                |
 +----------------------------------------------------------+--------------------------------------------------+
 | integer or int                                           | Primitive integer                                |
 +----------------------------------------------------------+--------------------------------------------------+
@@ -351,7 +351,7 @@ Available Types:
 |                                                          | Examples: array<string, string>,                 |
 |                                                          | array<string, MyNamespace\MyObject>, etc.        |
 +----------------------------------------------------------+--------------------------------------------------+
-| DateTime                                                 | PHP's DateTime object (default format/timezone)  |
+| DateTime                                                 | PHP's DateTime object (default format*/timezone) |
 +----------------------------------------------------------+--------------------------------------------------+
 | DateTime<'format'>                                       | PHP's DateTime object (custom format/default     |
 |                                                          | timezone)                                        |
@@ -363,7 +363,7 @@ Available Types:
 |                                                          | specify a specific timezone, use an empty        |
 |                                                          | string ('').                                     |
 +----------------------------------------------------------+--------------------------------------------------+
-| DateTimeImmutable                                        | PHP's DateTimeImmutable object (default format/  |
+| DateTimeImmutable                                        | PHP's DateTimeImmutable object (default format*/ |
 |                                                          | timezone)                                        |
 +----------------------------------------------------------+--------------------------------------------------+
 | DateTimeImmutable<'format'>                              | PHP's DateTimeImmutable object (custom format/   |
@@ -388,6 +388,8 @@ Available Types:
 |                                                          | into Doctrine's ArrayCollection class.           |
 +----------------------------------------------------------+--------------------------------------------------+
 
+(*) If the standalone jms/serializer is used then default format is `\DateTime::ISO8601` (which is not compatible with ISO-8601 despite the name). For jms/serializer-bundle the default format is `\DateTime::ATOM` (the real ISO-8601 format) but it can be changed in [configuration](https://jmsyst.com/bundles/JMSSerializerBundle/master/configuration#configuration-block-2-0).
+
 Examples:
 
 .. code-block :: php
diff --git a/vendor/jms/serializer/doc/reference/xml_reference.rst b/vendor/jms/serializer/doc/reference/xml_reference.rst
index eeffa01c953e94e445038cc334ebbf4966b96288..0ede5286fb4601fa73ef22d20ef649da1389d593 100644
--- a/vendor/jms/serializer/doc/reference/xml_reference.rst
+++ b/vendor/jms/serializer/doc/reference/xml_reference.rst
@@ -39,7 +39,7 @@ XML Reference
                 <!-- You can also specify the type as element which is necessary if
                      your type contains "<" or ">" characters. -->
                 <type><![CDATA[]]></type>
-                <xml-list inline="true" entry-name="foobar" />
+                <xml-list inline="true" entry-name="foobar" namespace="http://www.w3.org/2005/Atom" skip-when-empty="true" />
                 <xml-map inline="true" key-attribute-name="foo" entry-name="bar" namespace="http://www.w3.org/2005/Atom" />
                 <xml-element cdata="false" namespace="http://www.w3.org/2005/Atom"/>
                 <groups>
@@ -99,8 +99,8 @@ XML Reference
                     <value>foo</value>
                     <value>bar</value>
                 </groups>
-                <xml-list inline="true" entry-name="foobar" />
-                <xml-map inline="true" key-attribute-name="foo" entry-name="bar" />
+                <xml-list inline="true" entry-name="foobar" namespace="http://www.w3.org/2005/Atom" skip-when-empty="true" />
+                <xml-map inline="true" key-attribute-name="foo" entry-name="bar" namespace="http://www.w3.org/2005/Atom" />
             </virtual-property>
             
         </class>
diff --git a/vendor/jms/serializer/src/JMS/Serializer/Exclusion/ExpressionLanguageExclusionStrategy.php b/vendor/jms/serializer/src/JMS/Serializer/Exclusion/ExpressionLanguageExclusionStrategy.php
index 912e173f81417716126cf636e9047c176178c9fe..18050c4b5b3bab5c492d9a8169fb6a3823905b57 100644
--- a/vendor/jms/serializer/src/JMS/Serializer/Exclusion/ExpressionLanguageExclusionStrategy.php
+++ b/vendor/jms/serializer/src/JMS/Serializer/Exclusion/ExpressionLanguageExclusionStrategy.php
@@ -58,6 +58,8 @@ class ExpressionLanguageExclusionStrategy
         ];
         if ($navigatorContext instanceof SerializationContext) {
             $variables['object'] = $navigatorContext->getObject();
+        } else {
+            $variables['object'] = null;
         }
 
         return $this->expressionEvaluator->evaluate($property->excludeIf, $variables);
diff --git a/vendor/jms/serializer/src/JMS/Serializer/GraphNavigator.php b/vendor/jms/serializer/src/JMS/Serializer/GraphNavigator.php
index c3921f3b39780f674fc6f8c66822a6ba3fc731fb..08503bd53de8c8564d7e0376bc3526d55fde1a9f 100644
--- a/vendor/jms/serializer/src/JMS/Serializer/GraphNavigator.php
+++ b/vendor/jms/serializer/src/JMS/Serializer/GraphNavigator.php
@@ -141,6 +141,7 @@ final class GraphNavigator
             case 'integer':
                 return $visitor->visitInteger($data, $type, $context);
 
+            case 'bool':
             case 'boolean':
                 return $visitor->visitBoolean($data, $type, $context);
 
diff --git a/vendor/jms/serializer/src/JMS/Serializer/Handler/FormErrorHandler.php b/vendor/jms/serializer/src/JMS/Serializer/Handler/FormErrorHandler.php
index 098834fefd34138122616f9f74f7bcc0649b9bfa..d0834ebba2f470d9b08538bc22fd77e5cdf29118 100644
--- a/vendor/jms/serializer/src/JMS/Serializer/Handler/FormErrorHandler.php
+++ b/vendor/jms/serializer/src/JMS/Serializer/Handler/FormErrorHandler.php
@@ -31,6 +31,8 @@ class FormErrorHandler implements SubscribingHandlerInterface
 {
     private $translator;
 
+    private $translationDomain;
+
     public static function getSubscribingMethods()
     {
         $methods = array();
@@ -50,9 +52,10 @@ class FormErrorHandler implements SubscribingHandlerInterface
         return $methods;
     }
 
-    public function __construct(TranslatorInterface $translator)
+    public function __construct(TranslatorInterface $translator = null, $translationDomain = 'validators')
     {
         $this->translator = $translator;
+        $this->translationDomain = $translationDomain;
     }
 
     public function serializeFormToXml(XmlSerializationVisitor $visitor, Form $form, array $type)
@@ -118,11 +121,16 @@ class FormErrorHandler implements SubscribingHandlerInterface
 
     private function getErrorMessage(FormError $error)
     {
+
+        if ($this->translator === null){
+            return $error->getMessage();
+        }
+
         if (null !== $error->getMessagePluralization()) {
-            return $this->translator->transChoice($error->getMessageTemplate(), $error->getMessagePluralization(), $error->getMessageParameters(), 'validators');
+            return $this->translator->transChoice($error->getMessageTemplate(), $error->getMessagePluralization(), $error->getMessageParameters(), $this->translationDomain);
         }
 
-        return $this->translator->trans($error->getMessageTemplate(), $error->getMessageParameters(), 'validators');
+        return $this->translator->trans($error->getMessageTemplate(), $error->getMessageParameters(), $this->translationDomain);
     }
 
     private function convertFormToArray(VisitorInterface $visitor, Form $data)
diff --git a/vendor/jms/serializer/src/JMS/Serializer/Metadata/ClassMetadata.php b/vendor/jms/serializer/src/JMS/Serializer/Metadata/ClassMetadata.php
index 9ce0d238d852d61b92008cf3488ed80594db3215..40f49667ff1d444aa7ea11147ccfd22ec67c41e9 100644
--- a/vendor/jms/serializer/src/JMS/Serializer/Metadata/ClassMetadata.php
+++ b/vendor/jms/serializer/src/JMS/Serializer/Metadata/ClassMetadata.php
@@ -298,16 +298,16 @@ class ClassMetadata extends MergeableClassMetadata
             $this->usingExpression = $unserialized['usingExpression'];
         }
 
-        if (isset($deserializedData['xmlDiscriminatorAttribute'])) {
-            $this->xmlDiscriminatorAttribute = $deserializedData['xmlDiscriminatorAttribute'];
+        if (isset($unserialized['xmlDiscriminatorAttribute'])) {
+            $this->xmlDiscriminatorAttribute = $unserialized['xmlDiscriminatorAttribute'];
         }
 
-        if (isset($deserializedData['xmlDiscriminatorNamespace'])) {
-            $this->xmlDiscriminatorNamespace = $deserializedData['xmlDiscriminatorNamespace'];
+        if (isset($unserialized['xmlDiscriminatorNamespace'])) {
+            $this->xmlDiscriminatorNamespace = $unserialized['xmlDiscriminatorNamespace'];
         }
 
-        if (isset($deserializedData['xmlDiscriminatorCData'])) {
-            $this->xmlDiscriminatorCData = $deserializedData['xmlDiscriminatorCData'];
+        if (isset($unserialized['xmlDiscriminatorCData'])) {
+            $this->xmlDiscriminatorCData = $unserialized['xmlDiscriminatorCData'];
         }
 
         parent::unserialize($parentStr);
diff --git a/vendor/jms/serializer/src/JMS/Serializer/Metadata/Driver/AbstractDoctrineTypeDriver.php b/vendor/jms/serializer/src/JMS/Serializer/Metadata/Driver/AbstractDoctrineTypeDriver.php
index cf98643e9ce8859e41b32bdeba1f2eaf86a4da3f..455074d0f49f57ca5de131c475158b0dfa3df8d1 100644
--- a/vendor/jms/serializer/src/JMS/Serializer/Metadata/Driver/AbstractDoctrineTypeDriver.php
+++ b/vendor/jms/serializer/src/JMS/Serializer/Metadata/Driver/AbstractDoctrineTypeDriver.php
@@ -41,6 +41,7 @@ abstract class AbstractDoctrineTypeDriver implements DriverInterface
         'string' => 'string',
         'text' => 'string',
         'blob' => 'string',
+        'guid' => 'string',
 
         'integer' => 'integer',
         'smallint' => 'integer',
diff --git a/vendor/jms/serializer/src/JMS/Serializer/Metadata/Driver/NullDriver.php b/vendor/jms/serializer/src/JMS/Serializer/Metadata/Driver/NullDriver.php
new file mode 100644
index 0000000000000000000000000000000000000000..fbd5e36dddf186b119728852e0ad4ba98baa0b99
--- /dev/null
+++ b/vendor/jms/serializer/src/JMS/Serializer/Metadata/Driver/NullDriver.php
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ * Copyright 2016 Johannes M. Schmitt <schmittjoh@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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 Metadata\Driver\DriverInterface;
+
+class NullDriver implements DriverInterface
+{
+    public function loadMetadataForClass(\ReflectionClass $class)
+    {
+        $classMetadata = new ClassMetadata($name = $class->name);
+        $classMetadata->fileResources[] = $class->getFilename();
+
+        return $classMetadata;
+    }
+}
diff --git a/vendor/jms/serializer/src/JMS/Serializer/XmlDeserializationVisitor.php b/vendor/jms/serializer/src/JMS/Serializer/XmlDeserializationVisitor.php
index 9089cdabaef14494b21aae4907193802131f4557..a604ea5fbce91943360ff3964567f502fec35548 100644
--- a/vendor/jms/serializer/src/JMS/Serializer/XmlDeserializationVisitor.php
+++ b/vendor/jms/serializer/src/JMS/Serializer/XmlDeserializationVisitor.php
@@ -396,10 +396,18 @@ class XmlDeserializationVisitor extends AbstractVisitor implements NullAwareVisi
     public function isNull($value)
     {
         if ($value instanceof \SimpleXMLElement) {
-            $xsiAttributes = $value->attributes('http://www.w3.org/2001/XMLSchema-instance');
+            // Workaround for https://bugs.php.net/bug.php?id=75168 and https://github.com/schmittjoh/serializer/issues/817
+            // If the "name" is empty means that we are on an not-existent node and subsequent operations on the object will trigger the warning:
+            // "Node no longer exists"
+            if ($value->getName() === "") {
+                // @todo should be "true", but for collections needs a default collection value. maybe something for the 2.0
+                return false;
+            }
 
-            //We have to keep the isset quiet, some tests give error: `Node no longer exists`; even though it evaluates to false
-            if (@isset($xsiAttributes['nil']) && (string) $xsiAttributes['nil'] === 'true') {
+            $xsiAttributes = $value->attributes('http://www.w3.org/2001/XMLSchema-instance');
+            if (isset($xsiAttributes['nil'])
+                && ((string) $xsiAttributes['nil'] === 'true' || (string) $xsiAttributes['nil'] === '1')
+            ) {
                 return true;
             }
         }
diff --git a/vendor/jms/serializer/tests/Fixtures/BlogPost.php b/vendor/jms/serializer/tests/Fixtures/BlogPost.php
index 36869ee7016baba4c0d68be16d6151a8bbec395b..b496a91166369aefa8907438eb786281368b47b9 100644
--- a/vendor/jms/serializer/tests/Fixtures/BlogPost.php
+++ b/vendor/jms/serializer/tests/Fixtures/BlogPost.php
@@ -68,6 +68,14 @@ class BlogPost
      */
     private $published;
 
+    /**
+     * @Type("bool")
+     * @SerializedName("is_reviewed")
+     * @XmlAttribute
+     * @Groups({"post"})
+     */
+    private $reviewed;
+
     /**
      * @Type("string")
      * @XmlAttribute(namespace="http://schemas.google.com/g/2005")
@@ -119,6 +127,7 @@ class BlogPost
         $this->author = $author;
         $this->publisher = $publisher;
         $this->published = false;
+        $this->reviewed = false;
         $this->comments = new ArrayCollection();
         $this->comments2 = new Sequence();
         $this->metadata = new Map();
diff --git a/vendor/jms/serializer/tests/Fixtures/Doctrine/BlogPost.php b/vendor/jms/serializer/tests/Fixtures/Doctrine/BlogPost.php
index 322d5d4868932a69e1be0efb8f32026d7552085b..8a493fa6717f386d2ddcbf4dc22a1c09655a56d5 100644
--- a/vendor/jms/serializer/tests/Fixtures/Doctrine/BlogPost.php
+++ b/vendor/jms/serializer/tests/Fixtures/Doctrine/BlogPost.php
@@ -35,7 +35,7 @@ use JMS\Serializer\Annotation\XmlRoot;
 class BlogPost
 {
     /**
-     * @ORM\Id @ORM\Column(type="integer")
+     * @ORM\Id @ORM\Column(type="guid") @ORM\GeneratedValue(strategy="UUID")
      */
     protected $id;
 
diff --git a/vendor/jms/serializer/tests/Fixtures/PersonSecretWithVariables.php b/vendor/jms/serializer/tests/Fixtures/PersonSecretWithVariables.php
new file mode 100644
index 0000000000000000000000000000000000000000..6d81d98bd037d234b5da233dbddcbf7295590865
--- /dev/null
+++ b/vendor/jms/serializer/tests/Fixtures/PersonSecretWithVariables.php
@@ -0,0 +1,45 @@
+<?php
+
+/*
+ * Copyright 2016 Johannes M. Schmitt <schmittjoh@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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\Context;
+use JMS\Serializer\Metadata\PropertyMetadata;
+
+/**
+ */
+class PersonSecretWithVariables
+{
+    /**
+     * @Serializer\Type("string")
+     */
+    public $name;
+
+    /**
+     * @Serializer\Type("string")
+     * @Serializer\Expose(if="context.getDirection()==2 || object.test(property_metadata, context)")
+     */
+    public $gender;
+
+
+    public function test(PropertyMetadata $propertyMetadata, Context $context)
+    {
+        return true;
+    }
+}
diff --git a/vendor/jms/serializer/tests/Handler/FormErrorHandlerTest.php b/vendor/jms/serializer/tests/Handler/FormErrorHandlerTest.php
index f68b5df1cf719c429e17393727d39f932ed24f5e..4c44bc00f4fa055a872ad4be919e46c38b668c21 100644
--- a/vendor/jms/serializer/tests/Handler/FormErrorHandlerTest.php
+++ b/vendor/jms/serializer/tests/Handler/FormErrorHandlerTest.php
@@ -59,6 +59,20 @@ class FormErrorHandlerTest extends \PHPUnit_Framework_TestCase
         $this->assertSame('{}', $json);
     }
 
+    public function testErrorHandlerWithoutTranslator()
+    {
+        $this->handler = new FormErrorHandler();
+        $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 testSerializeHasFormError()
     {
         $form = $this->createForm();
@@ -98,6 +112,101 @@ class FormErrorHandlerTest extends \PHPUnit_Framework_TestCase
 
     }
 
+    public function testDefaultTranslationDomain()
+    {
+        /** @var Translator|\PHPUnit_Framework_MockObject_MockObject $translator */
+        $translator = $this->getMockBuilder('Symfony\Component\Translation\TranslatorInterface')->getMock();
+
+        $handler = new FormErrorHandler($translator);
+
+        $translator->expects($this->once())
+            ->method('trans')
+            ->with(
+                $this->equalTo('error!'),
+                $this->equalTo([]),
+                $this->equalTo('validators')
+            );
+
+        $formError = $this->getMockBuilder('Symfony\Component\Form\FormError')->disableOriginalConstructor()->getMock();
+        $formError->expects($this->once())->method('getMessageTemplate')->willReturn('error!');
+        $formError->expects($this->once())->method('getMessagePluralization')->willReturn(null);
+        $formError->expects($this->once())->method('getMessageParameters')->willReturn([]);
+
+        $this->invokeMethod($handler, 'getErrorMessage', [$formError,]);
+    }
+
+    public function testDefaultTranslationDomainWithPluralTranslation()
+    {
+        /** @var Translator|\PHPUnit_Framework_MockObject_MockObject $translator */
+        $translator = $this->getMockBuilder('Symfony\Component\Translation\TranslatorInterface')->getMock();
+
+        $handler = new FormErrorHandler($translator);
+
+        $translator->expects($this->once())
+            ->method('transChoice')
+            ->with(
+                $this->equalTo('error!'),
+                $this->equalTo(0),
+                $this->equalTo([]),
+                $this->equalTo('validators')
+            );
+
+        $formError = $this->getMockBuilder('Symfony\Component\Form\FormError')->disableOriginalConstructor()->getMock();
+        $formError->expects($this->once())->method('getMessageTemplate')->willReturn('error!');
+        $formError->expects($this->exactly(2))->method('getMessagePluralization')->willReturn(0);
+        $formError->expects($this->once())->method('getMessageParameters')->willReturn([]);
+
+        $this->invokeMethod($handler, 'getErrorMessage', [$formError,]);
+    }
+
+    public function testCustomTranslationDomain()
+    {
+        /** @var Translator|\PHPUnit_Framework_MockObject_MockObject $translator */
+        $translator = $this->getMockBuilder('Symfony\Component\Translation\TranslatorInterface')->getMock();
+
+        $handler = new FormErrorHandler($translator, 'custom_domain');
+
+        $translator->expects($this->once())
+            ->method('trans')
+            ->with(
+                $this->equalTo('error!'),
+                $this->equalTo([]),
+                $this->equalTo('custom_domain')
+            );
+
+        $formError = $this->getMockBuilder('Symfony\Component\Form\FormError')->disableOriginalConstructor()->getMock();
+        $formError->expects($this->once())->method('getMessageTemplate')->willReturn('error!');
+        $formError->expects($this->once())->method('getMessagePluralization')->willReturn(null);
+        $formError->expects($this->once())->method('getMessageParameters')->willReturn([]);
+
+        $this->invokeMethod($handler, 'getErrorMessage', [$formError,]);
+    }
+
+    public function testCustomTranslationDomainWithPluralTranslation()
+    {
+        /** @var Translator|\PHPUnit_Framework_MockObject_MockObject $translator */
+        $translator = $this->getMockBuilder('Symfony\Component\Translation\TranslatorInterface')->getMock();
+
+        $handler = new FormErrorHandler($translator, 'custom_domain');
+
+        $translator->expects($this->once())
+            ->method('transChoice')
+            ->with(
+                $this->equalTo('error!'),
+                $this->equalTo(0),
+                $this->equalTo([]),
+                $this->equalTo('custom_domain')
+            );
+
+        $formError = $this->getMockBuilder('Symfony\Component\Form\FormError')->disableOriginalConstructor()->getMock();
+        $formError->expects($this->once())->method('getMessageTemplate')->willReturn('error!');
+        $formError->expects($this->exactly(2))->method('getMessagePluralization')->willReturn(0);
+        $formError->expects($this->once())->method('getMessageParameters')->willReturn([]);
+
+        $this->invokeMethod($handler, 'getErrorMessage', [$formError,]);
+
+    }
+
     /**
      * @param string $name
      * @param EventDispatcherInterface $dispatcher
@@ -134,4 +243,12 @@ class FormErrorHandlerTest extends \PHPUnit_Framework_TestCase
     {
         return $this->getBuilder()->getForm();
     }
+
+    protected function invokeMethod($object, $method, array $args = [])
+    {
+        $reflectionMethod = new \ReflectionMethod($object, $method);
+        $reflectionMethod->setAccessible(true);
+
+        return $reflectionMethod->invokeArgs($object, $args);
+    }
 }
diff --git a/vendor/jms/serializer/tests/Metadata/Driver/DoctrineDriverTest.php b/vendor/jms/serializer/tests/Metadata/Driver/DoctrineDriverTest.php
index 41adbda3c86001d376fadb840465e9efb5275cd5..80845f3e3b4ef27aad2ac4e6653f15eda831f525 100644
--- a/vendor/jms/serializer/tests/Metadata/Driver/DoctrineDriverTest.php
+++ b/vendor/jms/serializer/tests/Metadata/Driver/DoctrineDriverTest.php
@@ -106,6 +106,16 @@ class DoctrineDriverTest extends \PHPUnit_Framework_TestCase
         $this->assertNull($doctrineMetadata->propertyMetadata['ref']->type);
     }
 
+    public function testGuidPropertyIsGivenStringType()
+    {
+        $metadata = $this->getMetadata();
+
+        $this->assertEquals(
+            array('name' => 'string', 'params' => array()),
+            $metadata->propertyMetadata['id']->type
+        );
+    }
+
     protected function getEntityManager()
     {
         $config = new Configuration();
diff --git a/vendor/jms/serializer/tests/Metadata/Driver/NullDriverTest.php b/vendor/jms/serializer/tests/Metadata/Driver/NullDriverTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..f55b07fd3e7823a3e4d0cc3554869fcfd5276a27
--- /dev/null
+++ b/vendor/jms/serializer/tests/Metadata/Driver/NullDriverTest.php
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * Copyright 2016 Johannes M. Schmitt <schmittjoh@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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\ClassMetadata;
+use JMS\Serializer\Metadata\Driver\NullDriver;
+
+class NullDriverTest extends \PHPUnit_Framework_TestCase
+{
+    public function testReturnsValidMetadata()
+    {
+        $driver = new NullDriver();
+
+        $metadata = $driver->loadMetadataForClass(new \ReflectionClass('stdClass'));
+
+        $this->assertInstanceOf(ClassMetadata::class, $metadata);
+        $this->assertCount(0, $metadata->propertyMetadata);
+    }
+}
diff --git a/vendor/jms/serializer/tests/Serializer/BaseSerializationTest.php b/vendor/jms/serializer/tests/Serializer/BaseSerializationTest.php
index d0e7c71f68e181ab61d3deff32bb1270dc627427..04badf548ca39a4211ae87cc6b7c9f8cc8291946 100644
--- a/vendor/jms/serializer/tests/Serializer/BaseSerializationTest.php
+++ b/vendor/jms/serializer/tests/Serializer/BaseSerializationTest.php
@@ -649,6 +649,7 @@ abstract class BaseSerializationTest extends \PHPUnit_Framework_TestCase
             $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(false, 'reviewed', $deserialized);
             $this->assertAttributeSame('1edf9bf60a32d89afbb85b2be849e3ceed5f5b10', 'etag', $deserialized);
             $this->assertAttributeEquals(new ArrayCollection(array($comment)), 'comments', $deserialized);
             $this->assertAttributeEquals(new Sequence(array($comment)), 'comments2', $deserialized);
@@ -675,6 +676,7 @@ abstract class BaseSerializationTest extends \PHPUnit_Framework_TestCase
             $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(false, 'reviewed', $deserialized);
             $this->assertAttributeEquals(new ArrayCollection(), 'comments', $deserialized);
             $this->assertEquals(null, $this->getField($deserialized, 'author'));
         }
diff --git a/vendor/jms/serializer/tests/Serializer/JsonSerializationTest.php b/vendor/jms/serializer/tests/Serializer/JsonSerializationTest.php
index 83c96c4b675f0d08f1bc5091a224d331ac038f8c..431955a345f6683e848b4460d7ab01ae8092925a 100644
--- a/vendor/jms/serializer/tests/Serializer/JsonSerializationTest.php
+++ b/vendor/jms/serializer/tests/Serializer/JsonSerializationTest.php
@@ -60,8 +60,8 @@ class JsonSerializationTest extends BaseSerializationTest
             $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['blog_post'] = '{"id":"what_a_nice_id","title":"This is a nice title.","created_at":"2011-07-30T00:00:00+0000","is_published":false,"is_reviewed":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,"is_reviewed":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}}';
diff --git a/vendor/jms/serializer/tests/Serializer/XmlSerializationTest.php b/vendor/jms/serializer/tests/Serializer/XmlSerializationTest.php
index 115af07e049255c36033d870ea15d3b907b0fba4..b2d1e2425493784de1e95166533ba5d21214020a 100644
--- a/vendor/jms/serializer/tests/Serializer/XmlSerializationTest.php
+++ b/vendor/jms/serializer/tests/Serializer/XmlSerializationTest.php
@@ -494,9 +494,11 @@ class XmlSerializationTest extends BaseSerializationTest
     {
         $namingStrategy = $this->getMockBuilder(PropertyNamingStrategyInterface::class)->getMock();
         $visitor = new XmlDeserializationVisitor($namingStrategy);
-        $element = simplexml_load_string('<empty xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>');
+        $xsdNilAsTrueElement = simplexml_load_string('<empty xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>');
+        $xsdNilAsOneElement = simplexml_load_string('<empty xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="1"/>');
 
-        $this->assertTrue($visitor->isNull($element));
+        $this->assertTrue($visitor->isNull($xsdNilAsTrueElement));
+        $this->assertTrue($visitor->isNull($xsdNilAsOneElement));
         $this->assertTrue($visitor->isNull(null));
     }
 
diff --git a/vendor/jms/serializer/tests/Serializer/xml/blog_post.xml b/vendor/jms/serializer/tests/Serializer/xml/blog_post.xml
index 0efe2865c6e9b15fefa9a8f41b06d5003f519e51..a9471dd97cfb4b2687050c2ca9bca8a6ce75f32d 100644
--- a/vendor/jms/serializer/tests/Serializer/xml/blog_post.xml
+++ b/vendor/jms/serializer/tests/Serializer/xml/blog_post.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<blog-post xmlns="http://example.com/namespace" xmlns:gd="http://schemas.google.com/g/2005" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" created_at="2011-07-30T00:00:00+0000" is_published="false" gd:etag="1edf9bf60a32d89afbb85b2be849e3ceed5f5b10">
+<blog-post xmlns="http://example.com/namespace" xmlns:gd="http://schemas.google.com/g/2005" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" created_at="2011-07-30T00:00:00+0000" is_published="false" is_reviewed="false" gd:etag="1edf9bf60a32d89afbb85b2be849e3ceed5f5b10">
   <id>what_a_nice_id</id>
   <dc:title><![CDATA[This is a nice title.]]></dc:title>
   <comment>
diff --git a/vendor/jms/serializer/tests/Serializer/xml/blog_post_unauthored.xml b/vendor/jms/serializer/tests/Serializer/xml/blog_post_unauthored.xml
index 5b5ba2b43717c76c3290fb0e73247c0dbb8e99bd..08ed951653af6ae5fe17fe456edd6c32270f19d4 100644
--- a/vendor/jms/serializer/tests/Serializer/xml/blog_post_unauthored.xml
+++ b/vendor/jms/serializer/tests/Serializer/xml/blog_post_unauthored.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<blog-post created_at="2011-07-30T00:00:00+0000" is_published="false" gd:etag="1edf9bf60a32d89afbb85b2be849e3ceed5f5b10">
+<blog-post created_at="2011-07-30T00:00:00+0000" is_published="false" is_reviewed="false" gd:etag="1edf9bf60a32d89afbb85b2be849e3ceed5f5b10">
   <title><![CDATA[This is a nice title.]]></title>
   <author xsi:nil="true"/>
 </blog-post>
diff --git a/vendor/jms/serializer/tests/Serializer/yml/blog_post.yml b/vendor/jms/serializer/tests/Serializer/yml/blog_post.yml
index fd557c18f43d3fbd2d28bfa2f8c3cfd82aa7f279..24d2e9e1a76636cf17185de026fb451d0a5b7acd 100644
--- a/vendor/jms/serializer/tests/Serializer/yml/blog_post.yml
+++ b/vendor/jms/serializer/tests/Serializer/yml/blog_post.yml
@@ -2,6 +2,7 @@ id: what_a_nice_id
 title: 'This is a nice title.'
 created_at: '2011-07-30T00:00:00+0000'
 is_published: false
+is_reviewed: false
 etag: 1edf9bf60a32d89afbb85b2be849e3ceed5f5b10
 comments:
     -
diff --git a/vendor/jms/serializer/tests/Serializer/yml/blog_post_unauthored.yml b/vendor/jms/serializer/tests/Serializer/yml/blog_post_unauthored.yml
index 5e080297a6360a653f34065b5b2dc0c961246f4b..b72061e51d74551470e12456ec8b1a3ada26610c 100644
--- a/vendor/jms/serializer/tests/Serializer/yml/blog_post_unauthored.yml
+++ b/vendor/jms/serializer/tests/Serializer/yml/blog_post_unauthored.yml
@@ -2,6 +2,7 @@ id: what_a_nice_id
 title: 'This is a nice title.'
 created_at: '2011-07-30T00:00:00+0000'
 is_published: false
+is_reviewed: false
 etag: 1edf9bf60a32d89afbb85b2be849e3ceed5f5b10
 comments: []
 comments2: []
diff --git a/vendor/jms/serializer/tests/SerializerBuilderTest.php b/vendor/jms/serializer/tests/SerializerBuilderTest.php
index 6494e66d6060cac9befd87e9767ddfc3682612d3..e3b7374923de09daf776495e83cdea7fe20e503c 100644
--- a/vendor/jms/serializer/tests/SerializerBuilderTest.php
+++ b/vendor/jms/serializer/tests/SerializerBuilderTest.php
@@ -26,6 +26,7 @@ use JMS\Serializer\Naming\CamelCaseNamingStrategy;
 use JMS\Serializer\SerializationContext;
 use JMS\Serializer\SerializerBuilder;
 use JMS\Serializer\Tests\Fixtures\PersonSecret;
+use JMS\Serializer\Tests\Fixtures\PersonSecretWithVariables;
 use Symfony\Component\ExpressionLanguage\ExpressionFunction;
 use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
 use Symfony\Component\Filesystem\Filesystem;
@@ -230,6 +231,24 @@ class SerializerBuilderTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals($json, $serializer->serialize($person, 'json'));
     }
 
+    public function testExpressionEngineWhenDeserializing()
+    {
+        $language = new ExpressionLanguage();
+        $this->builder->setExpressionEvaluator(new ExpressionEvaluator($language));
+
+        $serializer = $this->builder->build();
+
+        $person = new PersonSecretWithVariables();
+        $person->gender = 'f';
+        $person->name = 'mike';
+
+        $serialized = $serializer->serialize($person, 'json');
+        $this->assertEquals('{"name":"mike","gender":"f"}', $serialized);
+
+        $object = $serializer->deserialize($serialized, PersonSecretWithVariables::class, 'json');
+        $this->assertEquals($person, $object);
+    }
+
     protected function setUp()
     {
         $this->builder = SerializerBuilder::create();
diff --git a/vendor/myclabs/deep-copy/.gitignore b/vendor/myclabs/deep-copy/.gitignore
index 9354171049a2da87660457f3acf417d60ef16dd2..eef72f754044b3880e38ba890293b9fc0dc5733e 100755
--- a/vendor/myclabs/deep-copy/.gitignore
+++ b/vendor/myclabs/deep-copy/.gitignore
@@ -1,6 +1,3 @@
-.DS_Store
-.idea/*
-
-vendor/*
-composer.phar
-composer.lock
+/composer.phar
+/composer.lock
+/vendor/*
diff --git a/vendor/myclabs/deep-copy/.travis.yml b/vendor/myclabs/deep-copy/.travis.yml
index 347c6e759a9ac626d72127fc734ad64263ad39ae..89dc02af6150e4d60aa63ef680580fd4cc958d4c 100755
--- a/vendor/myclabs/deep-copy/.travis.yml
+++ b/vendor/myclabs/deep-copy/.travis.yml
@@ -1,30 +1,33 @@
 language: php
 
+sudo: false
+
 php:
-  - '5.5'
   - '5.6'
   - '7.0'
   - '7.1'
   - nightly
-  - hhvm
 
 matrix:
   fast_finish: true
   include:
-    - php: '5.4'
+    - php: '5.6'
       env: COMPOSER_FLAGS="--prefer-lowest"
   allow_failures:
     - php: nightly
-    - php: hhvm
+
+cache:
+  directories:
+    - $HOME/.composer/cache/files
 
 before_install:
   - |
-    if [ "$TRAVIS_PHP_VERSION" = "nightly" ] || "$TRAVIS_PHP_VERSION" = "7.1" ]; then
+    if [ "$TRAVIS_PHP_VERSION" = "nightly" ]; then
       COMPOSER_FLAGS="$COMPOSER_FLAGS --ignore-platform-reqs"
     fi;
 
 install:
-  - composer update -n --prefer-dist $COMPOSER_FLAGS
+  - composer update --no-interaction --no-progress --no-suggest --prefer-dist $COMPOSER_FLAGS
   - wget https://github.com/satooshi/php-coveralls/releases/download/v1.0.0/coveralls.phar
 
 before_script:
diff --git a/vendor/myclabs/deep-copy/README.md b/vendor/myclabs/deep-copy/README.md
index 853b76193de557197590611c0d83ccb8be2e3fde..7f010df2ab364d82254219e2bc59b4361f554165 100644
--- a/vendor/myclabs/deep-copy/README.md
+++ b/vendor/myclabs/deep-copy/README.md
@@ -2,7 +2,9 @@
 
 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=master)](https://travis-ci.org/myclabs/DeepCopy) [![Coverage Status](https://coveralls.io/repos/myclabs/DeepCopy/badge.png?branch=master)](https://coveralls.io/r/myclabs/DeepCopy?branch=master) [![Scrutinizer Quality Score](https://scrutinizer-ci.com/g/myclabs/DeepCopy/badges/quality-score.png?s=2747100c19b275f93a777e3297c6c12d1b68b934)](https://scrutinizer-ci.com/g/myclabs/DeepCopy/)
+[![Build Status](https://travis-ci.org/myclabs/DeepCopy.png?branch=master)](https://travis-ci.org/myclabs/DeepCopy)
+[![Coverage Status](https://coveralls.io/repos/myclabs/DeepCopy/badge.png?branch=master)](https://coveralls.io/r/myclabs/DeepCopy?branch=master)
+[![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)
 
 
@@ -20,15 +22,18 @@ DeepCopy helps you create deep copies (clones) of your objects. It is designed t
         1. [Specific property](#specific-property)
         1. [Type](#type)
     1. [Filters](#filters)
-        1. [`SetNullFilter`](#setnullfilter)
-        1. [`KeepFilter`](#keepfilter)
-        1. [`ReplaceFilter`](#replacefilter)
-        1. [`ShallowCopyFilter`](#doctrinecollectionfilter)
-        1. [`DoctrineCollectionFilter`](#doctrinecollectionfilter)
-        1. [`DoctrineEmptyCollectionFilter`](#doctrineemptycollectionfilter)
+        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`](#doctrinecollectionfilter-type-filter)
+1. [Edge cases](#edge-cases)
 1. [Contributing](#contributing)
     1. [Tests](#tests)
 
+
 ## How?
 
 Install with Composer:
@@ -42,8 +47,8 @@ Use simply:
 ```php
 use DeepCopy\DeepCopy;
 
-$deepCopy = new DeepCopy();
-$myCopy = $deepCopy->copy($myObject);
+$copier = new DeepCopy();
+$myCopy = $copier->copy($myObject);
 ```
 
 
@@ -57,7 +62,8 @@ $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.
+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?
 
@@ -65,37 +71,82 @@ 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.
+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->addFilter($filter, $matcher)`,
+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:
@@ -103,10 +154,11 @@ 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');
-// will apply a filter to any property of any objects named "id"
 ```
 
+
 #### Specific property
 
 The `PropertyMatcher` will match a specific property of a specific class:
@@ -114,46 +166,53 @@ 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');
-// will apply a filter to the property "id" of any objects of the class "MyClass"
 ```
 
+
 #### 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):
+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');
-// will apply a filter to any object that is an instance of 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`.
+- `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`
 
-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:
+#### `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;
 
-$myObject = MyClass::load(123);
-echo $myObject->id; // 123
+$object = MyClass::load(123);
+echo $object->id; // 123
+
+$copier = new DeepCopy();
+$copier->addFilter(new SetNullFilter(), new PropertyNameMatcher('id'));
 
-$deepCopy = new DeepCopy();
-$deepCopy->addFilter(new SetNullFilter(), new PropertyNameMatcher('id'));
-$myCopy = $deepCopy->copy($myObject);
+$copy = $copier->copy($object);
 
-echo $myCopy->id; // null
+echo $copy->id; // null
 ```
 
-#### `KeepFilter`
+
+#### `KeepFilter` (filter)
 
 If you want a property to remain untouched (for example, an association to an object):
 
@@ -162,129 +221,152 @@ use DeepCopy\DeepCopy;
 use DeepCopy\Filter\KeepFilter;
 use DeepCopy\Matcher\PropertyMatcher;
 
-$deepCopy = new DeepCopy();
-$deepCopy->addFilter(new KeepFilter(), new PropertyMatcher('MyClass', 'category'));
-$myCopy = $deepCopy->copy($myObject);
+$copier = new DeepCopy();
+$copier->addFilter(new KeepFilter(), new PropertyMatcher('MyClass', 'category'));
 
-// $myCopy->category has not been touched
+$copy = $copier->copy($object);
+// $copy->category has not been touched
 ```
 
-#### `ReplaceFilter`
 
-  1. If you want to replace the value of a property:
+#### `DoctrineCollectionFilter` (filter)
 
-  ```php
-  use DeepCopy\DeepCopy;
-  use DeepCopy\Filter\ReplaceFilter;
-  use DeepCopy\Matcher\PropertyMatcher;
+If you use Doctrine and want to copy an entity, you will need to use the `DoctrineCollectionFilter`:
 
-  $deepCopy = new DeepCopy();
-  $callback = function ($currentValue) {
-      return $currentValue . ' (copy)'
-  };
-  $deepCopy->addFilter(new ReplaceFilter($callback), new PropertyMatcher('MyClass', 'title'));
-  $myCopy = $deepCopy->copy($myObject);
+```php
+use DeepCopy\DeepCopy;
+use DeepCopy\Filter\Doctrine\DoctrineCollectionFilter;
+use DeepCopy\Matcher\PropertyTypeMatcher;
 
-  // $myCopy->title will contain the data returned by the callback, e.g. 'The title (copy)'
-  ```
+$copier = new DeepCopy();
+$copier->addFilter(new DoctrineCollectionFilter(), new PropertyTypeMatcher('Doctrine\Common\Collections\Collection'));
 
-  2. If you want to replace whole element:
+$copy = $copier->copy($object);
+```
 
-  ```php
-  use DeepCopy\DeepCopy;
-  use DeepCopy\TypeFilter\ReplaceFilter;
-  use DeepCopy\TypeMatcher\TypeMatcher;
 
-  $deepCopy = new DeepCopy();
-  $callback = function (MyClass $myClass) {
-      return get_class($myClass);
-  };
-  $deepCopy->addTypeFilter(new ReplaceFilter($callback), new TypeMatcher('MyClass'));
-  $myCopy = $deepCopy->copy(array(new MyClass, 'some string', new MyClass));
+#### `DoctrineEmptyCollectionFilter` (filter)
 
-  // $myCopy will contain ['MyClass', 'some string', 'MyClass']
-  ```
+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;
 
-The `$callback` parameter of the `ReplaceFilter` constructor accepts any PHP callable.
+$copier = new DeepCopy();
+$copier->addFilter(new DoctrineEmptyCollectionFilter(), new PropertyMatcher('MyClass', 'myProperty'));
 
-#### `ShallowCopyFilter`
+$copy = $copier->copy($object);
 
-Stop *DeepCopy* from recursively copying element, using standard `clone` instead:
+// $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\TypeFilter\ShallowCopyFilter;
-use DeepCopy\TypeMatcher\TypeMatcher;
-use Mockery as m;
+use DeepCopy\Filter\Doctrine\DoctrineProxyFilter;
+use DeepCopy\Matcher\Doctrine\DoctrineProxyMatcher;
 
-$this->deepCopy = new DeepCopy();
-$this->deepCopy->addTypeFilter(
-	new ShallowCopyFilter,
-	new TypeMatcher(m\MockInterface::class)
-);
+$copier = new DeepCopy();
+$copier->addFilter(new DoctrineProxyFilter(), new DoctrineProxyMatcher());
 
-$myServiceWithMocks = new MyService(m::mock(MyDependency1::class), m::mock(MyDependency2::class));
-// all mocks will be just cloned, not deep-copied
+$copy = $copier->copy($object);
+
+// $copy should now contain a clone of all entities, including those that were not yet fully loaded.
 ```
 
-#### `DoctrineCollectionFilter`
 
-If you use Doctrine and want to copy an entity, you will need to use the `DoctrineCollectionFilter`:
+#### `ReplaceFilter` (type filter)
+
+1. If you want to replace the value of a property:
 
 ```php
 use DeepCopy\DeepCopy;
-use DeepCopy\Filter\Doctrine\DoctrineCollectionFilter;
-use DeepCopy\Matcher\PropertyTypeMatcher;
+use DeepCopy\Filter\ReplaceFilter;
+use DeepCopy\Matcher\PropertyMatcher;
 
-$deepCopy = new DeepCopy();
-$deepCopy->addFilter(new DoctrineCollectionFilter(), new PropertyTypeMatcher('Doctrine\Common\Collections\Collection'));
-$myCopy = $deepCopy->copy($myObject);
-```
+$copier = new DeepCopy();
+$callback = function ($currentValue) {
+  return $currentValue . ' (copy)'
+};
+$copier->addFilter(new ReplaceFilter($callback), new PropertyMatcher('MyClass', 'title'));
 
-#### `DoctrineEmptyCollectionFilter`
+$copy = $copier->copy($object);
 
-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`
+// $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\Filter\Doctrine\DoctrineEmptyCollectionFilter;
-use DeepCopy\Matcher\PropertyMatcher;
+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'));
 
-$deepCopy = new DeepCopy();
-$deepCopy->addFilter(new DoctrineEmptyCollectionFilter(), new PropertyMatcher('MyClass', 'myProperty'));
-$myCopy = $deepCopy->copy($myObject);
+$copy = $copier->copy([new MyClass, 'some string', new MyClass]);
 
-// $myCopy->myProperty will return an empty collection
+// $copy will contain ['MyClass', 'some string', 'MyClass']
 ```
 
-#### `DoctrineProxyFilter`
 
-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!**
+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\Filter\Doctrine\DoctrineProxyFilter;
-use DeepCopy\Matcher\Doctrine\DoctrineProxyMatcher;
+use DeepCopy\TypeFilter\ShallowCopyFilter;
+use DeepCopy\TypeMatcher\TypeMatcher;
+use Mockery as m;
 
-$deepCopy = new DeepCopy();
-$deepCopy->addFilter(new DoctrineProxyFilter(), new DoctrineProxyMatcher());
-$myCopy = $deepCopy->copy($myObject);
+$this->deepCopy = new DeepCopy();
+$this->deepCopy->addTypeFilter(
+	new ShallowCopyFilter,
+	new TypeMatcher(m\MockInterface::class)
+);
 
-// $myCopy should now contain a clone of all entities, including those that were not yet fully loaded.
+$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
-phpunit
+vendor/bin/phpunit
 ```
diff --git a/vendor/myclabs/deep-copy/composer.json b/vendor/myclabs/deep-copy/composer.json
index d20287abc79a34ac0729544e5459de1291c92eab..d5d3a779851a7c35784e4c2d41edc740c17d47fb 100644
--- a/vendor/myclabs/deep-copy/composer.json
+++ b/vendor/myclabs/deep-copy/composer.json
@@ -3,19 +3,33 @@
     "type": "library",
     "description": "Create deep copies (clones) of your objects",
     "keywords": ["clone", "copy", "duplicate", "object", "object graph"],
-    "homepage": "https://github.com/myclabs/DeepCopy",
     "license": "MIT",
+
     "autoload": {
-        "psr-4": { "DeepCopy\\": "src/DeepCopy/" }
+        "psr-4": {
+            "DeepCopy\\": "src/DeepCopy/"
+        },
+        "files": [
+            "src/DeepCopy/deep_copy.php"
+        ]
     },
     "autoload-dev": {
-        "psr-4": { "DeepCopyTest\\": "tests/DeepCopyTest/" }
+        "psr-4": {
+            "DeepCopy\\": "fixtures/",
+            "DeepCopyTest\\": "tests/DeepCopyTest/"
+        }
     },
+
     "require": {
-        "php": ">=5.4.0"
+        "php": "^5.6 || ^7.0"
     },
     "require-dev": {
-        "doctrine/collections": "1.*",
-        "phpunit/phpunit": "~4.1"
+        "doctrine/collections": "^1.0",
+        "doctrine/common": "^2.6",
+        "phpunit/phpunit": "^4.1"
+    },
+
+    "config": {
+        "sort-packages": true
     }
 }
diff --git a/vendor/myclabs/deep-copy/fixtures/f001/A.php b/vendor/myclabs/deep-copy/fixtures/f001/A.php
new file mode 100644
index 0000000000000000000000000000000000000000..648d5dfff4376695730abd2881c88d6a9692ea75
--- /dev/null
+++ b/vendor/myclabs/deep-copy/fixtures/f001/A.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace DeepCopy\f001;
+
+class A
+{
+    private $aProp;
+
+    public function getAProp()
+    {
+        return $this->aProp;
+    }
+
+    public function setAProp($prop)
+    {
+        $this->aProp = $prop;
+
+        return $this;
+    }
+}
diff --git a/vendor/myclabs/deep-copy/fixtures/f001/B.php b/vendor/myclabs/deep-copy/fixtures/f001/B.php
new file mode 100644
index 0000000000000000000000000000000000000000..462bb44e80a91716177dc155bde7b0a6f0f94c0a
--- /dev/null
+++ b/vendor/myclabs/deep-copy/fixtures/f001/B.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace DeepCopy\f001;
+
+class B extends A
+{
+    private $bProp;
+
+    public function getBProp()
+    {
+        return $this->bProp;
+    }
+
+    public function setBProp($prop)
+    {
+        $this->bProp = $prop;
+
+        return $this;
+    }
+}
diff --git a/vendor/myclabs/deep-copy/fixtures/f002/A.php b/vendor/myclabs/deep-copy/fixtures/f002/A.php
new file mode 100644
index 0000000000000000000000000000000000000000..d9aa5c35b59cb9edb938949eff9adf5c3e240745
--- /dev/null
+++ b/vendor/myclabs/deep-copy/fixtures/f002/A.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace DeepCopy\f002;
+
+class A
+{
+    private $prop1;
+    private $prop2;
+
+    public function getProp1()
+    {
+        return $this->prop1;
+    }
+
+    public function setProp1($prop)
+    {
+        $this->prop1 = $prop;
+
+        return $this;
+    }
+
+    public function getProp2()
+    {
+        return $this->prop2;
+    }
+
+    public function setProp2($prop)
+    {
+        $this->prop2 = $prop;
+
+        return $this;
+    }
+}
diff --git a/vendor/myclabs/deep-copy/fixtures/f003/Foo.php b/vendor/myclabs/deep-copy/fixtures/f003/Foo.php
new file mode 100644
index 0000000000000000000000000000000000000000..9cd76224a1342e7005617c562dfc84060f22eb61
--- /dev/null
+++ b/vendor/myclabs/deep-copy/fixtures/f003/Foo.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace DeepCopy\f003;
+
+class Foo
+{
+    private $name;
+    private $prop;
+
+    public function __construct($name)
+    {
+        $this->name = $name;
+    }
+
+    public function getProp()
+    {
+        return $this->prop;
+    }
+
+    public function setProp($prop)
+    {
+        $this->prop = $prop;
+
+        return $this;
+    }
+}
\ No newline at end of file
diff --git a/vendor/myclabs/deep-copy/fixtures/f004/UnclonableItem.php b/vendor/myclabs/deep-copy/fixtures/f004/UnclonableItem.php
new file mode 100644
index 0000000000000000000000000000000000000000..82c6c67cdd75ff9a6764b400e00ef5d908737e64
--- /dev/null
+++ b/vendor/myclabs/deep-copy/fixtures/f004/UnclonableItem.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace DeepCopy\f004;
+
+use BadMethodCallException;
+
+class UnclonableItem
+{
+    private function __clone()
+    {
+        throw new BadMethodCallException('Unsupported call.');
+    }
+}
diff --git a/vendor/myclabs/deep-copy/fixtures/f005/Foo.php b/vendor/myclabs/deep-copy/fixtures/f005/Foo.php
new file mode 100644
index 0000000000000000000000000000000000000000..a4c86c6099055cd5b4cc48367f631bdf280e190f
--- /dev/null
+++ b/vendor/myclabs/deep-copy/fixtures/f005/Foo.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace DeepCopy\f005;
+
+class Foo
+{
+    public $cloned = false;
+
+    public function __clone()
+    {
+        $this->cloned = true;
+    }
+}
diff --git a/vendor/myclabs/deep-copy/fixtures/f006/A.php b/vendor/myclabs/deep-copy/fixtures/f006/A.php
new file mode 100644
index 0000000000000000000000000000000000000000..d9efb11667cee5132e7c1b0b39be697a51a66446
--- /dev/null
+++ b/vendor/myclabs/deep-copy/fixtures/f006/A.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace DeepCopy\f006;
+
+class A
+{
+    public $cloned = false;
+    private $aProp;
+
+    public function getAProp()
+    {
+        return $this->aProp;
+    }
+
+    public function setAProp($prop)
+    {
+        $this->aProp = $prop;
+
+        return $this;
+    }
+
+    public function __clone()
+    {
+        $this->cloned = true;
+    }
+}
diff --git a/vendor/myclabs/deep-copy/fixtures/f006/B.php b/vendor/myclabs/deep-copy/fixtures/f006/B.php
new file mode 100644
index 0000000000000000000000000000000000000000..1f80b3d44f522eb5bee2816f42a1681a44340dea
--- /dev/null
+++ b/vendor/myclabs/deep-copy/fixtures/f006/B.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace DeepCopy\f006;
+
+class B
+{
+    public $cloned = false;
+    private $bProp;
+
+    public function getBProp()
+    {
+        return $this->bProp;
+    }
+
+    public function setBProp($prop)
+    {
+        $this->bProp = $prop;
+
+        return $this;
+    }
+
+    public function __clone()
+    {
+        $this->cloned = true;
+    }
+}
diff --git a/vendor/myclabs/deep-copy/fixtures/f007/FooDateInterval.php b/vendor/myclabs/deep-copy/fixtures/f007/FooDateInterval.php
new file mode 100644
index 0000000000000000000000000000000000000000..e16bc6aa679375c828f495d9d1604f989fa5a213
--- /dev/null
+++ b/vendor/myclabs/deep-copy/fixtures/f007/FooDateInterval.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace DeepCopy\f007;
+
+use DateInterval;
+
+class FooDateInterval extends DateInterval
+{
+    public $cloned = false;
+
+    public function __clone()
+    {
+        $this->cloned = true;
+    }
+}
diff --git a/vendor/myclabs/deep-copy/fixtures/f007/FooDateTimeZone.php b/vendor/myclabs/deep-copy/fixtures/f007/FooDateTimeZone.php
new file mode 100644
index 0000000000000000000000000000000000000000..6f4e61fe96c62831e48f2a3fd3059fa7eabff1d2
--- /dev/null
+++ b/vendor/myclabs/deep-copy/fixtures/f007/FooDateTimeZone.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace DeepCopy\f007;
+
+use DateTimeZone;
+
+class FooDateTimeZone extends DateTimeZone
+{
+    public $cloned = false;
+
+    public function __clone()
+    {
+        $this->cloned = true;
+    }
+}
diff --git a/vendor/myclabs/deep-copy/fixtures/f008/A.php b/vendor/myclabs/deep-copy/fixtures/f008/A.php
new file mode 100644
index 0000000000000000000000000000000000000000..88471d013c017060ffd8310929a10662feaae7e1
--- /dev/null
+++ b/vendor/myclabs/deep-copy/fixtures/f008/A.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace DeepCopy\f008;
+
+class A
+{
+    private $foo;
+
+    public function __construct($foo)
+    {
+        $this->foo = $foo;
+    }
+
+    public function getFoo()
+    {
+        return $this->foo;
+    }
+}
diff --git a/vendor/myclabs/deep-copy/fixtures/f008/B.php b/vendor/myclabs/deep-copy/fixtures/f008/B.php
new file mode 100644
index 0000000000000000000000000000000000000000..6053092d751d9761d560c39811a9f05b196a7d65
--- /dev/null
+++ b/vendor/myclabs/deep-copy/fixtures/f008/B.php
@@ -0,0 +1,7 @@
+<?php
+
+namespace DeepCopy\f008;
+
+class B extends A
+{
+}
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php b/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php
index aee9e7296190c903f28659a3403e5f826ae86ab0..d461ff6d42439d6b2d7222b9c8ae758a267f750e 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php
@@ -2,37 +2,48 @@
 
 namespace DeepCopy;
 
+use DateInterval;
+use DateTimeInterface;
+use DateTimeZone;
 use DeepCopy\Exception\CloneException;
 use DeepCopy\Filter\Filter;
 use DeepCopy\Matcher\Matcher;
-use DeepCopy\TypeFilter\Spl\SplDoublyLinkedList;
+use DeepCopy\TypeFilter\Date\DateIntervalFilter;
+use DeepCopy\TypeFilter\Spl\SplDoublyLinkedListFilter;
 use DeepCopy\TypeFilter\TypeFilter;
 use DeepCopy\TypeMatcher\TypeMatcher;
+use ReflectionObject;
 use ReflectionProperty;
 use DeepCopy\Reflection\ReflectionHelper;
+use SplDoublyLinkedList;
 
 /**
- * DeepCopy
+ * @final
  */
 class DeepCopy
 {
     /**
-     * @var array
+     * @var object[] List of objects copied.
      */
     private $hashMap = [];
 
     /**
      * Filters to apply.
-     * @var array
+     *
+     * @var array Array of ['filter' => Filter, 'matcher' => Matcher] pairs.
      */
     private $filters = [];
 
     /**
      * Type Filters to apply.
-     * @var array
+     *
+     * @var array Array of ['filter' => Filter, 'matcher' => Matcher] pairs.
      */
     private $typeFilters = [];
 
+    /**
+     * @var bool
+     */
     private $skipUncloneable = false;
 
     /**
@@ -48,23 +59,29 @@ class DeepCopy
     {
         $this->useCloneMethod = $useCloneMethod;
 
-        $this->addTypeFilter(new SplDoublyLinkedList($this), new TypeMatcher('\SplDoublyLinkedList'));
+        $this->addTypeFilter(new DateIntervalFilter(), new TypeMatcher(DateInterval::class));
+        $this->addTypeFilter(new SplDoublyLinkedListFilter($this), new TypeMatcher(SplDoublyLinkedList::class));
     }
 
     /**
-     * Cloning uncloneable properties won't throw exception.
+     * 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;
     }
 
     /**
-     * Perform a deep copy of the object.
+     * Deep copies the given object.
+     *
      * @param mixed $object
+     *
      * @return mixed
      */
     public function copy($object)
@@ -90,7 +107,6 @@ class DeepCopy
         ];
     }
 
-
     private function recursiveCopy($var)
     {
         // Matches Type Filter
@@ -102,14 +118,17 @@ class DeepCopy
         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);
     }
@@ -129,8 +148,12 @@ class DeepCopy
     }
 
     /**
-     * Copy an object
+     * Copies an object.
+     *
      * @param object $object
+     *
+     * @throws CloneException
+     *
      * @return object
      */
     private function copyObject($object)
@@ -141,29 +164,35 @@ class DeepCopy
             return $this->hashMap[$objectHash];
         }
 
-        $reflectedObject = new \ReflectionObject($object);
-
-        if (false === $isCloneable = $reflectedObject->isCloneable() and $this->skipUncloneable) {
-            $this->hashMap[$objectHash] = $object;
-            return $object;
-        }
+        $reflectedObject = new ReflectionObject($object);
+        $isCloneable = $reflectedObject->isCloneable();
 
         if (false === $isCloneable) {
-            throw new CloneException(sprintf(
-                'Class "%s" is not cloneable.',
-                $reflectedObject->getName()
-            ));
+            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 $object;
+            return $newObject;
         }
 
-        if ($newObject instanceof \DateTimeInterface) {
+        if ($newObject instanceof DateTimeInterface || $newObject instanceof DateTimeZone) {
             return $newObject;
         }
+
         foreach (ReflectionHelper::getProperties($reflectedObject) as $property) {
             $this->copyObjectProperty($newObject, $property);
         }
@@ -193,6 +222,7 @@ class DeepCopy
                         return $this->recursiveCopy($object);
                     }
                 );
+
                 // If a filter matches, we stop processing this property
                 return;
             }
@@ -206,10 +236,12 @@ class DeepCopy
     }
 
     /**
-     * Returns first filter that matches variable, NULL if no such filter found.
+     * 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)
@@ -228,10 +260,13 @@ class DeepCopy
     }
 
     /**
-     * Returns first element that matches predicate, NULL if no such element found.
-     * @param array    $elements
+     * 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 mixed|null
+     *
+     * @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)
     {
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php b/vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php
index dd3b617b08166e040401f5bf8498681b9be04f95..c046706a2756c5892fa6a6223360937e95aeee23 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php
@@ -1,6 +1,9 @@
 <?php
+
 namespace DeepCopy\Exception;
 
-class CloneException extends \UnexpectedValueException
+use UnexpectedValueException;
+
+class CloneException extends UnexpectedValueException
 {
 } 
\ No newline at end of file
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php b/vendor/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php
new file mode 100644
index 0000000000000000000000000000000000000000..9702101a9b1b4ca7015181c0006bb1caf6d9d3f5
--- /dev/null
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php
@@ -0,0 +1,9 @@
+<?php
+
+namespace DeepCopy\Exception;
+
+use ReflectionException;
+
+class PropertyException extends ReflectionException
+{
+}
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php
index 28562ed40abd5bb02a0ca2a6c133e02f4af5b7f7..e6d937710418676bcb2db55b6a62a8a17b8d0111 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php
@@ -3,19 +3,21 @@
 namespace DeepCopy\Filter\Doctrine;
 
 use DeepCopy\Filter\Filter;
-use ReflectionProperty;
+use DeepCopy\Reflection\ReflectionHelper;
 
 /**
- * Set a null value for a property
+ * @final
  */
 class DoctrineCollectionFilter implements Filter
 {
     /**
+     * Copies the object property doctrine collection.
+     *
      * {@inheritdoc}
      */
     public function apply($object, $property, $objectCopier)
     {
-        $reflectionProperty = new ReflectionProperty($object, $property);
+        $reflectionProperty = ReflectionHelper::getProperty($object, $property);
 
         $reflectionProperty->setAccessible(true);
         $oldCollection = $reflectionProperty->getValue($object);
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php
index f9b3f7acf1f0550f4ab0dd0f65d7b361ab234a33..7b33fd5478f87ef28c2b5adda96ca04b0440c558 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php
@@ -3,12 +3,16 @@
 namespace DeepCopy\Filter\Doctrine;
 
 use DeepCopy\Filter\Filter;
+use DeepCopy\Reflection\ReflectionHelper;
 use Doctrine\Common\Collections\ArrayCollection;
 
+/**
+ * @final
+ */
 class DoctrineEmptyCollectionFilter implements Filter
 {
     /**
-     * Apply the filter to the object.
+     * Sets the object property to an empty doctrine collection.
      *
      * @param object   $object
      * @param string   $property
@@ -16,7 +20,7 @@ class DoctrineEmptyCollectionFilter implements Filter
      */
     public function apply($object, $property, $objectCopier)
     {
-        $reflectionProperty = new \ReflectionProperty($object, $property);
+        $reflectionProperty = ReflectionHelper::getProperty($object, $property);
         $reflectionProperty->setAccessible(true);
 
         $reflectionProperty->setValue($object, new ArrayCollection());
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php
index a855277af88be08d22695cc2b2e86433fbef36c7..8bee8f769a5594c5a984f3452f227f436fdd3f03 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php
@@ -5,12 +5,14 @@ namespace DeepCopy\Filter\Doctrine;
 use DeepCopy\Filter\Filter;
 
 /**
- * Trigger the magic method __load() on a Doctrine Proxy class to load the
- * actual entity from the database.
+ * @final
  */
 class DoctrineProxyFilter implements Filter
 {
     /**
+     * Triggers the magic method __load() on a Doctrine Proxy class to load the
+     * actual entity from the database.
+     *
      * {@inheritdoc}
      */
     public function apply($object, $property, $objectCopier)
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php
index 48076a1b007060641d662e9c1abe389f2a81084f..85ba18ce1144c80206ef2b7b163fef2f5bf86a16 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php
@@ -8,7 +8,8 @@ namespace DeepCopy\Filter;
 interface Filter
 {
     /**
-     * Apply the filter to the object.
+     * Applies the filter to the object.
+     *
      * @param object   $object
      * @param string   $property
      * @param callable $objectCopier
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php
index 14c55e750334850704ff434ddd65d934f0ad6bf0..4b11a081ba34441fc1eee89a4a53e4c5caaedd38 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php
@@ -2,12 +2,11 @@
 
 namespace DeepCopy\Filter;
 
-/**
- * Keep the value of a property
- */
 class KeepFilter implements Filter
 {
     /**
+     * Keeps the value of the object property.
+     *
      * {@inheritdoc}
      */
     public function apply($object, $property, $objectCopier)
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php
index fce7114b47cb36ce65711760ba77a77bc41aa29c..7aca593bbc16172b5eaef83ddaed4e72a8aed207 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php
@@ -2,8 +2,10 @@
 
 namespace DeepCopy\Filter;
 
+use DeepCopy\Reflection\ReflectionHelper;
+
 /**
- * Replace the value of a property
+ * @final
  */
 class ReplaceFilter implements Filter
 {
@@ -21,11 +23,13 @@ class ReplaceFilter implements Filter
     }
 
     /**
+     * Replaces the object property by the result of the callback called with the object property.
+     *
      * {@inheritdoc}
      */
     public function apply($object, $property, $objectCopier)
     {
-        $reflectionProperty = new \ReflectionProperty($object, $property);
+        $reflectionProperty = ReflectionHelper::getProperty($object, $property);
         $reflectionProperty->setAccessible(true);
 
         $value = call_user_func($this->callback, $reflectionProperty->getValue($object));
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php
index d48f15b62a64995d346780602b5426b53a014e78..bea86b884877d04852eee7b824a53d751f4318dd 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php
@@ -2,19 +2,21 @@
 
 namespace DeepCopy\Filter;
 
-use ReflectionProperty;
+use DeepCopy\Reflection\ReflectionHelper;
 
 /**
- * Set a null value for a property
+ * @final
  */
 class SetNullFilter implements Filter
 {
     /**
+     * Sets the object property to null.
+     *
      * {@inheritdoc}
      */
     public function apply($object, $property, $objectCopier)
     {
-        $reflectionProperty = new ReflectionProperty($object, $property);
+        $reflectionProperty = ReflectionHelper::getProperty($object, $property);
 
         $reflectionProperty->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
index 6a7bcf5dd2b1e614ed8c22dfeecb981b34a68dfa..ec8856f50355b1b20755f5bf5789298cb4ef9ab2 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php
@@ -6,11 +6,13 @@ use DeepCopy\Matcher\Matcher;
 use Doctrine\Common\Persistence\Proxy;
 
 /**
- * Match a Doctrine Proxy class.
+ * @final
  */
 class DoctrineProxyMatcher implements Matcher
 {
     /**
+     * Matches a Doctrine Proxy class.
+     *
      * {@inheritdoc}
      */
     public function matches($object, $property)
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php
index 91eb7c906a01a96b48c2c37799fd7be066634808..d67f3cac6e31c40d6a63a281f105a194399e26b1 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php
@@ -2,14 +2,12 @@
 
 namespace DeepCopy\Matcher;
 
-/**
- * Matcher interface
- */
 interface Matcher
 {
     /**
      * @param object $object
      * @param string $property
+     *
      * @return boolean
      */
     public function matches($object, $property);
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php
index 03ef68c0f4407a51731a8b335eb3384f93eb31eb..073b20cb8288aa96ec4382a2287ff5ea9ac9c51d 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php
@@ -3,7 +3,7 @@
 namespace DeepCopy\Matcher;
 
 /**
- * Match a specific property of a specific class
+ * @final
  */
 class PropertyMatcher implements Matcher
 {
@@ -28,10 +28,12 @@ class PropertyMatcher implements Matcher
     }
 
     /**
+     * Matches a specific property of a specific class.
+     *
      * {@inheritdoc}
      */
     public function matches($object, $property)
     {
-        return ($object instanceof $this->class) && ($property == $this->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
index 9d9575f03a12e7acc9a4ebee04dd88c4550110c9..c8ec0d2bc1751fff332ae872da4d96d73ba76d2a 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php
@@ -3,7 +3,7 @@
 namespace DeepCopy\Matcher;
 
 /**
- * Match a property by its name
+ * @final
  */
 class PropertyNameMatcher implements Matcher
 {
@@ -21,6 +21,8 @@ class PropertyNameMatcher implements Matcher
     }
 
     /**
+     * Matches a property by its name.
+     *
      * {@inheritdoc}
      */
     public function matches($object, $property)
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php
index da116c16d2527b74ea2ab26d7c402bb4e3be1eed..a6b0c0bc52e32d8d5f1a2344e9e4f0d8a2272744 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php
@@ -2,13 +2,16 @@
 
 namespace DeepCopy\Matcher;
 
-use ReflectionProperty;
+use DeepCopy\Reflection\ReflectionHelper;
+use ReflectionException;
 
 /**
- * Match a property by its type
+ * Matches a property by its type.
  *
  * It is recommended to use {@see DeepCopy\TypeFilter\TypeFilter} instead, as it applies on all occurrences
  * of given type in copied context (eg. array elements), not just on object properties.
+ *
+ * @final
  */
 class PropertyTypeMatcher implements Matcher
 {
@@ -30,7 +33,12 @@ class PropertyTypeMatcher implements Matcher
      */
     public function matches($object, $property)
     {
-        $reflectionProperty = new ReflectionProperty($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
index a094e729434b32f1596716b2df0a7602ff766490..742410cb2adde479d7e02629b0915ffb0624a05c 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php
@@ -2,6 +2,12 @@
 
 namespace DeepCopy\Reflection;
 
+use DeepCopy\Exception\PropertyException;
+use ReflectionClass;
+use ReflectionException;
+use ReflectionObject;
+use ReflectionProperty;
+
 class ReflectionHelper
 {
     /**
@@ -12,10 +18,11 @@ class ReflectionHelper
      * @author muratyaman@gmail.com
      * @see http://php.net/manual/en/reflectionclass.getproperties.php
      *
-     * @param \ReflectionClass $ref
-     * @return \ReflectionProperty[]
+     * @param ReflectionClass $ref
+     *
+     * @return ReflectionProperty[]
      */
-    public static function getProperties(\ReflectionClass $ref)
+    public static function getProperties(ReflectionClass $ref)
     {
         $props = $ref->getProperties();
         $propsArr = array();
@@ -36,4 +43,36 @@ class ReflectionHelper
 
         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 0000000000000000000000000000000000000000..becd1cfffda49054ffb77e86e2a539db34990eeb
--- /dev/null
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace DeepCopy\TypeFilter\Date;
+
+use DateInterval;
+use DeepCopy\TypeFilter\TypeFilter;
+
+/**
+ * @final
+ *
+ * @deprecated Will be removed in 2.0. This filter will no longer be necessary in PHP 7.1+.
+ */
+class DateIntervalFilter implements TypeFilter
+{
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param DateInterval $element
+     *
+     * @see http://news.php.net/php.bugs/205076
+     */
+    public function apply($element)
+    {
+        $copy = new DateInterval('P0D');
+
+        foreach ($element as $propertyName => $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
index 0e42b0fe114e4e81555a5253d4479078e3930707..164f8b8e26447acde3b3030a0fd9022fb1734a40 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php
@@ -2,6 +2,9 @@
 
 namespace DeepCopy\TypeFilter;
 
+/**
+ * @final
+ */
 class ReplaceFilter implements TypeFilter
 {
     /**
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php
index 408d18bb72693b976d7d83bed9ced538907a25d8..a5fbd7a2b453f52f5685b1c52b1e493df96c8f02 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php
@@ -2,6 +2,9 @@
 
 namespace DeepCopy\TypeFilter;
 
+/**
+ * @final
+ */
 class ShallowCopyFilter implements TypeFilter
 {
     /**
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php
index 2bdc537346efea12b1c0dd80b890681c480e5943..c5644cff8695ca58ba5a6580070e9858ef553079 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php
@@ -2,36 +2,9 @@
 
 namespace DeepCopy\TypeFilter\Spl;
 
-use DeepCopy\DeepCopy;
-use DeepCopy\TypeFilter\TypeFilter;
-
-class SplDoublyLinkedList implements TypeFilter
+/**
+ * @deprecated Use {@see SplDoublyLinkedListFilter} instead.
+ */
+class SplDoublyLinkedList extends SplDoublyLinkedListFilter
 {
-    /**
-     * @var DeepCopy
-     */
-    private $deepCopy;
-
-    public function __construct(DeepCopy $deepCopy)
-    {
-        $this->deepCopy = $deepCopy;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function apply($element)
-    {
-        $newElement = clone $element;
-
-        if ($element instanceof \SplDoublyLinkedList) {
-            // Replace each element in the list with a deep copy of itself
-            for ($i = 1; $i <= $newElement->count(); $i++) {
-                $newElement->push($this->deepCopy->copy($newElement->shift()));
-            }
-        }
-
-        return $newElement;
-
-    }
 }
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php
new file mode 100644
index 0000000000000000000000000000000000000000..c33be45807f0c83d49128c7cb70be8d6915cddc9
--- /dev/null
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace DeepCopy\TypeFilter\Spl;
+
+use Closure;
+use DeepCopy\DeepCopy;
+use DeepCopy\TypeFilter\TypeFilter;
+use SplDoublyLinkedList;
+
+/**
+ * @final
+ */
+class SplDoublyLinkedListFilter implements TypeFilter
+{
+    private $copier;
+
+    public function __construct(DeepCopy $copier)
+    {
+        $this->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
index a37a8ba88096a49ed085fac6126a6dfc17248825..5785a7da9ecd523bd8d79af9e0fce69d1864186b 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php
@@ -5,7 +5,8 @@ namespace DeepCopy\TypeFilter;
 interface TypeFilter
 {
     /**
-     * Apply the filter to the object.
+     * Applies the filter to the object.
+     *
      * @param mixed $element
      */
     public function apply($element);
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php
index e640f31e2ba78670c3839ec8450924d259674bc0..a563cb294e6b8b7725a13936174d714bce034356 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php
@@ -2,9 +2,6 @@
 
 namespace DeepCopy\TypeMatcher;
 
-/**
- * TypeMatcher class
- */
 class TypeMatcher
 {
     /**
@@ -21,7 +18,8 @@ class TypeMatcher
     }
 
     /**
-     * @param $element
+     * @param mixed $element
+     *
      * @return boolean
      */
     public function matches($element)
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 0000000000000000000000000000000000000000..272652ca5943f7b71ae751e0c53e3fe2ff4e0564
--- /dev/null
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/deep_copy.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace DeepCopy;
+
+/**
+ * Deep copies the given value.
+ *
+ * @param mixed $value
+ * @param bool  $useCloneMethod
+ *
+ * @return mixed
+ */
+function deep_copy($value, $useCloneMethod = false)
+{
+    return (new DeepCopy($useCloneMethod))->copy($value);
+}
diff --git a/vendor/paragonie/random_compat/lib/cast_to_int.php b/vendor/paragonie/random_compat/lib/cast_to_int.php
index be7388dfd3b801d8e2ac16c5c495e43cd37fabf9..9a4fab99197125859b0c08484c1fe0abb284ad9d 100644
--- a/vendor/paragonie/random_compat/lib/cast_to_int.php
+++ b/vendor/paragonie/random_compat/lib/cast_to_int.php
@@ -38,9 +38,10 @@ if (!is_callable('RandomCompat_intval')) {
      * through.
      * 
      * @param int|float $number    The number we want to convert to an int
-     * @param boolean   $fail_open Set to true to not throw an exception
+     * @param bool      $fail_open Set to true to not throw an exception
      * 
      * @return float|int
+     * @psalm-suppress InvalidReturnType
      *
      * @throws TypeError
      */
diff --git a/vendor/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php b/vendor/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php
index 02160b91924efb19868fa2f7fc6af64b91ee7565..705af5262bde0e092ca26aff660ae38b8a6e3e87 100644
--- a/vendor/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php
+++ b/vendor/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php
@@ -70,10 +70,10 @@ if (!is_callable('random_bytes')) {
                 $n = ($bytes - $i) > 1073741824
                     ? 1073741824
                     : $bytes - $i;
-                $buf .= Sodium::randombytes_buf($n);
+                $buf .= Sodium::randombytes_buf((int) $n);
             }
         } else {
-            $buf .= Sodium::randombytes_buf($bytes);
+            $buf .= Sodium::randombytes_buf((int) $bytes);
         }
 
         if (is_string($buf)) {
diff --git a/vendor/paragonie/random_compat/lib/random_int.php b/vendor/paragonie/random_compat/lib/random_int.php
index b2ea02d17c5f820ecde415875a16904d5c8007c2..5b2143a16297a5ee79ba48f997ef2f39e5d97696 100644
--- a/vendor/paragonie/random_compat/lib/random_int.php
+++ b/vendor/paragonie/random_compat/lib/random_int.php
@@ -78,7 +78,7 @@ if (!is_callable('random_int')) {
         }
 
         if ($max === $min) {
-            return $min;
+            return (int) $min;
         }
 
         /**
@@ -185,6 +185,6 @@ if (!is_callable('random_int')) {
              */
         } while (!is_int($val) || $val > $max || $val < $min);
 
-        return (int)$val;
+        return (int) $val;
     }
 }
diff --git a/vendor/paragonie/random_compat/psalm.xml b/vendor/paragonie/random_compat/psalm.xml
index f501315602d6bb52f047c217eed74efb8e3bd113..1e91409894aee32a49ef399b0ce6bdd40a93682a 100644
--- a/vendor/paragonie/random_compat/psalm.xml
+++ b/vendor/paragonie/random_compat/psalm.xml
@@ -8,6 +8,7 @@
         <directory name="lib" />
     </projectFiles>
     <issueHandlers>
+        <DuplicateClass errorLevel="info" />
         <InvalidOperand errorLevel="info" />
         <UndefinedConstant errorLevel="info" />
         <MissingReturnType errorLevel="info" />
diff --git a/vendor/pear/net_url2/composer.json b/vendor/pear/net_url2/composer.json
index b33698e5d55409d2d5847147736d0d5c359542e3..c8a0c124eed78efb4662e40c18fc3c861e8b3bf3 100644
--- a/vendor/pear/net_url2/composer.json
+++ b/vendor/pear/net_url2/composer.json
@@ -36,6 +36,9 @@
     "autoload": {
         "classmap": ["Net/URL2.php"]
     },
+    "include-path": [
+        "./"
+    ],
     "extra": {
         "branch-alias": {
             "dev-master": "2.2.x-dev"
diff --git a/vendor/phpspec/prophecy/.gitignore b/vendor/phpspec/prophecy/.gitignore
deleted file mode 100644
index 88ee1c14c9a54c6e36907e99da00e20f964ac66e..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-*.tgz
-*.phar
-/composer.lock
-/vendor
-/phpunit.xml
diff --git a/vendor/phpspec/prophecy/.travis.yml b/vendor/phpspec/prophecy/.travis.yml
deleted file mode 100644
index a277922bed281231edf38ffd5cbaec223d8f07a2..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/.travis.yml
+++ /dev/null
@@ -1,39 +0,0 @@
-language: php
-
-sudo: false
-
-cache:
-  directories:
-    - $HOME/.composer/cache
-
-branches:
-  except:
-    - /^bugfix\/.*$/
-    - /^feature\/.*$/
-    - /^optimization\/.*$/
-
-matrix:
-  include:
-    - php: 5.3
-    - php: 5.4
-    - php: 5.5
-    - php: 5.6
-      env: DEPENDENCIES='low'
-    - php: 5.6
-    - php: 7.0
-    - php: 7.1
-    # Use the newer stack for HHVM as HHVM does not support Precise anymore since a long time and so Precise has an outdated version
-    - php: hhvm
-      sudo: required
-      dist: trusty
-      group: edge
-  fast_finish: true
-
-install:
-  - export COMPOSER_ROOT_VERSION=dev-master
-  - if [ "$DEPENDENCIES" != "low" ]; then composer update; fi;
-  - if [ "$DEPENDENCIES" == "low" ]; then composer update --prefer-lowest; fi;
-
-script:
-  - vendor/bin/phpspec run -fpretty -v
-  - vendor/bin/phpunit
diff --git a/vendor/phpspec/prophecy/CHANGES.md b/vendor/phpspec/prophecy/CHANGES.md
index 996567aab32161d29bdc6a0948933b4820067c62..6a3ad33ad050033948dc782697294b39906f5f38 100644
--- a/vendor/phpspec/prophecy/CHANGES.md
+++ b/vendor/phpspec/prophecy/CHANGES.md
@@ -1,3 +1,16 @@
+1.7.2 / 2017-10-04
+==================
+
+* Reverted "check method predictions only once" due to it breaking Spies
+
+1.7.1 / 2017-10-03
+==================
+
+* Allow PHP5 keywords methods generation on PHP7 (thanks @bycosta)
+* Allow reflection-docblock v4 (thanks @GrahamCampbell)
+* Check method predictions only once (thanks @dontub)
+* Escape file path sent to \SplFileObjectConstructor when running on Windows (thanks @danmartin-epiphany)
+
 1.7.0 / 2017-03-02
 ==================
 
diff --git a/vendor/phpspec/prophecy/CONTRIBUTING.md b/vendor/phpspec/prophecy/CONTRIBUTING.md
deleted file mode 100644
index 4a8169d081ef3064d08a6e70a3c1fc7427e0a78a..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/CONTRIBUTING.md
+++ /dev/null
@@ -1,22 +0,0 @@
-Contributing
-------------
-
-Prophecy is an open source, community-driven project. If you'd like to contribute,
-feel free to do this, but remember to follow these few simple rules:
-
-- Make your feature addition or bug fix,
-- Add either specs or examples for any changes you're making (bugfixes or additions)
-  (please look into `spec/` folder for some examples). This is important so we don't break
-  it in a future version unintentionally,
-- Commit your code, but do not mess with `CHANGES.md`,
-
-Running tests
--------------
-
-Make sure that you don't break anything with your changes by running:
-
-```bash
-$> composer install --prefer-dist
-$> vendor/bin/phpspec run
-$> vendor/bin/phpunit
-```
diff --git a/vendor/phpspec/prophecy/README.md b/vendor/phpspec/prophecy/README.md
index 65ec16c4fc300e7d0c6feed75e1a2eaf66dc66f1..b190d43e192eb6c6c4d9bdd97b3708e9c72e5525 100644
--- a/vendor/phpspec/prophecy/README.md
+++ b/vendor/phpspec/prophecy/README.md
@@ -159,7 +159,7 @@ promise, there's plenty others you can use:
 
 - `ReturnPromise` or `->willReturn(1)` - returns a value from a method call
 - `ReturnArgumentPromise` or `->willReturnArgument($index)` - returns the nth method argument from call
-- `ThrowPromise` or `->willThrow` - causes the method to throw specific exception
+- `ThrowPromise` or `->willThrow($exception)` - causes the method to throw specific exception
 - `CallbackPromise` or `->will($callback)` - gives you a quick way to define your own custom logic
 
 Keep in mind, that you can always add even more promises by implementing
diff --git a/vendor/phpspec/prophecy/composer.json b/vendor/phpspec/prophecy/composer.json
index 7918065f0991e80c3f8811047c30406d91872462..fc9ba782cde9ea4fd57ce3a4da5944debfe8c2f8 100644
--- a/vendor/phpspec/prophecy/composer.json
+++ b/vendor/phpspec/prophecy/composer.json
@@ -19,7 +19,7 @@
 
     "require": {
         "php":                               "^5.3|^7.0",
-        "phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
+        "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0",
         "sebastian/comparator":              "^1.1|^2.0",
         "doctrine/instantiator":             "^1.0.2",
         "sebastian/recursion-context":       "^1.0|^2.0|^3.0"
@@ -44,7 +44,7 @@
 
     "extra": {
         "branch-alias": {
-            "dev-master": "1.6.x-dev"
+            "dev-master": "1.7.x-dev"
         }
     }
 }
diff --git a/vendor/phpspec/prophecy/fixtures/EmptyClass.php b/vendor/phpspec/prophecy/fixtures/EmptyClass.php
deleted file mode 100644
index 4db3b50ab11d089acd06f4ed5f1f4bce701347d5..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/fixtures/EmptyClass.php
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-class EmptyClass
-{
-}
diff --git a/vendor/phpspec/prophecy/fixtures/EmptyInterface.php b/vendor/phpspec/prophecy/fixtures/EmptyInterface.php
deleted file mode 100644
index 54e08e7a0f70e7138f4df4d3a6f4668a6cb98417..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/fixtures/EmptyInterface.php
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-interface EmptyInterface
-{
-}
diff --git a/vendor/phpspec/prophecy/fixtures/FinalClass.php b/vendor/phpspec/prophecy/fixtures/FinalClass.php
deleted file mode 100644
index c20ea9f04590edeff0f421d0f4908f57f6f46c10..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/fixtures/FinalClass.php
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-final class FinalClass
-{
-}
diff --git a/vendor/phpspec/prophecy/fixtures/ModifierInterface.php b/vendor/phpspec/prophecy/fixtures/ModifierInterface.php
deleted file mode 100644
index 7c7224745162bff3d8e07ce3ad00b7fc15d83d49..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/fixtures/ModifierInterface.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-interface ModifierInterface
-{
-    public function isAbstract();
-
-    public function getVisibility();
-}
diff --git a/vendor/phpspec/prophecy/fixtures/Named.php b/vendor/phpspec/prophecy/fixtures/Named.php
deleted file mode 100644
index fdfba098d9895447a2283ec74e3572cec20c1cae..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/fixtures/Named.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-interface Named
-{
-    public function getName();
-}
diff --git a/vendor/phpspec/prophecy/fixtures/OptionalDepsClass.php b/vendor/phpspec/prophecy/fixtures/OptionalDepsClass.php
deleted file mode 100644
index 85188aad2458e560e0606c5254210638e85bc63a..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/fixtures/OptionalDepsClass.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-use I\Simply;
-
-class OptionalDepsClass
-{
-    public function iHaveAStrangeTypeHintedArg(\I\Simply\Am\Nonexistent $class)
-    {
-    }
-
-    public function iHaveAnEvenStrangerTypeHintedArg(Simply\Am\Not $class)
-    {
-    }
-}
diff --git a/vendor/phpspec/prophecy/fixtures/SpecialMethods.php b/vendor/phpspec/prophecy/fixtures/SpecialMethods.php
deleted file mode 100644
index fa72764a8a58750cc34a659dee24ef32eaea7d57..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/fixtures/SpecialMethods.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-class SpecialMethods
-{
-    public function __construct()
-    {
-    }
-
-    function __destruct()
-    {
-    }
-
-    function __call($name, $arguments)
-    {
-    }
-
-    function __sleep()
-    {
-    }
-
-    function __wakeup()
-    {
-    }
-
-    function __toString()
-    {
-        return '';
-    }
-
-    function __invoke()
-    {
-    }
-
-}
diff --git a/vendor/phpspec/prophecy/fixtures/WithArguments.php b/vendor/phpspec/prophecy/fixtures/WithArguments.php
deleted file mode 100644
index bd5259f2b3b95e88c9f05913853f308a9a5dfd3b..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/fixtures/WithArguments.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-class WithArguments
-{
-    public function methodWithArgs(array $arg_1 = array(), \ArrayAccess $arg_2, \ArrayAccess $arg_3 = null)
-    {
-    }
-    
-    public function methodWithoutTypeHints($arg)
-    {
-    }
-}
diff --git a/vendor/phpspec/prophecy/fixtures/WithCallableArgument.php b/vendor/phpspec/prophecy/fixtures/WithCallableArgument.php
deleted file mode 100644
index 7d6d5f8f4699a73b5a220e55f3b0dd69b25439ca..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/fixtures/WithCallableArgument.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-class WithCallableArgument
-{
-    public function methodWithArgs(callable $arg_1, callable $arg_2 = null)
-    {
-    }
-}
diff --git a/vendor/phpspec/prophecy/fixtures/WithFinalMethod.php b/vendor/phpspec/prophecy/fixtures/WithFinalMethod.php
deleted file mode 100644
index 7e651eb386d252654324d252a9e9e7aa2576bedb..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/fixtures/WithFinalMethod.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-class WithFinalMethod
-{
-    final public function finalImplementation()
-    {
-    }
-}
diff --git a/vendor/phpspec/prophecy/fixtures/WithFinalVirtuallyPrivateMethod.php b/vendor/phpspec/prophecy/fixtures/WithFinalVirtuallyPrivateMethod.php
deleted file mode 100644
index f9ecc7f8e233568ba8326158cff750a4afee1880..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/fixtures/WithFinalVirtuallyPrivateMethod.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-class WithFinalVirtuallyPrivateMethod
-{
-    final public function __toString()
-    {
-        return '';
-    }
-
-    final public function _getName()
-    {
-    }
-}
diff --git a/vendor/phpspec/prophecy/fixtures/WithProtectedAbstractMethod.php b/vendor/phpspec/prophecy/fixtures/WithProtectedAbstractMethod.php
deleted file mode 100644
index 4485e590e90c9ca424fb5a1ad0ab18a7bf750462..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/fixtures/WithProtectedAbstractMethod.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-abstract class WithProtectedAbstractMethod
-{
-    abstract protected function innerDetail();
-}
diff --git a/vendor/phpspec/prophecy/fixtures/WithReferences.php b/vendor/phpspec/prophecy/fixtures/WithReferences.php
deleted file mode 100644
index 4f3fd090ef555594a1422a16da69561951e67844..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/fixtures/WithReferences.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-class WithReferences
-{
-    public function methodWithReferenceArgument(&$arg_1, \ArrayAccess &$arg_2)
-    {
-    }
-}
diff --git a/vendor/phpspec/prophecy/fixtures/WithReturnTypehints.php b/vendor/phpspec/prophecy/fixtures/WithReturnTypehints.php
deleted file mode 100644
index 045051fdd9bdfbf37cf3c365bea758fde616f36c..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/fixtures/WithReturnTypehints.php
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-class WithReturnTypehints extends EmptyClass
-{
-    public function getSelf(): self {
-        return $this;
-    }
-
-    public function getName(): string {
-        return __CLASS__;
-    }
-    
-    public function getParent(): parent {
-        return $this;
-    }
-}
diff --git a/vendor/phpspec/prophecy/fixtures/WithStaticMethod.php b/vendor/phpspec/prophecy/fixtures/WithStaticMethod.php
deleted file mode 100644
index 491dd12b253808c30a3d74e58c6244c0ae8087ea..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/fixtures/WithStaticMethod.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-class WithStaticMethod
-{
-    public static function innerDetail()
-    {
-    }
-}
diff --git a/vendor/phpspec/prophecy/fixtures/WithTypehintedVariadicArgument.php b/vendor/phpspec/prophecy/fixtures/WithTypehintedVariadicArgument.php
deleted file mode 100644
index 88f1d365c9f6a019df90a99060475114d4811553..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/fixtures/WithTypehintedVariadicArgument.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-class WithTypehintedVariadicArgument
-{
-    function methodWithTypeHintedArgs(array ...$args)
-    {
-    }
-}
diff --git a/vendor/phpspec/prophecy/fixtures/WithVariadicArgument.php b/vendor/phpspec/prophecy/fixtures/WithVariadicArgument.php
deleted file mode 100644
index 1cdb181bcfb8d3c48592c71a259e3305a6fa8e07..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/fixtures/WithVariadicArgument.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-class WithVariadicArgument
-{
-    function methodWithArgs(...$args)
-    {
-    }
-}
diff --git a/vendor/phpspec/prophecy/fixtures/WithVirtuallyPrivateMethod.php b/vendor/phpspec/prophecy/fixtures/WithVirtuallyPrivateMethod.php
deleted file mode 100644
index 31b50d082205eac7de9c16cef455a1279bc23fe4..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/fixtures/WithVirtuallyPrivateMethod.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-class WithVirtuallyPrivateMethod
-{
-    public function __toString()
-    {
-        return '';
-    }
-
-    public function _getName()
-    {
-    }
-
-    public function isAbstract()
-    {
-    }
-}
diff --git a/vendor/phpspec/prophecy/phpunit.xml.dist b/vendor/phpspec/prophecy/phpunit.xml.dist
deleted file mode 100644
index 3ce8c2777d2ac1316c28205046b611259db9c0fa..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/phpunit.xml.dist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.8/phpunit.xsd"
-         backupGlobals="false"
-         colors="true"
-         bootstrap="vendor/autoload.php"
->
-    <php>
-        <ini name="error_reporting" value="-1" />
-    </php>
-
-    <testsuites>
-        <testsuite name="PhpSpec Test Suite">
-            <directory>tests</directory>
-        </testsuite>
-    </testsuites>
-
-    <filter>
-        <whitelist>
-            <directory>./src/</directory>
-        </whitelist>
-    </filter>
-</phpunit>
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/ArgumentsWildcardSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/ArgumentsWildcardSpec.php
deleted file mode 100644
index b82f1b893b2d75e155e9b8951a8c30c97cd6d627..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/ArgumentsWildcardSpec.php
+++ /dev/null
@@ -1,128 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument\Token\TokenInterface;
-
-class ArgumentsWildcardSpec extends ObjectBehavior
-{
-    function it_wraps_non_token_arguments_into_ExactValueToken(\stdClass $object)
-    {
-        $this->beConstructedWith(array(42, 'zet', $object));
-
-        $class = get_class($object->getWrappedObject());
-        $hash  = spl_object_hash($object->getWrappedObject());
-
-        $this->__toString()->shouldReturn("exact(42), exact(\"zet\"), exact($class:$hash Object (\n    'objectProphecy' => Prophecy\Prophecy\ObjectProphecy Object (*Prophecy*)\n))");
-    }
-
-    function it_generates_string_representation_from_all_tokens_imploded(
-        TokenInterface $token1,
-        TokenInterface $token2,
-        TokenInterface $token3
-    ) {
-        $token1->__toString()->willReturn('token_1');
-        $token2->__toString()->willReturn('token_2');
-        $token3->__toString()->willReturn('token_3');
-
-        $this->beConstructedWith(array($token1, $token2, $token3));
-        $this->__toString()->shouldReturn('token_1, token_2, token_3');
-    }
-
-    function it_exposes_list_of_tokens(TokenInterface $token)
-    {
-        $this->beConstructedWith(array($token));
-
-        $this->getTokens()->shouldReturn(array($token));
-    }
-
-    function it_returns_score_of_1_if_there_are_no_tokens_and_arguments()
-    {
-        $this->beConstructedWith(array());
-
-        $this->scoreArguments(array())->shouldReturn(1);
-    }
-
-    function it_should_return_match_score_based_on_all_tokens_score(
-        TokenInterface $token1,
-        TokenInterface $token2,
-        TokenInterface $token3
-    ) {
-        $token1->scoreArgument('one')->willReturn(3);
-        $token1->isLast()->willReturn(false);
-        $token2->scoreArgument(2)->willReturn(5);
-        $token2->isLast()->willReturn(false);
-        $token3->scoreArgument($obj = new \stdClass())->willReturn(10);
-        $token3->isLast()->willReturn(false);
-
-        $this->beConstructedWith(array($token1, $token2, $token3));
-        $this->scoreArguments(array('one', 2, $obj))->shouldReturn(18);
-    }
-
-    function it_returns_false_if_there_is_less_arguments_than_tokens(
-        TokenInterface $token1,
-        TokenInterface $token2,
-        TokenInterface $token3
-    ) {
-        $token1->scoreArgument('one')->willReturn(3);
-        $token1->isLast()->willReturn(false);
-        $token2->scoreArgument(2)->willReturn(5);
-        $token2->isLast()->willReturn(false);
-        $token3->scoreArgument(null)->willReturn(false);
-        $token3->isLast()->willReturn(false);
-
-        $this->beConstructedWith(array($token1, $token2, $token3));
-        $this->scoreArguments(array('one', 2))->shouldReturn(false);
-    }
-
-    function it_returns_false_if_there_is_less_tokens_than_arguments(
-        TokenInterface $token1,
-        TokenInterface $token2,
-        TokenInterface $token3
-    ) {
-        $token1->scoreArgument('one')->willReturn(3);
-        $token1->isLast()->willReturn(false);
-        $token2->scoreArgument(2)->willReturn(5);
-        $token2->isLast()->willReturn(false);
-        $token3->scoreArgument($obj = new \stdClass())->willReturn(10);
-        $token3->isLast()->willReturn(false);
-
-        $this->beConstructedWith(array($token1, $token2, $token3));
-        $this->scoreArguments(array('one', 2, $obj, 4))->shouldReturn(false);
-    }
-
-    function it_should_return_false_if_one_of_the_tokens_returns_false(
-        TokenInterface $token1,
-        TokenInterface $token2,
-        TokenInterface $token3
-    ) {
-        $token1->scoreArgument('one')->willReturn(3);
-        $token1->isLast()->willReturn(false);
-        $token2->scoreArgument(2)->willReturn(false);
-        $token2->isLast()->willReturn(false);
-        $token3->scoreArgument($obj = new \stdClass())->willReturn(10);
-        $token3->isLast()->willReturn(false);
-
-        $this->beConstructedWith(array($token1, $token2, $token3));
-        $this->scoreArguments(array('one', 2, $obj))->shouldReturn(false);
-    }
-
-    function it_should_calculate_score_until_last_token(
-        TokenInterface $token1,
-        TokenInterface $token2,
-        TokenInterface $token3
-    ) {
-        $token1->scoreArgument('one')->willReturn(3);
-        $token1->isLast()->willReturn(false);
-
-        $token2->scoreArgument(2)->willReturn(7);
-        $token2->isLast()->willReturn(true);
-
-        $token3->scoreArgument($obj = new \stdClass())->willReturn(10);
-        $token3->isLast()->willReturn(false);
-
-        $this->beConstructedWith(array($token1, $token2, $token3));
-        $this->scoreArguments(array('one', 2, $obj))->shouldReturn(10);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValueTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValueTokenSpec.php
deleted file mode 100644
index a43e923cf37fa39fa0cb2f3a094a5d7379ea1807..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValueTokenSpec.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument\Token;
-
-use PhpSpec\ObjectBehavior;
-
-class AnyValueTokenSpec extends ObjectBehavior
-{
-    function it_implements_TokenInterface()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
-    }
-
-    function it_is_not_last()
-    {
-        $this->shouldNotBeLast();
-    }
-
-    function its_string_representation_is_star()
-    {
-        $this->__toString()->shouldReturn('*');
-    }
-
-    function it_scores_any_argument_as_3()
-    {
-        $this->scoreArgument(42)->shouldReturn(3);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValuesTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValuesTokenSpec.php
deleted file mode 100644
index c29076f59359957ab97f92415ce0cbdf9640d832..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValuesTokenSpec.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument\Token;
-
-use PhpSpec\ObjectBehavior;
-
-class AnyValuesTokenSpec extends ObjectBehavior
-{
-    function it_implements_TokenInterface()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
-    }
-
-    function it_is_last()
-    {
-        $this->shouldBeLast();
-    }
-
-    function its_string_representation_is_star_with_followup()
-    {
-        $this->__toString()->shouldReturn('* [, ...]');
-    }
-
-    function it_scores_any_argument_as_2()
-    {
-        $this->scoreArgument(42)->shouldReturn(2);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ApproximateValueTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ApproximateValueTokenSpec.php
deleted file mode 100644
index 8799d6d519684d233699762a438e0a136b6ec100..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ApproximateValueTokenSpec.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument\Token;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-
-class ApproximateValueTokenSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith(10.12345678, 4);
-    }
-
-    function it_is_initializable()
-    {
-        $this->shouldHaveType('Prophecy\Argument\Token\ApproximateValueToken');
-    }
-
-    function it_implements_TokenInterface()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
-    }
-
-    function it_is_not_last()
-    {
-        $this->shouldNotBeLast();
-    }
-
-    function it_scores_10_if_rounded_argument_matches_rounded_value()
-    {
-        $this->scoreArgument(10.12345)->shouldReturn(10);
-    }
-
-    function it_does_not_score_if_rounded_argument_does_not_match_rounded_value()
-    {
-        $this->scoreArgument(10.1234)->shouldReturn(false);
-    }
-
-    function it_uses_a_default_precision_of_zero()
-    {
-        $this->beConstructedWith(10.7);
-        $this->scoreArgument(11.4)->shouldReturn(10);
-    }
-
-    function it_does_not_score_if_rounded_argument_is_not_numeric()
-    {
-        $this->scoreArgument('hello')->shouldReturn(false);
-    }
-
-    function it_has_simple_string_representation()
-    {
-        $this->__toString()->shouldBe('≅10.1235');
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayCountTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayCountTokenSpec.php
deleted file mode 100644
index cc81fe01a4e89d6bb73d00ead25160a9107e6d73..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayCountTokenSpec.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument\Token;
-
-use PhpSpec\ObjectBehavior;
-
-class ArrayCountTokenSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith(2);
-    }
-
-    function it_implements_TokenInterface()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
-    }
-
-    function it_is_not_last()
-    {
-        $this->shouldNotBeLast();
-    }
-
-    function it_scores_6_if_argument_array_has_proper_count()
-    {
-        $this->scoreArgument(array(1,2))->shouldReturn(6);
-    }
-
-    function it_scores_6_if_argument_countable_object_has_proper_count(\Countable $countable)
-    {
-        $countable->count()->willReturn(2);
-        $this->scoreArgument($countable)->shouldReturn(6);
-    }
-
-    function it_does_not_score_if_argument_is_neither_array_nor_countable_object()
-    {
-        $this->scoreArgument('string')->shouldBe(false);
-        $this->scoreArgument(5)->shouldBe(false);
-        $this->scoreArgument(new \stdClass)->shouldBe(false);
-    }
-
-    function it_does_not_score_if_argument_array_has_wrong_count()
-    {
-        $this->scoreArgument(array(1))->shouldReturn(false);
-    }
-
-    function it_does_not_score_if_argument_countable_object_has_wrong_count(\Countable $countable)
-    {
-        $countable->count()->willReturn(3);
-        $this->scoreArgument($countable)->shouldReturn(false);
-    }
-
-    function it_has_simple_string_representation()
-    {
-        $this->__toString()->shouldBe('count(2)');
-    }
-
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEntryTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEntryTokenSpec.php
deleted file mode 100644
index 632118aebb0507f5c7b319a4fb6b953c5f66cc65..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEntryTokenSpec.php
+++ /dev/null
@@ -1,202 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument\Token;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Argument\Token\ExactValueToken;
-use Prophecy\Argument\Token\TokenInterface;
-use Prophecy\Exception\InvalidArgumentException;
-
-class ArrayEntryTokenSpec extends ObjectBehavior
-{
-    function let(TokenInterface $key, TokenInterface $value)
-    {
-        $this->beConstructedWith($key, $value);
-    }
-
-    function it_implements_TokenInterface()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
-    }
-
-    function it_is_not_last()
-    {
-        $this->shouldNotBeLast();
-    }
-
-    function it_holds_key_and_value($key, $value)
-    {
-        $this->getKey()->shouldBe($key);
-        $this->getValue()->shouldBe($value);
-    }
-
-    function its_string_representation_tells_that_its_an_array_containing_the_key_value_pair($key, $value)
-    {
-        $key->__toString()->willReturn('key');
-        $value->__toString()->willReturn('value');
-        $this->__toString()->shouldBe('[..., key => value, ...]');
-    }
-
-    function it_wraps_non_token_value_into_ExactValueToken(TokenInterface $key, \stdClass $object)
-    {
-        $this->beConstructedWith($key, $object);
-        $this->getValue()->shouldHaveType('\Prophecy\Argument\Token\ExactValueToken');
-    }
-
-    function it_wraps_non_token_key_into_ExactValueToken(\stdClass $object, TokenInterface $value)
-    {
-        $this->beConstructedWith($object, $value);
-        $this->getKey()->shouldHaveType('\Prophecy\Argument\Token\ExactValueToken');
-    }
-
-    function it_scores_array_half_of_combined_scores_from_key_and_value_tokens($key, $value)
-    {
-        $key->scoreArgument('key')->willReturn(4);
-        $value->scoreArgument('value')->willReturn(6);
-        $this->scoreArgument(array('key'=>'value'))->shouldBe(5);
-    }
-
-    function it_scores_traversable_object_half_of_combined_scores_from_key_and_value_tokens(
-        TokenInterface $key,
-        TokenInterface $value,
-        \Iterator $object
-    ) {
-        $object->current()->will(function () use ($object) {
-            $object->valid()->willReturn(false);
-
-            return 'value';
-        });
-        $object->key()->willReturn('key');
-        $object->rewind()->willReturn(null);
-        $object->next()->willReturn(null);
-        $object->valid()->willReturn(true);
-        $key->scoreArgument('key')->willReturn(6);
-        $value->scoreArgument('value')->willReturn(2);
-        $this->scoreArgument($object)->shouldBe(4);
-    }
-
-    function it_throws_exception_during_scoring_of_array_accessible_object_if_key_is_not_ExactValueToken(
-        TokenInterface $key,
-        TokenInterface $value,
-        \ArrayAccess $object
-    ) {
-        $key->__toString()->willReturn('any_token');
-        $this->beConstructedWith($key,$value);
-        $errorMessage = 'You can only use exact value tokens to match key of ArrayAccess object'.PHP_EOL.
-                        'But you used `any_token`.';
-        $this->shouldThrow(new InvalidArgumentException($errorMessage))->duringScoreArgument($object);
-    }
-
-    function it_scores_array_accessible_object_half_of_combined_scores_from_key_and_value_tokens(
-        ExactValueToken $key,
-        TokenInterface $value,
-        \ArrayAccess $object
-    ) {
-        $object->offsetExists('key')->willReturn(true);
-        $object->offsetGet('key')->willReturn('value');
-        $key->getValue()->willReturn('key');
-        $key->scoreArgument('key')->willReturn(3);
-        $value->scoreArgument('value')->willReturn(1);
-        $this->scoreArgument($object)->shouldBe(2);
-    }
-
-    function it_accepts_any_key_token_type_to_score_object_that_is_both_traversable_and_array_accessible(
-        TokenInterface $key,
-        TokenInterface $value,
-        \ArrayIterator $object
-    ) {
-        $this->beConstructedWith($key, $value);
-        $object->current()->will(function () use ($object) {
-            $object->valid()->willReturn(false);
-
-            return 'value';
-        });
-        $object->key()->willReturn('key');
-        $object->rewind()->willReturn(null);
-        $object->next()->willReturn(null);
-        $object->valid()->willReturn(true);
-        $this->shouldNotThrow(new InvalidArgumentException)->duringScoreArgument($object);
-    }
-
-    function it_does_not_score_if_argument_is_neither_array_nor_traversable_nor_array_accessible()
-    {
-        $this->scoreArgument('string')->shouldBe(false);
-        $this->scoreArgument(new \stdClass)->shouldBe(false);
-    }
-
-    function it_does_not_score_empty_array()
-    {
-        $this->scoreArgument(array())->shouldBe(false);
-    }
-
-    function it_does_not_score_array_if_key_and_value_tokens_do_not_score_same_entry($key, $value)
-    {
-        $argument = array(1 => 'foo', 2 => 'bar');
-        $key->scoreArgument(1)->willReturn(true);
-        $key->scoreArgument(2)->willReturn(false);
-        $value->scoreArgument('foo')->willReturn(false);
-        $value->scoreArgument('bar')->willReturn(true);
-        $this->scoreArgument($argument)->shouldBe(false);
-    }
-
-    function it_does_not_score_traversable_object_without_entries(\Iterator $object)
-    {
-        $object->rewind()->willReturn(null);
-        $object->next()->willReturn(null);
-        $object->valid()->willReturn(false);
-        $this->scoreArgument($object)->shouldBe(false);
-    }
-
-    function it_does_not_score_traversable_object_if_key_and_value_tokens_do_not_score_same_entry(
-        TokenInterface $key,
-        TokenInterface $value,
-        \Iterator $object
-    ) {
-        $object->current()->willReturn('foo');
-        $object->current()->will(function () use ($object) {
-            $object->valid()->willReturn(false);
-
-            return 'bar';
-        });
-        $object->key()->willReturn(1);
-        $object->key()->willReturn(2);
-        $object->rewind()->willReturn(null);
-        $object->next()->willReturn(null);
-        $object->valid()->willReturn(true);
-        $key->scoreArgument(1)->willReturn(true);
-        $key->scoreArgument(2)->willReturn(false);
-        $value->scoreArgument('foo')->willReturn(false);
-        $value->scoreArgument('bar')->willReturn(true);
-        $this->scoreArgument($object)->shouldBe(false);
-    }
-
-    function it_does_not_score_array_accessible_object_if_it_has_no_offset_with_key_token_value(
-        ExactValueToken $key,
-        \ArrayAccess $object
-    ) {
-        $object->offsetExists('key')->willReturn(false);
-        $key->getValue()->willReturn('key');
-        $this->scoreArgument($object)->shouldBe(false);
-    }
-
-    function it_does_not_score_array_accessible_object_if_key_and_value_tokens_do_not_score_same_entry(
-        ExactValueToken $key,
-        TokenInterface $value,
-        \ArrayAccess $object
-    ) {
-        $object->offsetExists('key')->willReturn(true);
-        $object->offsetGet('key')->willReturn('value');
-        $key->getValue()->willReturn('key');
-        $value->scoreArgument('value')->willReturn(false);
-        $key->scoreArgument('key')->willReturn(true);
-        $this->scoreArgument($object)->shouldBe(false);
-    }
-
-    function its_score_is_capped_at_8($key, $value)
-    {
-        $key->scoreArgument('key')->willReturn(10);
-        $value->scoreArgument('value')->willReturn(10);
-        $this->scoreArgument(array('key'=>'value'))->shouldBe(8);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEveryEntryTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEveryEntryTokenSpec.php
deleted file mode 100644
index e57ff8cd4a3e046e2069122cafc81c51c03f4d24..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEveryEntryTokenSpec.php
+++ /dev/null
@@ -1,96 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument\Token;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument\Token\TokenInterface;
-
-class ArrayEveryEntryTokenSpec extends ObjectBehavior
-{
-    function let(TokenInterface $value)
-    {
-        $this->beConstructedWith($value);
-    }
-
-    function it_implements_TokenInterface()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
-    }
-
-    function it_is_not_last()
-    {
-        $this->shouldNotBeLast();
-    }
-
-    function it_holds_value($value)
-    {
-        $this->getValue()->shouldBe($value);
-    }
-
-    function its_string_representation_tells_that_its_an_array_containing_only_value($value)
-    {
-        $value->__toString()->willReturn('value');
-        $this->__toString()->shouldBe('[value, ..., value]');
-    }
-
-    function it_wraps_non_token_value_into_ExactValueToken(\stdClass $stdClass)
-    {
-        $this->beConstructedWith($stdClass);
-        $this->getValue()->shouldHaveType('Prophecy\Argument\Token\ExactValueToken');
-    }
-
-    function it_does_not_score_if_argument_is_neither_array_nor_traversable()
-    {
-        $this->scoreArgument('string')->shouldBe(false);
-        $this->scoreArgument(new \stdClass)->shouldBe(false);
-    }
-
-    function it_does_not_score_empty_array()
-    {
-        $this->scoreArgument(array())->shouldBe(false);
-    }
-
-    function it_does_not_score_traversable_object_without_entries(\Iterator $object)
-    {
-        $object->rewind()->willReturn(null);
-        $object->next()->willReturn(null);
-        $object->valid()->willReturn(false);
-        $this->scoreArgument($object)->shouldBe(false);
-    }
-
-    function it_scores_avg_of_scores_from_value_tokens($value)
-    {
-        $value->scoreArgument('value1')->willReturn(6);
-        $value->scoreArgument('value2')->willReturn(3);
-        $this->scoreArgument(array('value1', 'value2'))->shouldBe(4.5);
-    }
-
-    function it_scores_false_if_entry_scores_false($value)
-    {
-        $value->scoreArgument('value1')->willReturn(6);
-        $value->scoreArgument('value2')->willReturn(false);
-        $this->scoreArgument(array('value1', 'value2'))->shouldBe(false);
-    }
-
-    function it_does_not_score_array_keys($value)
-    {
-        $value->scoreArgument('value')->willReturn(6);
-        $value->scoreArgument('key')->shouldNotBeCalled(0);
-        $this->scoreArgument(array('key' => 'value'))->shouldBe(6);
-    }
-
-    function it_scores_traversable_object_from_value_token(TokenInterface $value, \Iterator $object)
-    {
-        $object->current()->will(function ($args, $object) {
-            $object->valid()->willReturn(false);
-
-            return 'value';
-        });
-        $object->key()->willReturn('key');
-        $object->rewind()->willReturn(null);
-        $object->next()->willReturn(null);
-        $object->valid()->willReturn(true);
-        $value->scoreArgument('value')->willReturn(2);
-        $this->scoreArgument($object)->shouldBe(2);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/CallbackTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/CallbackTokenSpec.php
deleted file mode 100644
index 4395bf097de783db911d8896b1a046e9dcd3e325..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/CallbackTokenSpec.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument\Token;
-
-use PhpSpec\ObjectBehavior;
-
-class CallbackTokenSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith('get_class');
-    }
-
-    function it_implements_TokenInterface()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
-    }
-
-    function it_is_not_last()
-    {
-        $this->shouldNotBeLast();
-    }
-
-    function it_scores_7_if_argument_matches_callback()
-    {
-        $this->beConstructedWith(function ($argument) { return 2 === $argument; });
-
-        $this->scoreArgument(2)->shouldReturn(7);
-    }
-
-    function it_does_not_scores_if_argument_does_not_match_callback()
-    {
-        $this->beConstructedWith(function ($argument) { return 2 === $argument; });
-
-        $this->scoreArgument(5)->shouldReturn(false);
-    }
-
-    function its_string_representation_should_tell_that_its_callback()
-    {
-        $this->__toString()->shouldReturn('callback()');
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ExactValueTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ExactValueTokenSpec.php
deleted file mode 100644
index 14322f8290bd8695c7b3742f2efcd7900e5b0b20..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ExactValueTokenSpec.php
+++ /dev/null
@@ -1,152 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument\Token;
-
-use PhpSpec\ObjectBehavior;
-
-class ExactValueTokenSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith(42);
-    }
-
-    function it_implements_TokenInterface()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
-    }
-
-    function it_is_not_last()
-    {
-        $this->shouldNotBeLast();
-    }
-
-    function it_holds_value()
-    {
-        $this->getValue()->shouldReturn(42);
-    }
-
-    function it_scores_10_if_value_is_equal_to_argument()
-    {
-        $this->scoreArgument(42)->shouldReturn(10);
-        $this->scoreArgument('42')->shouldReturn(10);
-    }
-
-    function it_scores_10_if_value_is_an_object_and_equal_to_argument()
-    {
-        $value = new \DateTime();
-        $value2 = clone $value;
-
-        $this->beConstructedWith($value);
-        $this->scoreArgument($value2)->shouldReturn(10);
-    }
-
-    function it_does_not_scores_if_value_is_not_equal_to_argument()
-    {
-        $this->scoreArgument(50)->shouldReturn(false);
-        $this->scoreArgument(new \stdClass())->shouldReturn(false);
-    }
-
-    function it_does_not_scores_if_value_an_object_and_is_not_equal_to_argument()
-    {
-        $value = new ExactValueTokenFixtureB('ABC');
-        $value2 = new ExactValueTokenFixtureB('CBA');
-
-        $this->beConstructedWith($value);
-        $this->scoreArgument($value2)->shouldReturn(false);
-    }
-
-    function it_does_not_scores_if_value_type_and_is_not_equal_to_argument()
-    {
-        $this->beConstructedWith(false);
-        $this->scoreArgument(0)->shouldReturn(false);
-    }
-
-    function it_generates_proper_string_representation_for_integer()
-    {
-        $this->beConstructedWith(42);
-        $this->__toString()->shouldReturn('exact(42)');
-    }
-
-    function it_generates_proper_string_representation_for_string()
-    {
-        $this->beConstructedWith('some string');
-        $this->__toString()->shouldReturn('exact("some string")');
-    }
-
-    function it_generates_single_line_representation_for_multiline_string()
-    {
-        $this->beConstructedWith("some\nstring");
-        $this->__toString()->shouldReturn('exact("some\\nstring")');
-    }
-
-    function it_generates_proper_string_representation_for_double()
-    {
-        $this->beConstructedWith(42.3);
-        $this->__toString()->shouldReturn('exact(42.3)');
-    }
-
-    function it_generates_proper_string_representation_for_boolean_true()
-    {
-        $this->beConstructedWith(true);
-        $this->__toString()->shouldReturn('exact(true)');
-    }
-
-    function it_generates_proper_string_representation_for_boolean_false()
-    {
-        $this->beConstructedWith(false);
-        $this->__toString()->shouldReturn('exact(false)');
-    }
-
-    function it_generates_proper_string_representation_for_null()
-    {
-        $this->beConstructedWith(null);
-        $this->__toString()->shouldReturn('exact(null)');
-    }
-
-    function it_generates_proper_string_representation_for_empty_array()
-    {
-        $this->beConstructedWith(array());
-        $this->__toString()->shouldReturn('exact([])');
-    }
-
-    function it_generates_proper_string_representation_for_array()
-    {
-        $this->beConstructedWith(array('zet', 42));
-        $this->__toString()->shouldReturn('exact(["zet", 42])');
-    }
-
-    function it_generates_proper_string_representation_for_resource()
-    {
-        $resource = fopen(__FILE__, 'r');
-        $this->beConstructedWith($resource);
-        $this->__toString()->shouldReturn('exact(stream:'.$resource.')');
-    }
-
-    function it_generates_proper_string_representation_for_object(\stdClass $object)
-    {
-        $objHash = sprintf('%s:%s',
-            get_class($object->getWrappedObject()),
-            spl_object_hash($object->getWrappedObject())
-        );
-
-        $this->beConstructedWith($object);
-        $this->__toString()->shouldReturn("exact($objHash Object (\n    'objectProphecy' => Prophecy\Prophecy\ObjectProphecy Object (*Prophecy*)\n))");
-    }
-}
-
-class ExactValueTokenFixtureA
-{
-    public $errors;
-}
-
-class ExactValueTokenFixtureB extends ExactValueTokenFixtureA
-{
-    public $errors;
-    public $value = null;
-
-    public function __construct($value)
-    {
-        $this->value = $value;
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/IdenticalValueTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/IdenticalValueTokenSpec.php
deleted file mode 100644
index 00c3a2157fc099beaf9db3c35600bd3cf8f85369..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/IdenticalValueTokenSpec.php
+++ /dev/null
@@ -1,152 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument\Token;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-
-class IdenticalValueTokenSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith(42);
-    }
-
-    function it_is_initializable()
-    {
-        $this->shouldHaveType('Prophecy\Argument\Token\IdenticalValueToken');
-    }
-
-    function it_scores_11_if_string_value_is_identical_to_argument()
-    {
-        $this->beConstructedWith('foo');
-        $this->scoreArgument('foo')->shouldReturn(11);
-    }
-
-    function it_scores_11_if_boolean_value_is_identical_to_argument()
-    {
-        $this->beConstructedWith(false);
-        $this->scoreArgument(false)->shouldReturn(11);
-    }
-
-    function it_scores_11_if_integer_value_is_identical_to_argument()
-    {
-        $this->beConstructedWith(31);
-        $this->scoreArgument(31)->shouldReturn(11);
-    }
-
-    function it_scores_11_if_float_value_is_identical_to_argument()
-    {
-        $this->beConstructedWith(31.12);
-        $this->scoreArgument(31.12)->shouldReturn(11);
-    }
-
-    function it_scores_11_if_array_value_is_identical_to_argument()
-    {
-        $this->beConstructedWith(array('foo' => 'bar'));
-        $this->scoreArgument(array('foo' => 'bar'))->shouldReturn(11);
-    }
-
-    function it_scores_11_if_object_value_is_identical_to_argument()
-    {
-        $object = new \stdClass();
-
-        $this->beConstructedWith($object);
-        $this->scoreArgument($object)->shouldReturn(11);
-    }
-
-    function it_scores_false_if_value_is_not_identical_to_argument()
-    {
-        $this->beConstructedWith(new \stdClass());
-        $this->scoreArgument('foo')->shouldReturn(false);
-    }
-
-    function it_scores_false_if_object_value_is_not_the_same_instance_than_argument()
-    {
-        $this->beConstructedWith(new \stdClass());
-        $this->scoreArgument(new \stdClass())->shouldReturn(false);
-    }
-
-    function it_scores_false_if_integer_value_is_not_identical_to_boolean_argument()
-    {
-        $this->beConstructedWith(1);
-        $this->scoreArgument(true)->shouldReturn(false);
-    }
-
-    function it_is_not_last()
-    {
-        $this->shouldNotBeLast();
-    }
-
-    function it_generates_proper_string_representation_for_integer()
-    {
-        $this->beConstructedWith(42);
-        $this->__toString()->shouldReturn('identical(42)');
-    }
-
-    function it_generates_proper_string_representation_for_string()
-    {
-        $this->beConstructedWith('some string');
-        $this->__toString()->shouldReturn('identical("some string")');
-    }
-
-    function it_generates_single_line_representation_for_multiline_string()
-    {
-        $this->beConstructedWith("some\nstring");
-        $this->__toString()->shouldReturn('identical("some\\nstring")');
-    }
-
-    function it_generates_proper_string_representation_for_double()
-    {
-        $this->beConstructedWith(42.3);
-        $this->__toString()->shouldReturn('identical(42.3)');
-    }
-
-    function it_generates_proper_string_representation_for_boolean_true()
-    {
-        $this->beConstructedWith(true);
-        $this->__toString()->shouldReturn('identical(true)');
-    }
-
-    function it_generates_proper_string_representation_for_boolean_false()
-    {
-        $this->beConstructedWith(false);
-        $this->__toString()->shouldReturn('identical(false)');
-    }
-
-    function it_generates_proper_string_representation_for_null()
-    {
-        $this->beConstructedWith(null);
-        $this->__toString()->shouldReturn('identical(null)');
-    }
-
-    function it_generates_proper_string_representation_for_empty_array()
-    {
-        $this->beConstructedWith(array());
-        $this->__toString()->shouldReturn('identical([])');
-    }
-
-    function it_generates_proper_string_representation_for_array()
-    {
-        $this->beConstructedWith(array('zet', 42));
-        $this->__toString()->shouldReturn('identical(["zet", 42])');
-    }
-
-    function it_generates_proper_string_representation_for_resource()
-    {
-        $resource = fopen(__FILE__, 'r');
-        $this->beConstructedWith($resource);
-        $this->__toString()->shouldReturn('identical(stream:'.$resource.')');
-    }
-
-    function it_generates_proper_string_representation_for_object($object)
-    {
-        $objHash = sprintf('%s:%s',
-            get_class($object->getWrappedObject()),
-            spl_object_hash($object->getWrappedObject())
-        );
-
-        $this->beConstructedWith($object);
-        $this->__toString()->shouldReturn("identical($objHash Object (\n    'objectProphecy' => Prophecy\Prophecy\ObjectProphecy Object (*Prophecy*)\n))");
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalAndTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalAndTokenSpec.php
deleted file mode 100644
index a79acf4cc6a1f84f6e1b56404e4f3e8abdaf4a20..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalAndTokenSpec.php
+++ /dev/null
@@ -1,69 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument\Token;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Argument\Token\TokenInterface;
-
-class LogicalAndTokenSpec extends ObjectBehavior
-{
-    function it_implements_TokenInterface()
-    {
-        $this->beConstructedWith(array());
-        $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
-    }
-
-    function it_is_not_last()
-    {
-        $this->beConstructedWith(array());
-        $this->shouldNotBeLast();
-    }
-
-    function it_generates_string_representation_from_all_tokens_imploded(
-        TokenInterface $token1,
-        TokenInterface $token2,
-        TokenInterface $token3
-    ) {
-        $token1->__toString()->willReturn('token_1');
-        $token2->__toString()->willReturn('token_2');
-        $token3->__toString()->willReturn('token_3');
-
-        $this->beConstructedWith(array($token1, $token2, $token3));
-        $this->__toString()->shouldReturn('bool(token_1 AND token_2 AND token_3)');
-    }
-
-    function it_wraps_non_token_arguments_into_ExactValueToken()
-    {
-        $this->beConstructedWith(array(15, '1985'));
-        $this->__toString()->shouldReturn("bool(exact(15) AND exact(\"1985\"))");
-    }
-
-    function it_scores_the_maximum_score_from_all_scores_returned_by_tokens(TokenInterface $token1, TokenInterface $token2)
-    {
-        $token1->scoreArgument(1)->willReturn(10);
-        $token2->scoreArgument(1)->willReturn(5);
-        $this->beConstructedWith(array($token1, $token2));
-        $this->scoreArgument(1)->shouldReturn(10);
-    }
-
-    function it_does_not_score_if_there_are_no_arguments_or_tokens()
-    {
-        $this->beConstructedWith(array());
-        $this->scoreArgument('any')->shouldReturn(false);
-    }
-
-    function it_does_not_score_if_either_of_tokens_does_not_score(TokenInterface $token1, TokenInterface $token2)
-    {
-        $token1->scoreArgument(1)->willReturn(10);
-        $token1->scoreArgument(2)->willReturn(false);
-
-        $token2->scoreArgument(1)->willReturn(false);
-        $token2->scoreArgument(2)->willReturn(10);
-
-        $this->beConstructedWith(array($token1, $token2));
-
-        $this->scoreArgument(1)->shouldReturn(false);
-        $this->scoreArgument(2)->shouldReturn(false);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalNotTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalNotTokenSpec.php
deleted file mode 100644
index c2cbbad17412f985ada3e373f06b526eb4f4a3b2..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalNotTokenSpec.php
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument\Token;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument\Token\TokenInterface;
-
-class LogicalNotTokenSpec extends ObjectBehavior
-{
-    function let(TokenInterface $token)
-    {
-        $this->beConstructedWith($token);
-    }
-
-    function it_implements_TokenInterface()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
-    }
-
-    function it_holds_originating_token($token)
-    {
-        $this->getOriginatingToken()->shouldReturn($token);
-    }
-
-    function it_has_simple_string_representation($token)
-    {
-        $token->__toString()->willReturn('value');
-        $this->__toString()->shouldBe('not(value)');
-    }
-
-    function it_wraps_non_token_argument_into_ExactValueToken()
-    {
-        $this->beConstructedWith(5);
-        $token = $this->getOriginatingToken();
-        $token->shouldhaveType('Prophecy\Argument\Token\ExactValueToken');
-        $token->getValue()->shouldBe(5);
-    }
-
-    function it_scores_4_if_preset_token_does_not_match_the_argument($token)
-    {
-        $token->scoreArgument('argument')->willReturn(false);
-        $this->scoreArgument('argument')->shouldBe(4);
-    }
-
-    function it_does_not_score_if_preset_token_matches_argument($token)
-    {
-        $token->scoreArgument('argument')->willReturn(5);
-        $this->scoreArgument('argument')->shouldBe(false);
-    }
-
-    function it_is_last_if_preset_token_is_last($token)
-    {
-        $token->isLast()->willReturn(true);
-        $this->shouldBeLast();
-    }
-
-    function it_is_not_last_if_preset_token_is_not_last($token)
-    {
-        $token->isLast()->willReturn(false);
-        $this->shouldNotBeLast();
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ObjectStateTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ObjectStateTokenSpec.php
deleted file mode 100644
index d71b22a00ed21325e95e30bb26b87bd66843e85a..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ObjectStateTokenSpec.php
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument\Token;
-
-use PhpSpec\ObjectBehavior;
-
-class ObjectStateTokenSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith('getName', 'stdClass');
-    }
-
-    function it_implements_TokenInterface()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
-    }
-
-    function it_is_not_last()
-    {
-        $this->shouldNotBeLast();
-    }
-
-    function it_scores_8_if_argument_object_has_specific_method_state(\ReflectionClass $reflection)
-    {
-        $reflection->getName()->willReturn('stdClass');
-
-        $this->scoreArgument($reflection)->shouldReturn(8);
-    }
-
-    function it_scores_8_if_argument_object_has_specific_property_state(\stdClass $class)
-    {
-        $class->getName = 'stdClass';
-
-        $this->scoreArgument($class)->shouldReturn(8);
-    }
-
-    function it_does_not_score_if_argument_method_state_does_not_match()
-    {
-        $value = new ObjectStateTokenFixtureB('ABC');
-        $value2 = new ObjectStateTokenFixtureB('CBA');
-
-        $this->beConstructedWith('getSelf', $value);
-        $this->scoreArgument($value2)->shouldReturn(false);
-    }
-
-    function it_does_not_score_if_argument_property_state_does_not_match(\stdClass $class)
-    {
-        $class->getName = 'SplFileInfo';
-
-        $this->scoreArgument($class)->shouldReturn(false);
-    }
-
-    function it_does_not_score_if_argument_object_does_not_have_method_or_property(ObjectStateTokenFixtureA $class)
-    {
-        $this->scoreArgument($class)->shouldReturn(false);
-    }
-
-    function it_does_not_score_if_argument_is_not_object()
-    {
-        $this->scoreArgument(42)->shouldReturn(false);
-    }
-
-    function it_has_simple_string_representation()
-    {
-        $this->__toString()->shouldReturn('state(getName(), "stdClass")');
-    }
-}
-
-class ObjectStateTokenFixtureA
-{
-    public $errors;
-}
-
-class ObjectStateTokenFixtureB extends ObjectStateTokenFixtureA
-{
-    public $errors;
-    public $value = null;
-
-    public function __construct($value)
-    {
-        $this->value = $value;
-    }
-
-    public function getSelf()
-    {
-        return $this;
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/StringContainsTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/StringContainsTokenSpec.php
deleted file mode 100644
index c7fd26523196aa77d1400bfe36bd93fc7586b0c9..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/StringContainsTokenSpec.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument\Token;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-
-class StringContainsTokenSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith('a substring');
-    }
-
-    function it_is_initializable()
-    {
-        $this->shouldHaveType('Prophecy\Argument\Token\StringContainsToken');
-    }
-
-    function it_implements_TokenInterface()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
-    }
-
-    function it_holds_value()
-    {
-        $this->getValue()->shouldReturn('a substring');
-    }
-
-    function it_is_not_last()
-    {
-        $this->shouldNotBeLast();
-    }
-
-    function it_scores_6_if_the_argument_contains_the_value()
-    {
-        $this->scoreArgument('Argument containing a substring')->shouldReturn(6);
-    }
-
-    function it_does_not_score_if_the_argument_does_not_contain_the_value()
-    {
-        $this->scoreArgument('Argument will not match')->shouldReturn(false);
-    }
-
-    function its_string_representation_shows_substring()
-    {
-        $this->__toString()->shouldReturn('contains("a substring")');
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/TypeTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/TypeTokenSpec.php
deleted file mode 100644
index 2829f31f732d8fc3ba3fbe27220e15adc2fc5013..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/TypeTokenSpec.php
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument\Token;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument\Token\TokenInterface;
-
-class TypeTokenSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith('integer');
-    }
-
-    function it_implements_TokenInterface()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
-    }
-
-    function it_is_not_last()
-    {
-        $this->shouldNotBeLast();
-    }
-
-    function it_scores_5_if_argument_matches_simple_type()
-    {
-        $this->beConstructedWith('integer');
-
-        $this->scoreArgument(42)->shouldReturn(5);
-    }
-
-    function it_does_not_scores_if_argument_does_not_match_simple_type()
-    {
-        $this->beConstructedWith('integer');
-
-        $this->scoreArgument(42.0)->shouldReturn(false);
-    }
-
-    function it_scores_5_if_argument_is_an_instance_of_specified_class(\ReflectionObject $object)
-    {
-        $this->beConstructedWith('ReflectionClass');
-
-        $this->scoreArgument($object)->shouldReturn(5);
-    }
-
-    function it_has_simple_string_representation()
-    {
-        $this->__toString()->shouldReturn('type(integer)');
-    }
-
-    function it_scores_5_if_argument_is_an_instance_of_specified_interface(TokenInterface $interface)
-    {
-        $this->beConstructedWith('Prophecy\Argument\Token\TokenInterface');
-
-        $this->scoreArgument($interface)->shouldReturn(5);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/ArgumentSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/ArgumentSpec.php
deleted file mode 100644
index 64232a4d225cf6463b40fb6e1b2d78ab7af846e5..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/ArgumentSpec.php
+++ /dev/null
@@ -1,107 +0,0 @@
-<?php
-
-namespace spec\Prophecy;
-
-use PhpSpec\ObjectBehavior;
-
-class ArgumentSpec extends ObjectBehavior
-{
-    function it_has_a_shortcut_for_exact_argument_token()
-    {
-        $token = $this->exact(42);
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ExactValueToken');
-        $token->getValue()->shouldReturn(42);
-    }
-
-    function it_has_a_shortcut_for_any_argument_token()
-    {
-        $token = $this->any();
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\AnyValueToken');
-    }
-
-    function it_has_a_shortcut_for_multiple_arguments_token()
-    {
-        $token = $this->cetera();
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\AnyValuesToken');
-    }
-
-    function it_has_a_shortcut_for_type_token()
-    {
-        $token = $this->type('integer');
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\TypeToken');
-    }
-
-    function it_has_a_shortcut_for_callback_token()
-    {
-        $token = $this->that('get_class');
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\CallbackToken');
-    }
-
-    function it_has_a_shortcut_for_object_state_token()
-    {
-        $token = $this->which('getName', 'everzet');
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ObjectStateToken');
-    }
-
-    function it_has_a_shortcut_for_logical_and_token()
-    {
-        $token = $this->allOf('integer', 5);
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\LogicalAndToken');
-    }
-
-    function it_has_a_shortcut_for_array_count_token()
-    {
-        $token = $this->size(5);
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ArrayCountToken');
-    }
-
-    function it_has_a_shortcut_for_array_entry_token()
-    {
-        $token = $this->withEntry('key', 'value');
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ArrayEntryToken');
-    }
-
-    function it_has_a_shortcut_for_array_every_entry_token()
-    {
-        $token = $this->withEveryEntry('value');
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ArrayEveryEntryToken');
-    }
-
-    function it_has_a_shortcut_for_identical_value_token()
-    {
-        $token = $this->is('value');
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\IdenticalValueToken');
-    }
-
-    function it_has_a_shortcut_for_array_entry_token_matching_any_key()
-    {
-        $token = $this->containing('value');
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ArrayEntryToken');
-        $token->getKey()->shouldHaveType('Prophecy\Argument\Token\AnyValueToken');
-    }
-
-    function it_has_a_shortcut_for_array_entry_token_matching_any_value()
-    {
-        $token = $this->withKey('key');
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ArrayEntryToken');
-        $token->getValue()->shouldHaveType('Prophecy\Argument\Token\AnyValueToken');
-    }
-
-    function it_has_a_shortcut_for_logical_not_token()
-    {
-        $token = $this->not('kagux');
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\LogicalNotToken');
-    }
-
-    function it_has_a_shortcut_for_string_contains_token()
-    {
-        $token = $this->containingString('string');
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\StringContainsToken');
-    }
-
-    function it_has_a_shortcut_for_approximate_token()
-    {
-        $token = $this->approximate(10);
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ApproximateValueToken');
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Call/CallCenterSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Call/CallCenterSpec.php
deleted file mode 100644
index 83d61f1eca9a4d0b9c3ec3b1e3cd8f755c37ddd5..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Call/CallCenterSpec.php
+++ /dev/null
@@ -1,180 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Call;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Promise\PromiseInterface;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ObjectProphecy;
-use Prophecy\Argument\ArgumentsWildcard;
-
-class CallCenterSpec extends ObjectBehavior
-{
-    function let(ObjectProphecy $objectProphecy)
-    {
-    }
-
-    function it_records_calls_made_through_makeCall_method(ObjectProphecy $objectProphecy, ArgumentsWildcard $wildcard)
-    {
-        $wildcard->scoreArguments(array(5, 2, 3))->willReturn(10);
-        $objectProphecy->getMethodProphecies()->willReturn(array());
-
-        $this->makeCall($objectProphecy, 'setValues', array(5, 2, 3));
-
-        $calls = $this->findCalls('setValues', $wildcard);
-        $calls->shouldHaveCount(1);
-
-        $calls[0]->shouldBeAnInstanceOf('Prophecy\Call\Call');
-        $calls[0]->getMethodName()->shouldReturn('setValues');
-        $calls[0]->getArguments()->shouldReturn(array(5, 2, 3));
-        $calls[0]->getReturnValue()->shouldReturn(null);
-    }
-
-    function it_returns_null_for_any_call_through_makeCall_if_no_method_prophecies_added(
-        $objectProphecy
-    )
-    {
-        $objectProphecy->getMethodProphecies()->willReturn(array());
-
-        $this->makeCall($objectProphecy, 'setValues', array(5, 2, 3))->shouldReturn(null);
-    }
-
-    function it_executes_promise_of_method_prophecy_that_matches_signature_passed_to_makeCall(
-        $objectProphecy,
-        MethodProphecy $method1,
-        MethodProphecy $method2,
-        MethodProphecy $method3,
-        ArgumentsWildcard $arguments1,
-        ArgumentsWildcard $arguments2,
-        ArgumentsWildcard $arguments3,
-        PromiseInterface $promise
-    ) {
-        $method1->hasReturnVoid()->willReturn(false);
-        $method1->getMethodName()->willReturn('getName');
-        $method1->getArgumentsWildcard()->willReturn($arguments1);
-        $arguments1->scoreArguments(array('world', 'everything'))->willReturn(false);
-
-        $method2->hasReturnVoid()->willReturn(false);
-        $method2->getMethodName()->willReturn('setTitle');
-        $method2->getArgumentsWildcard()->willReturn($arguments2);
-        $arguments2->scoreArguments(array('world', 'everything'))->willReturn(false);
-
-        $method3->hasReturnVoid()->willReturn(false);
-        $method3->getMethodName()->willReturn('getName');
-        $method3->getArgumentsWildcard()->willReturn($arguments3);
-        $method3->getPromise()->willReturn($promise);
-        $arguments3->scoreArguments(array('world', 'everything'))->willReturn(200);
-
-        $objectProphecy->getMethodProphecies()->willReturn(array(
-            'method1' => array($method1),
-            'method2' => array($method2, $method3)
-        ));
-        $objectProphecy->getMethodProphecies('getName')->willReturn(array($method1, $method3));
-        $objectProphecy->reveal()->willReturn(new \stdClass());
-
-        $promise->execute(array('world', 'everything'), $objectProphecy->getWrappedObject(), $method3)->willReturn(42);
-
-        $this->makeCall($objectProphecy, 'getName', array('world', 'everything'))->shouldReturn(42);
-
-        $calls = $this->findCalls('getName', $arguments3);
-        $calls->shouldHaveCount(1);
-        $calls[0]->getReturnValue()->shouldReturn(42);
-    }
-
-    function it_executes_promise_of_method_prophecy_that_matches_with_highest_score_to_makeCall(
-        $objectProphecy,
-        MethodProphecy $method1,
-        MethodProphecy $method2,
-        MethodProphecy $method3,
-        ArgumentsWildcard $arguments1,
-        ArgumentsWildcard $arguments2,
-        ArgumentsWildcard $arguments3,
-        PromiseInterface $promise
-    ) {
-        $method1->hasReturnVoid()->willReturn(false);
-        $method1->getMethodName()->willReturn('getName');
-        $method1->getArgumentsWildcard()->willReturn($arguments1);
-        $arguments1->scoreArguments(array('world', 'everything'))->willReturn(50);
-
-        $method2->hasReturnVoid()->willReturn(false);
-        $method2->getMethodName()->willReturn('getName');
-        $method2->getArgumentsWildcard()->willReturn($arguments2);
-        $method2->getPromise()->willReturn($promise);
-        $arguments2->scoreArguments(array('world', 'everything'))->willReturn(300);
-
-        $method3->hasReturnVoid()->willReturn(false);
-        $method3->getMethodName()->willReturn('getName');
-        $method3->getArgumentsWildcard()->willReturn($arguments3);
-        $arguments3->scoreArguments(array('world', 'everything'))->willReturn(200);
-
-        $objectProphecy->getMethodProphecies()->willReturn(array(
-            'method1' => array($method1),
-            'method2' => array($method2, $method3)
-        ));
-        $objectProphecy->getMethodProphecies('getName')->willReturn(array(
-            $method1, $method2, $method3
-        ));
-        $objectProphecy->reveal()->willReturn(new \stdClass());
-
-        $promise->execute(array('world', 'everything'), $objectProphecy->getWrappedObject(), $method2)
-            ->willReturn('second');
-
-        $this->makeCall($objectProphecy, 'getName', array('world', 'everything'))
-            ->shouldReturn('second');
-    }
-
-    function it_throws_exception_if_call_does_not_match_any_of_defined_method_prophecies(
-        $objectProphecy,
-        MethodProphecy $method,
-        ArgumentsWildcard $arguments
-    ) {
-        $method->getMethodName()->willReturn('getName');
-        $method->getArgumentsWildcard()->willReturn($arguments);
-        $arguments->scoreArguments(array('world', 'everything'))->willReturn(false);
-        $arguments->__toString()->willReturn('arg1, arg2');
-
-        $objectProphecy->getMethodProphecies()->willReturn(array('method1' => array($method)));
-        $objectProphecy->getMethodProphecies('getName')->willReturn(array($method));
-
-        $this->shouldThrow('Prophecy\Exception\Call\UnexpectedCallException')
-            ->duringMakeCall($objectProphecy, 'getName', array('world', 'everything'));
-    }
-
-    function it_returns_null_if_method_prophecy_that_matches_makeCall_arguments_has_no_promise(
-        $objectProphecy,
-        MethodProphecy $method,
-        ArgumentsWildcard $arguments
-    ) {
-        $method->hasReturnVoid()->willReturn(false);
-        $method->getMethodName()->willReturn('getName');
-        $method->getArgumentsWildcard()->willReturn($arguments);
-        $method->getPromise()->willReturn(null);
-        $arguments->scoreArguments(array('world', 'everything'))->willReturn(100);
-
-        $objectProphecy->getMethodProphecies()->willReturn(array($method));
-        $objectProphecy->getMethodProphecies('getName')->willReturn(array($method));
-
-        $this->makeCall($objectProphecy, 'getName', array('world', 'everything'))
-            ->shouldReturn(null);
-    }
-
-    function it_finds_recorded_calls_by_a_method_name_and_arguments_wildcard(
-        $objectProphecy,
-        ArgumentsWildcard $wildcard
-    ) {
-        $objectProphecy->getMethodProphecies()->willReturn(array());
-
-        $this->makeCall($objectProphecy, 'getName', array('world'));
-        $this->makeCall($objectProphecy, 'getName', array('everything'));
-        $this->makeCall($objectProphecy, 'setName', array(42));
-
-        $wildcard->scoreArguments(array('world'))->willReturn(false);
-        $wildcard->scoreArguments(array('everything'))->willReturn(10);
-
-        $calls = $this->findCalls('getName', $wildcard);
-
-        $calls->shouldHaveCount(1);
-        $calls[0]->getMethodName()->shouldReturn('getName');
-        $calls[0]->getArguments()->shouldReturn(array('everything'));
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Call/CallSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Call/CallSpec.php
deleted file mode 100644
index a622b493c45fc073b7649eeab4d6a7bcdd2155f9..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Call/CallSpec.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Call;
-
-use PhpSpec\ObjectBehavior;
-
-class CallSpec extends ObjectBehavior
-{
-    function let(\Exception $exception)
-    {
-        $this->beConstructedWith('setValues', array(5, 2), 42, $exception, 'some_file.php', 23);
-    }
-
-    function it_exposes_method_name_through_getter()
-    {
-        $this->getMethodName()->shouldReturn('setValues');
-    }
-
-    function it_exposes_arguments_through_getter()
-    {
-        $this->getArguments()->shouldReturn(array(5, 2));
-    }
-
-    function it_exposes_return_value_through_getter()
-    {
-        $this->getReturnValue()->shouldReturn(42);
-    }
-
-    function it_exposes_exception_through_getter($exception)
-    {
-        $this->getException()->shouldReturn($exception);
-    }
-
-    function it_exposes_file_and_line_through_getter()
-    {
-        $this->getFile()->shouldReturn('some_file.php');
-        $this->getLine()->shouldReturn(23);
-    }
-
-    function it_returns_shortpath_to_callPlace()
-    {
-        $this->getCallPlace()->shouldReturn('some_file.php:23');
-    }
-
-    function it_returns_unknown_as_callPlace_if_no_file_or_line_provided()
-    {
-        $this->beConstructedWith('setValues', array(), 0, null, null, null);
-
-        $this->getCallPlace()->shouldReturn('unknown');
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ClosureComparatorSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ClosureComparatorSpec.php
deleted file mode 100644
index c174e73c02907d23c445580bd67718346b5e8163..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ClosureComparatorSpec.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Comparator;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-
-class ClosureComparatorSpec extends ObjectBehavior
-{
-    function it_is_comparator()
-    {
-        $this->shouldHaveType('SebastianBergmann\Comparator\Comparator');
-    }
-
-    function it_accepts_only_closures()
-    {
-        $this->accepts(123, 321)->shouldReturn(false);
-        $this->accepts('string', 'string')->shouldReturn(false);
-        $this->accepts(false, true)->shouldReturn(false);
-        $this->accepts(true, false)->shouldReturn(false);
-        $this->accepts((object)array(), (object)array())->shouldReturn(false);
-        $this->accepts(function(){}, (object)array())->shouldReturn(false);
-        $this->accepts(function(){}, (object)array())->shouldReturn(false);
-
-        $this->accepts(function(){}, function(){})->shouldReturn(true);
-    }
-
-    function it_asserts_that_all_closures_are_different()
-    {
-        $this->shouldThrow()->duringAssertEquals(function(){}, function(){});
-    }
-
-    function it_asserts_that_all_closures_are_different_even_if_its_the_same_closure()
-    {
-        $closure = function(){};
-
-        $this->shouldThrow()->duringAssertEquals($closure, $closure);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Comparator/FactorySpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Comparator/FactorySpec.php
deleted file mode 100644
index 6b13336d2ac7411888ba7cb6d8b212a65e5d6e56..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Comparator/FactorySpec.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Comparator;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-
-class FactorySpec extends ObjectBehavior
-{
-    function it_extends_Sebastian_Comparator_Factory()
-    {
-        $this->shouldHaveType('SebastianBergmann\Comparator\Factory');
-    }
-
-    function it_should_have_ClosureComparator_registered()
-    {
-        $comparator = $this->getInstance()->getComparatorFor(function(){}, function(){});
-        $comparator->shouldHaveType('Prophecy\Comparator\ClosureComparator');
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ProphecyComparatorSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ProphecyComparatorSpec.php
deleted file mode 100644
index 06bf6f17d12a08dadbf23eee52948c0fc3111367..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ProphecyComparatorSpec.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Comparator;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Prophet;
-
-class ProphecyComparatorSpec extends ObjectBehavior
-{
-    function it_is_a_comparator()
-    {
-        $this->shouldHaveType('SebastianBergmann\Comparator\ObjectComparator');
-    }
-
-    function it_accepts_only_prophecy_objects()
-    {
-        $this->accepts(123, 321)->shouldReturn(false);
-        $this->accepts('string', 'string')->shouldReturn(false);
-        $this->accepts(false, true)->shouldReturn(false);
-        $this->accepts(true, false)->shouldReturn(false);
-        $this->accepts((object)array(), (object)array())->shouldReturn(false);
-        $this->accepts(function(){}, (object)array())->shouldReturn(false);
-        $this->accepts(function(){}, function(){})->shouldReturn(false);
-
-        $prophet = new Prophet();
-        $prophecy = $prophet->prophesize('Prophecy\Prophecy\ObjectProphecy');
-
-        $this->accepts($prophecy, $prophecy)->shouldReturn(true);
-    }
-
-    function it_asserts_that_an_object_is_equal_to_its_revealed_prophecy()
-    {
-        $prophet = new Prophet();
-        $prophecy = $prophet->prophesize('Prophecy\Prophecy\ObjectProphecy');
-
-        $this->shouldNotThrow()->duringAssertEquals($prophecy->reveal(), $prophecy);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/DisableConstructorPatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/DisableConstructorPatchSpec.php
deleted file mode 100644
index 4fd28d7eb190b6092377b167bb3d724b0cceda49..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/DisableConstructorPatchSpec.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler\ClassPatch;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Doubler\Generator\Node\ArgumentNode;
-use Prophecy\Doubler\Generator\Node\ClassNode;
-use Prophecy\Doubler\Generator\Node\MethodNode;
-
-class DisableConstructorPatchSpec extends ObjectBehavior
-{
-    function it_is_a_patch()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
-    }
-
-    function its_priority_is_100()
-    {
-        $this->getPriority()->shouldReturn(100);
-    }
-
-    function it_supports_anything(ClassNode $node)
-    {
-        $this->supports($node)->shouldReturn(true);
-    }
-
-    function it_makes_all_constructor_arguments_optional(
-        ClassNode $class,
-        MethodNode $method,
-        ArgumentNode $arg1,
-        ArgumentNode $arg2
-    ) {
-        $class->hasMethod('__construct')->willReturn(true);
-        $class->getMethod('__construct')->willReturn($method);
-        $method->getArguments()->willReturn(array($arg1, $arg2));
-
-        $arg1->setDefault(null)->shouldBeCalled();
-        $arg2->setDefault(null)->shouldBeCalled();
-
-        $method->setCode(Argument::type('string'))->shouldBeCalled();
-
-        $this->apply($class);
-    }
-
-    function it_creates_new_constructor_if_object_has_none(ClassNode $class)
-    {
-        $class->hasMethod('__construct')->willReturn(false);
-        $class->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))
-            ->shouldBeCalled();
-
-        $this->apply($class);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/HhvmExceptionPatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/HhvmExceptionPatchSpec.php
deleted file mode 100644
index 9d04421af945eadb726e24b5a20d8b9b9a40fc85..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/HhvmExceptionPatchSpec.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler\ClassPatch;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Doubler\Generator\Node\ClassNode;
-use Prophecy\Doubler\Generator\Node\MethodNode;
-
-class HhvmExceptionPatchSpec extends ObjectBehavior
-{
-    function it_is_a_patch()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
-    }
-
-    function its_priority_is_minus_50()
-    {
-        $this->getPriority()->shouldReturn(-50);
-    }
-
-    function it_uses_parent_code_for_setTraceOptions(ClassNode $node, MethodNode $method, MethodNode $getterMethod)
-    {
-        $node->hasMethod('setTraceOptions')->willReturn(true);
-        $node->getMethod('setTraceOptions')->willReturn($method);
-        $node->hasMethod('getTraceOptions')->willReturn(true);
-        $node->getMethod('getTraceOptions')->willReturn($getterMethod);
-
-        $method->useParentCode()->shouldBeCalled();
-        $getterMethod->useParentCode()->shouldBeCalled();
-
-        $this->apply($node);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/KeywordPatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/KeywordPatchSpec.php
deleted file mode 100644
index 1c454e62d910df5fc3ec10525991f5fc686a5744..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/KeywordPatchSpec.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler\ClassPatch;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Doubler\Generator\Node\ClassNode;
-use Prophecy\Doubler\Generator\Node\MethodNode;
-
-class KeywordPatchSpec extends ObjectBehavior
-{
-    function it_is_a_patch()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
-    }
-
-    function its_priority_is_49()
-    {
-        $this->getPriority()->shouldReturn(49);
-    }
-
-    function it_will_remove_echo_and_eval_methods(
-        ClassNode $node,
-        MethodNode $method1,
-        MethodNode $method2,
-        MethodNode $method3
-    ) {
-        $node->removeMethod('eval')->shouldBeCalled();
-        $node->removeMethod('echo')->shouldBeCalled();
-
-        $method1->getName()->willReturn('echo');
-        $method2->getName()->willReturn('eval');
-        $method3->getName()->willReturn('notKeyword');
-
-        $node->getMethods()->willReturn(array(
-            'echo' => $method1,
-            'eval' => $method2,
-            'notKeyword' => $method3,
-        ));
-
-        $this->apply($node);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/MagicCallPatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/MagicCallPatchSpec.php
deleted file mode 100644
index f7a56317cc8586e361b91aa4a27567dbead7df2c..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/MagicCallPatchSpec.php
+++ /dev/null
@@ -1,140 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler\ClassPatch;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Doubler\Generator\Node\ClassNode;
-use Prophecy\Doubler\Generator\Node\MethodNode;
-
-class MagicCallPatchSpec extends ObjectBehavior
-{
-    function it_is_a_patch()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
-    }
-
-    function it_supports_anything(ClassNode $node)
-    {
-        $this->supports($node)->shouldReturn(true);
-    }
-
-    function it_discovers_api_using_phpdoc(ClassNode $node)
-    {
-        $node->getParentClass()->willReturn('spec\Prophecy\Doubler\ClassPatch\MagicalApi');
-        $node->getInterfaces()->willReturn(array());
-
-        $node->addMethod(new MethodNode('undefinedMethod'))->shouldBeCalled();
-
-        $this->apply($node);
-    }
-
-    function it_ignores_existing_methods(ClassNode $node)
-    {
-        $node->getParentClass()->willReturn('spec\Prophecy\Doubler\ClassPatch\MagicalApiExtended');
-        $node->getInterfaces()->willReturn(array());
-
-        $node->addMethod(new MethodNode('undefinedMethod'))->shouldBeCalled();
-        $node->addMethod(new MethodNode('definedMethod'))->shouldNotBeCalled();
-
-        $this->apply($node);
-    }
-
-    function it_ignores_empty_methods_from_phpdoc(ClassNode $node)
-    {
-        $node->getParentClass()->willReturn('spec\Prophecy\Doubler\ClassPatch\MagicalApiInvalidMethodDefinition');
-        $node->getInterfaces()->willReturn(array());
-
-        $node->addMethod(new MethodNode(''))->shouldNotBeCalled();
-
-        $this->apply($node);
-    }
-
-    function it_discovers_api_using_phpdoc_from_implemented_interfaces(ClassNode $node)
-    {
-        $node->getParentClass()->willReturn('spec\Prophecy\Doubler\ClassPatch\MagicalApiImplemented');
-        $node->getInterfaces()->willReturn(array());
-
-        $node->addMethod(new MethodNode('implementedMethod'))->shouldBeCalled();
-
-        $this->apply($node);
-    }
-
-    function it_discovers_api_using_phpdoc_from_own_interfaces(ClassNode $node)
-    {
-        $node->getParentClass()->willReturn('stdClass');
-        $node->getInterfaces()->willReturn(array('spec\Prophecy\Doubler\ClassPatch\MagicalApiImplemented'));
-
-        $node->addMethod(new MethodNode('implementedMethod'))->shouldBeCalled();
-
-        $this->apply($node);
-    }
-
-    function it_discovers_api_using_phpdoc_from_extended_parent_interfaces(ClassNode $node)
-    {
-        $node->getParentClass()->willReturn('spec\Prophecy\Doubler\ClassPatch\MagicalApiImplementedExtended');
-        $node->getInterfaces()->willReturn(array());
-
-        $node->addMethod(new MethodNode('implementedMethod'))->shouldBeCalled();
-
-        $this->apply($node);
-    }
-
-    function it_has_50_priority()
-    {
-        $this->getPriority()->shouldReturn(50);
-    }
-}
-
-/**
- * @method void undefinedMethod()
- */
-class MagicalApi
-{
-    /**
-     * @return void
-     */
-    public function definedMethod()
-    {
-
-    }
-}
-
-/**
- * @method void invalidMethodDefinition
- * @method void
- * @method
- */
-class MagicalApiInvalidMethodDefinition
-{
-}
-
-/**
- * @method void undefinedMethod()
- * @method void definedMethod()
- */
-class MagicalApiExtended extends MagicalApi
-{
-
-}
-
-/**
- */
-class MagicalApiImplemented implements MagicalApiInterface
-{
-
-}
-
-/**
- */
-class MagicalApiImplementedExtended extends MagicalApiImplemented
-{
-}
-
-/**
- * @method void implementedMethod()
- */
-interface MagicalApiInterface
-{
-
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ProphecySubjectPatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ProphecySubjectPatchSpec.php
deleted file mode 100644
index 96f0e20a3b53132705ce7b872a1dfbb9ba101740..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ProphecySubjectPatchSpec.php
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler\ClassPatch;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Doubler\Generator\Node\ClassNode;
-use Prophecy\Doubler\Generator\Node\MethodNode;
-
-class ProphecySubjectPatchSpec extends ObjectBehavior
-{
-    function it_is_a_patch()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
-    }
-
-    function it_has_priority_of_0()
-    {
-        $this->getPriority()->shouldReturn(0);
-    }
-
-    function it_supports_any_class(ClassNode $node)
-    {
-        $this->supports($node)->shouldReturn(true);
-    }
-
-    function it_forces_class_to_implement_ProphecySubjectInterface(ClassNode $node)
-    {
-        $node->addInterface('Prophecy\Prophecy\ProphecySubjectInterface')->shouldBeCalled();
-
-        $node->addProperty('objectProphecy', 'private')->willReturn(null);
-        $node->getMethods()->willReturn(array());
-        $node->hasMethod(Argument::any())->willReturn(false);
-        $node->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))->willReturn(null);
-        $node->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))->willReturn(null);
-
-        $this->apply($node);
-    }
-
-    function it_forces_all_class_methods_except_constructor_to_proxy_calls_into_prophecy_makeCall(
-        ClassNode $node,
-        MethodNode $constructor,
-        MethodNode $method1,
-        MethodNode $method2,
-        MethodNode $method3
-    ) {
-        $node->addInterface('Prophecy\Prophecy\ProphecySubjectInterface')->willReturn(null);
-        $node->addProperty('objectProphecy', 'private')->willReturn(null);
-        $node->hasMethod(Argument::any())->willReturn(false);
-        $node->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))->willReturn(null);
-        $node->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))->willReturn(null);
-
-        $constructor->getName()->willReturn('__construct');
-        $method1->getName()->willReturn('method1');
-        $method2->getName()->willReturn('method2');
-        $method3->getName()->willReturn('method3');
-
-        $method1->getReturnType()->willReturn('int');
-        $method2->getReturnType()->willReturn('int');
-        $method3->getReturnType()->willReturn('void');
-
-        $node->getMethods()->willReturn(array(
-            'method1' => $method1,
-            'method2' => $method2,
-            'method3' => $method3,
-        ));
-
-        $constructor->setCode(Argument::any())->shouldNotBeCalled();
-
-        $method1->setCode('return $this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());')
-            ->shouldBeCalled();
-        $method2->setCode('return $this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());')
-            ->shouldBeCalled();
-        $method3->setCode('$this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());')
-            ->shouldBeCalled();
-
-        $this->apply($node);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatchSpec.php
deleted file mode 100644
index effd61e7b8a7cfba59a9219bf97a1f9e1b371705..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatchSpec.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler\ClassPatch;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Doubler\Generator\Node\ArgumentNode;
-use Prophecy\Doubler\Generator\Node\ClassNode;
-use Prophecy\Doubler\Generator\Node\MethodNode;
-
-class ReflectionClassNewInstancePatchSpec extends ObjectBehavior
-{
-    function it_is_a_patch()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
-    }
-
-    function its_priority_is_50()
-    {
-        $this->getPriority()->shouldReturn(50);
-    }
-
-    function it_supports_ReflectionClass_only(ClassNode $reflectionClassNode, ClassNode $anotherClassNode)
-    {
-        $reflectionClassNode->getParentClass()->willReturn('ReflectionClass');
-        $anotherClassNode->getParentClass()->willReturn('stdClass');
-
-        $this->supports($reflectionClassNode)->shouldReturn(true);
-        $this->supports($anotherClassNode)->shouldReturn(false);
-    }
-
-    function it_makes_all_newInstance_arguments_optional(
-        ClassNode $class,
-        MethodNode $method,
-        ArgumentNode $arg1
-    ) {
-        $class->getMethod('newInstance')->willReturn($method);
-        $method->getArguments()->willReturn(array($arg1));
-        $arg1->setDefault(null)->shouldBeCalled();
-
-        $this->apply($class);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/SplFileInfoPatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/SplFileInfoPatchSpec.php
deleted file mode 100644
index 5bc3958c8ebbad193ec97c3a6197ec3fba84d360..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/SplFileInfoPatchSpec.php
+++ /dev/null
@@ -1,85 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler\ClassPatch;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Doubler\Generator\Node\ClassNode;
-use Prophecy\Doubler\Generator\Node\MethodNode;
-
-class SplFileInfoPatchSpec extends ObjectBehavior
-{
-    function it_is_a_patch()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
-    }
-
-    function its_priority_is_50()
-    {
-        $this->getPriority()->shouldReturn(50);
-    }
-
-    function it_does_not_support_nodes_without_parent_class(ClassNode $node)
-    {
-        $node->getParentClass()->willReturn('stdClass');
-        $this->supports($node)->shouldReturn(false);
-    }
-
-    function it_supports_nodes_with_SplFileInfo_as_parent_class(ClassNode $node)
-    {
-        $node->getParentClass()->willReturn('SplFileInfo');
-        $this->supports($node)->shouldReturn(true);
-    }
-
-    function it_supports_nodes_with_derivative_of_SplFileInfo_as_parent_class(ClassNode $node)
-    {
-        $node->getParentClass()->willReturn('SplFileInfo');
-        $this->supports($node)->shouldReturn(true);
-    }
-
-    function it_adds_a_method_to_node_if_not_exists(ClassNode $node)
-    {
-        $node->hasMethod('__construct')->willReturn(false);
-        $node->addMethod(Argument::any())->shouldBeCalled();
-        $node->getParentClass()->shouldBeCalled();
-
-        $this->apply($node);
-    }
-
-    function it_updates_existing_method_if_found(ClassNode $node, MethodNode $method)
-    {
-        $node->hasMethod('__construct')->willReturn(true);
-        $node->getMethod('__construct')->willReturn($method);
-        $node->getParentClass()->shouldBeCalled();
-
-        $method->useParentCode()->shouldBeCalled();
-
-        $this->apply($node);
-    }
-
-    function it_should_not_supply_a_file_for_a_directory_iterator(ClassNode $node, MethodNode $method)
-    {
-        $node->hasMethod('__construct')->willReturn(true);
-        $node->getMethod('__construct')->willReturn($method);
-        $node->getParentClass()->willReturn('DirectoryIterator');
-
-        $method->setCode(Argument::that(function($value) {
-            return strpos($value, '.php') === false;
-        }))->shouldBeCalled();
-
-        $this->apply($node);
-    }
-
-    function it_should_supply_a_file_for_a_spl_file_object(ClassNode $node, MethodNode $method)
-    {
-        $node->hasMethod('__construct')->willReturn(true);
-        $node->getMethod('__construct')->willReturn($method);
-        $node->getParentClass()->willReturn('SplFileObject');
-
-        $method->setCode(Argument::that(function($value) {
-            return strpos($value, '.php') !== false;
-        }))->shouldBeCalled();
-
-        $this->apply($node);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/TraversablePatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/TraversablePatchSpec.php
deleted file mode 100644
index abce2f1e31194de0aa0e194e0975364f44e975ab..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/TraversablePatchSpec.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler\ClassPatch;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Doubler\Generator\Node\ClassNode;
-
-class TraversablePatchSpec extends ObjectBehavior
-{
-    function it_is_a_patch()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
-    }
-
-    function it_supports_class_that_implements_only_Traversable(ClassNode $node)
-    {
-        $node->getInterfaces()->willReturn(array('Traversable'));
-
-        $this->supports($node)->shouldReturn(true);
-    }
-
-    function it_does_not_support_class_that_implements_Iterator(ClassNode $node)
-    {
-        $node->getInterfaces()->willReturn(array('Traversable', 'Iterator'));
-
-        $this->supports($node)->shouldReturn(false);
-    }
-
-    function it_does_not_support_class_that_implements_IteratorAggregate(ClassNode $node)
-    {
-        $node->getInterfaces()->willReturn(array('Traversable', 'IteratorAggregate'));
-
-        $this->supports($node)->shouldReturn(false);
-    }
-
-    function it_has_100_priority()
-    {
-        $this->getPriority()->shouldReturn(100);
-    }
-
-    function it_forces_node_to_implement_IteratorAggregate(ClassNode $node)
-    {
-        $node->addInterface('Iterator')->shouldBeCalled();
-
-        $node->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))->willReturn(null);
-
-        $this->apply($node);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/DoublerSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/DoublerSpec.php
deleted file mode 100644
index b58b1a80abfb38d202cc281030b0b9a5f690e8ce..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/DoublerSpec.php
+++ /dev/null
@@ -1,115 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Doubler\ClassPatch\ClassPatchInterface;
-use Prophecy\Doubler\Generator\ClassCreator;
-use Prophecy\Doubler\Generator\ClassMirror;
-use Prophecy\Doubler\Generator\Node\ClassNode;
-use Prophecy\Doubler\NameGenerator;
-
-class DoublerSpec extends ObjectBehavior
-{
-    function let(ClassMirror $mirror, ClassCreator $creator, NameGenerator $namer)
-    {
-        $this->beConstructedWith($mirror, $creator, $namer);
-    }
-
-    function it_does_not_have_patches_by_default()
-    {
-        $this->getClassPatches()->shouldHaveCount(0);
-    }
-
-    function its_registerClassPatch_adds_a_patch_to_the_doubler(ClassPatchInterface $patch)
-    {
-        $this->registerClassPatch($patch);
-        $this->getClassPatches()->shouldReturn(array($patch));
-    }
-
-    function its_getClassPatches_sorts_patches_by_priority(
-        ClassPatchInterface $alt1,
-        ClassPatchInterface $alt2,
-        ClassPatchInterface $alt3,
-        ClassPatchInterface $alt4
-    ) {
-        $alt1->getPriority()->willReturn(2);
-        $alt2->getPriority()->willReturn(50);
-        $alt3->getPriority()->willReturn(10);
-        $alt4->getPriority()->willReturn(0);
-
-        $this->registerClassPatch($alt1);
-        $this->registerClassPatch($alt2);
-        $this->registerClassPatch($alt3);
-        $this->registerClassPatch($alt4);
-
-        $this->getClassPatches()->shouldReturn(array($alt2, $alt3, $alt1, $alt4));
-    }
-
-    function its_double_mirrors_alterates_and_instantiates_provided_class(
-        $mirror,
-        $creator,
-        $namer,
-        ClassPatchInterface $alt1,
-        ClassPatchInterface $alt2,
-        \ReflectionClass $class,
-        \ReflectionClass $interface1,
-        \ReflectionClass $interface2,
-        ClassNode $node
-    ) {
-        $mirror->reflect($class, array($interface1, $interface2))->willReturn($node);
-        $alt1->supports($node)->willReturn(true);
-        $alt2->supports($node)->willReturn(false);
-        $alt1->getPriority()->willReturn(1);
-        $alt2->getPriority()->willReturn(2);
-        $namer->name($class, array($interface1, $interface2))->willReturn('SplStack');
-        $class->getName()->willReturn('stdClass');
-        $interface1->getName()->willReturn('ArrayAccess');
-        $interface2->getName()->willReturn('Iterator');
-
-        $alt1->apply($node)->shouldBeCalled();
-        $alt2->apply($node)->shouldNotBeCalled();
-        $creator->create('SplStack', $node)->shouldBeCalled();
-
-        $this->registerClassPatch($alt1);
-        $this->registerClassPatch($alt2);
-
-        $this->double($class, array($interface1, $interface2))
-            ->shouldReturnAnInstanceOf('SplStack');
-    }
-
-    function it_double_instantiates_a_class_with_constructor_argument(
-        $mirror,
-        \ReflectionClass $class,
-        ClassNode $node,
-        $namer
-    ) {
-        $class->getName()->willReturn('ReflectionClass');
-        $mirror->reflect($class, array())->willReturn($node);
-        $namer->name($class, array())->willReturn('ReflectionClass');
-
-        $double = $this->double($class, array(), array('stdClass'));
-        $double->shouldBeAnInstanceOf('ReflectionClass');
-        $double->getName()->shouldReturn('stdClass');
-    }
-
-    function it_can_instantiate_class_with_final_constructor(
-        $mirror,
-        \ReflectionClass $class,
-        ClassNode $node,
-        $namer
-    ) {
-        $class->getName()->willReturn('spec\Prophecy\Doubler\WithFinalConstructor');
-        $mirror->reflect($class, array())->willReturn($node);
-        $namer->name($class, array())->willReturn('spec\Prophecy\Doubler\WithFinalConstructor');
-
-        $double = $this->double($class, array());
-
-        $double->shouldBeAnInstanceOf('spec\Prophecy\Doubler\WithFinalConstructor');
-    }
-}
-
-class WithFinalConstructor
-{
-    final public function __construct() {}
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCodeGeneratorSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCodeGeneratorSpec.php
deleted file mode 100644
index 2e85b6ca555b9e340e4d91c57e3d40addaa341dd..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCodeGeneratorSpec.php
+++ /dev/null
@@ -1,362 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler\Generator;
-
-use phpDocumentor\Reflection\DocBlock\Tags\Method;
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Doubler\Generator\Node\ArgumentNode;
-use Prophecy\Doubler\Generator\Node\ClassNode;
-use Prophecy\Doubler\Generator\Node\MethodNode;
-
-class ClassCodeGeneratorSpec extends ObjectBehavior
-{
-    function it_generates_proper_php_code_for_specific_ClassNode(
-        ClassNode $class,
-        MethodNode $method1,
-        MethodNode $method2,
-        MethodNode $method3,
-        MethodNode $method4,
-        ArgumentNode $argument11,
-        ArgumentNode $argument12,
-        ArgumentNode $argument21,
-        ArgumentNode $argument31
-    ) {
-        $class->getParentClass()->willReturn('RuntimeException');
-        $class->getInterfaces()->willReturn(array(
-            'Prophecy\Doubler\Generator\MirroredInterface', 'ArrayAccess', 'ArrayIterator'
-        ));
-        $class->getProperties()->willReturn(array('name' => 'public', 'email' => 'private'));
-        $class->getMethods()->willReturn(array($method1, $method2, $method3, $method4));
-
-        $method1->getName()->willReturn('getName');
-        $method1->getVisibility()->willReturn('public');
-        $method1->returnsReference()->willReturn(false);
-        $method1->isStatic()->willReturn(true);
-        $method1->getArguments()->willReturn(array($argument11, $argument12));
-        $method1->hasReturnType()->willReturn(true);
-        $method1->getReturnType()->willReturn('string');
-        $method1->hasNullableReturnType()->willReturn(true);
-        $method1->getCode()->willReturn('return $this->name;');
-
-        $method2->getName()->willReturn('getEmail');
-        $method2->getVisibility()->willReturn('protected');
-        $method2->returnsReference()->willReturn(false);
-        $method2->isStatic()->willReturn(false);
-        $method2->getArguments()->willReturn(array($argument21));
-        $method2->hasReturnType()->willReturn(false);
-        $method2->hasNullableReturnType()->willReturn(true);
-        $method2->getCode()->willReturn('return $this->email;');
-
-        $method3->getName()->willReturn('getRefValue');
-        $method3->getVisibility()->willReturn('public');
-        $method3->returnsReference()->willReturn(true);
-        $method3->isStatic()->willReturn(false);
-        $method3->getArguments()->willReturn(array($argument31));
-        $method3->hasReturnType()->willReturn(true);
-        $method3->getReturnType()->willReturn('string');
-        $method3->hasNullableReturnType()->willReturn(false);
-        $method3->getCode()->willReturn('return $this->refValue;');
-
-        $method4->getName()->willReturn('doSomething');
-        $method4->getVisibility()->willReturn('public');
-        $method4->returnsReference()->willReturn(false);
-        $method4->isStatic()->willReturn(false);
-        $method4->getArguments()->willReturn(array());
-        $method4->hasReturnType()->willReturn(true);
-        $method4->getReturnType()->willReturn('void');
-        $method4->hasNullableReturnType()->willReturn(false);
-        $method4->getCode()->willReturn('return;');
-
-        $argument11->getName()->willReturn('fullname');
-        $argument11->getTypeHint()->willReturn('array');
-        $argument11->isOptional()->willReturn(true);
-        $argument11->getDefault()->willReturn(null);
-        $argument11->isPassedByReference()->willReturn(false);
-        $argument11->isVariadic()->willReturn(false);
-        $argument11->isNullable()->willReturn(false);
-
-        $argument12->getName()->willReturn('class');
-        $argument12->getTypeHint()->willReturn('ReflectionClass');
-        $argument12->isOptional()->willReturn(false);
-        $argument12->isPassedByReference()->willReturn(false);
-        $argument12->isVariadic()->willReturn(false);
-        $argument12->isNullable()->willReturn(false);
-
-        $argument21->getName()->willReturn('default');
-        $argument21->getTypeHint()->willReturn('string');
-        $argument21->isOptional()->willReturn(true);
-        $argument21->getDefault()->willReturn('ever.zet@gmail.com');
-        $argument21->isPassedByReference()->willReturn(false);
-        $argument21->isVariadic()->willReturn(false);
-        $argument21->isNullable()->willReturn(true);
-
-        $argument31->getName()->willReturn('refValue');
-        $argument31->getTypeHint()->willReturn(null);
-        $argument31->isOptional()->willReturn(false);
-        $argument31->getDefault()->willReturn();
-        $argument31->isPassedByReference()->willReturn(false);
-        $argument31->isVariadic()->willReturn(false);
-        $argument31->isNullable()->willReturn(false);
-
-        $code = $this->generate('CustomClass', $class);
-
-        if (version_compare(PHP_VERSION, '7.1', '>=')) {
-            $expected = <<<'PHP'
-namespace  {
-class CustomClass extends \RuntimeException implements \Prophecy\Doubler\Generator\MirroredInterface, \ArrayAccess, \ArrayIterator {
-public $name;
-private $email;
-
-public static function getName(array $fullname = NULL, \ReflectionClass $class): ?string {
-return $this->name;
-}
-protected  function getEmail(?string $default = 'ever.zet@gmail.com') {
-return $this->email;
-}
-public  function &getRefValue( $refValue): string {
-return $this->refValue;
-}
-public  function doSomething(): void {
-return;
-}
-
-}
-}
-PHP;
-        } elseif (version_compare(PHP_VERSION, '7.0', '>=')) {
-            $expected = <<<'PHP'
-namespace  {
-class CustomClass extends \RuntimeException implements \Prophecy\Doubler\Generator\MirroredInterface, \ArrayAccess, \ArrayIterator {
-public $name;
-private $email;
-
-public static function getName(array $fullname = NULL, \ReflectionClass $class): string {
-return $this->name;
-}
-protected  function getEmail(string $default = 'ever.zet@gmail.com') {
-return $this->email;
-}
-public  function &getRefValue( $refValue): string {
-return $this->refValue;
-}
-public  function doSomething() {
-return;
-}
-
-}
-}
-PHP;
-        } else {
-            $expected = <<<'PHP'
-namespace  {
-class CustomClass extends \RuntimeException implements \Prophecy\Doubler\Generator\MirroredInterface, \ArrayAccess, \ArrayIterator {
-public $name;
-private $email;
-
-public static function getName(array $fullname = NULL, \ReflectionClass $class) {
-return $this->name;
-}
-protected  function getEmail(\string $default = 'ever.zet@gmail.com') {
-return $this->email;
-}
-public  function &getRefValue( $refValue) {
-return $this->refValue;
-}
-public  function doSomething() {
-return;
-}
-
-}
-}
-PHP;
-        }
-        $expected = strtr($expected, array("\r\n" => "\n", "\r" => "\n"));
-        $code->shouldBe($expected);
-    }
-
-    function it_generates_proper_php_code_for_variadics(
-        ClassNode $class,
-        MethodNode $method1,
-        MethodNode $method2,
-        MethodNode $method3,
-        MethodNode $method4,
-        ArgumentNode $argument1,
-        ArgumentNode $argument2,
-        ArgumentNode $argument3,
-        ArgumentNode $argument4
-    ) {
-        $class->getParentClass()->willReturn('stdClass');
-        $class->getInterfaces()->willReturn(array('Prophecy\Doubler\Generator\MirroredInterface'));
-        $class->getProperties()->willReturn(array());
-        $class->getMethods()->willReturn(array(
-            $method1, $method2, $method3, $method4
-        ));
-
-        $method1->getName()->willReturn('variadic');
-        $method1->getVisibility()->willReturn('public');
-        $method1->returnsReference()->willReturn(false);
-        $method1->isStatic()->willReturn(false);
-        $method1->getArguments()->willReturn(array($argument1));
-        $method1->hasReturnType()->willReturn(false);
-        $method1->getCode()->willReturn('');
-
-        $method2->getName()->willReturn('variadicByRef');
-        $method2->getVisibility()->willReturn('public');
-        $method2->returnsReference()->willReturn(false);
-        $method2->isStatic()->willReturn(false);
-        $method2->getArguments()->willReturn(array($argument2));
-        $method2->hasReturnType()->willReturn(false);
-        $method2->getCode()->willReturn('');
-
-        $method3->getName()->willReturn('variadicWithType');
-        $method3->getVisibility()->willReturn('public');
-        $method3->returnsReference()->willReturn(false);
-        $method3->isStatic()->willReturn(false);
-        $method3->getArguments()->willReturn(array($argument3));
-        $method3->hasReturnType()->willReturn(false);
-        $method3->getCode()->willReturn('');
-
-        $method4->getName()->willReturn('variadicWithTypeByRef');
-        $method4->getVisibility()->willReturn('public');
-        $method4->returnsReference()->willReturn(false);
-        $method4->isStatic()->willReturn(false);
-        $method4->getArguments()->willReturn(array($argument4));
-        $method4->hasReturnType()->willReturn(false);
-        $method4->getCode()->willReturn('');
-
-        $argument1->getName()->willReturn('args');
-        $argument1->getTypeHint()->willReturn(null);
-        $argument1->isOptional()->willReturn(false);
-        $argument1->isPassedByReference()->willReturn(false);
-        $argument1->isVariadic()->willReturn(true);
-        $argument1->isNullable()->willReturn(false);
-
-        $argument2->getName()->willReturn('args');
-        $argument2->getTypeHint()->willReturn(null);
-        $argument2->isOptional()->willReturn(false);
-        $argument2->isPassedByReference()->willReturn(true);
-        $argument2->isVariadic()->willReturn(true);
-        $argument2->isNullable()->willReturn(false);
-
-        $argument3->getName()->willReturn('args');
-        $argument3->getTypeHint()->willReturn('\ReflectionClass');
-        $argument3->isOptional()->willReturn(false);
-        $argument3->isPassedByReference()->willReturn(false);
-        $argument3->isVariadic()->willReturn(true);
-        $argument3->isNullable()->willReturn(false);
-
-        $argument4->getName()->willReturn('args');
-        $argument4->getTypeHint()->willReturn('\ReflectionClass');
-        $argument4->isOptional()->willReturn(false);
-        $argument4->isPassedByReference()->willReturn(true);
-        $argument4->isVariadic()->willReturn(true);
-        $argument4->isNullable()->willReturn(false);
-
-        $code = $this->generate('CustomClass', $class);
-        $expected = <<<'PHP'
-namespace  {
-class CustomClass extends \stdClass implements \Prophecy\Doubler\Generator\MirroredInterface {
-
-public  function variadic( ...$args) {
-
-}
-public  function variadicByRef( &...$args) {
-
-}
-public  function variadicWithType(\\ReflectionClass ...$args) {
-
-}
-public  function variadicWithTypeByRef(\\ReflectionClass &...$args) {
-
-}
-
-}
-}
-PHP;
-        $expected = strtr($expected, array("\r\n" => "\n", "\r" => "\n"));
-        $code->shouldBe($expected);
-    }
-
-    function it_overrides_properly_methods_with_args_passed_by_reference(
-        ClassNode $class,
-        MethodNode $method,
-        ArgumentNode $argument
-    ) {
-        $class->getParentClass()->willReturn('RuntimeException');
-        $class->getInterfaces()->willReturn(array('Prophecy\Doubler\Generator\MirroredInterface'));
-        $class->getProperties()->willReturn(array());
-        $class->getMethods()->willReturn(array($method));
-
-        $method->getName()->willReturn('getName');
-        $method->getVisibility()->willReturn('public');
-        $method->isStatic()->willReturn(false);
-        $method->getArguments()->willReturn(array($argument));
-        $method->hasReturnType()->willReturn(false);
-        $method->returnsReference()->willReturn(false);
-        $method->getCode()->willReturn('return $this->name;');
-
-        $argument->getName()->willReturn('fullname');
-        $argument->getTypeHint()->willReturn('array');
-        $argument->isOptional()->willReturn(true);
-        $argument->getDefault()->willReturn(null);
-        $argument->isPassedByReference()->willReturn(true);
-        $argument->isVariadic()->willReturn(false);
-        $argument->isNullable()->willReturn(false);
-
-        $code = $this->generate('CustomClass', $class);
-        $expected =<<<'PHP'
-namespace  {
-class CustomClass extends \RuntimeException implements \Prophecy\Doubler\Generator\MirroredInterface {
-
-public  function getName(array &$fullname = NULL) {
-return $this->name;
-}
-
-}
-}
-PHP;
-        $expected = strtr($expected, array("\r\n" => "\n", "\r" => "\n"));
-        $code->shouldBe($expected);
-    }
-
-    function it_generates_empty_class_for_empty_ClassNode(ClassNode $class)
-    {
-        $class->getParentClass()->willReturn('stdClass');
-        $class->getInterfaces()->willReturn(array('Prophecy\Doubler\Generator\MirroredInterface'));
-        $class->getProperties()->willReturn(array());
-        $class->getMethods()->willReturn(array());
-
-        $code = $this->generate('CustomClass', $class);
-        $expected =<<<'PHP'
-namespace  {
-class CustomClass extends \stdClass implements \Prophecy\Doubler\Generator\MirroredInterface {
-
-
-}
-}
-PHP;
-        $expected = strtr($expected, array("\r\n" => "\n", "\r" => "\n"));
-        $code->shouldBe($expected);
-    }
-
-    function it_wraps_class_in_namespace_if_it_is_namespaced(ClassNode $class)
-    {
-        $class->getParentClass()->willReturn('stdClass');
-        $class->getInterfaces()->willReturn(array('Prophecy\Doubler\Generator\MirroredInterface'));
-        $class->getProperties()->willReturn(array());
-        $class->getMethods()->willReturn(array());
-
-        $code = $this->generate('My\Awesome\CustomClass', $class);
-        $expected =<<<'PHP'
-namespace My\Awesome {
-class CustomClass extends \stdClass implements \Prophecy\Doubler\Generator\MirroredInterface {
-
-
-}
-}
-PHP;
-        $expected = strtr($expected, array("\r\n" => "\n", "\r" => "\n"));
-        $code->shouldBe($expected);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCreatorSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCreatorSpec.php
deleted file mode 100644
index e7cae23bc01cb51aea5a75e0768155a3ace24118..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCreatorSpec.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler\Generator;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Doubler\Generator\ClassCodeGenerator;
-use Prophecy\Doubler\Generator\Node\ClassNode;
-
-class ClassCreatorSpec extends ObjectBehavior
-{
-    function let(ClassCodeGenerator $generator)
-    {
-        $this->beConstructedWith($generator);
-    }
-
-    function it_evaluates_code_generated_by_ClassCodeGenerator($generator, ClassNode $class)
-    {
-        $generator->generate('stdClass', $class)->shouldBeCalled()->willReturn(
-            'return 42;'
-        );
-
-        $this->create('stdClass', $class)->shouldReturn(42);
-    }
-
-    function it_throws_an_exception_if_class_does_not_exist_after_evaluation($generator, ClassNode $class)
-    {
-        $generator->generate('CustomClass', $class)->shouldBeCalled()->willReturn(
-            'return 42;'
-        );
-
-        $class->getParentClass()->willReturn('stdClass');
-        $class->getInterfaces()->willReturn(array('Interface1', 'Interface2'));
-
-        $this->shouldThrow('Prophecy\Exception\Doubler\ClassCreatorException')
-            ->duringCreate('CustomClass', $class);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ArgumentNodeSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ArgumentNodeSpec.php
deleted file mode 100644
index 2c8d1886ab19a4e435d389d2373fdeb9eb95640e..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ArgumentNodeSpec.php
+++ /dev/null
@@ -1,92 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler\Generator\Node;
-
-use PhpSpec\ObjectBehavior;
-
-class ArgumentNodeSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith('name');
-    }
-
-    function it_is_not_be_passed_by_reference_by_default()
-    {
-        $this->shouldNotBePassedByReference();
-    }
-
-    function it_is_passed_by_reference_if_marked()
-    {
-        $this->setAsPassedByReference();
-        $this->shouldBePassedByReference();
-    }
-
-    function it_is_not_variadic_by_default()
-    {
-        $this->shouldNotBeVariadic();
-    }
-
-    function it_is_variadic_if_marked()
-    {
-        $this->setAsVariadic();
-        $this->shouldBeVariadic();
-    }
-
-    function it_does_not_have_default_by_default()
-    {
-        $this->shouldNotHaveDefault();
-    }
-
-    function it_does_not_have_default_if_variadic()
-    {
-        $this->setDefault(null);
-        $this->setAsVariadic();
-        $this->shouldNotHaveDefault();
-    }
-
-    function it_does_have_default_if_not_variadic()
-    {
-        $this->setDefault(null);
-        $this->setAsVariadic(false);
-        $this->hasDefault()->shouldReturn(true);
-    }
-
-    function it_has_name_with_which_it_was_been_constructed()
-    {
-        $this->getName()->shouldReturn('name');
-    }
-
-    function it_has_no_typehint_by_default()
-    {
-        $this->getTypeHint()->shouldReturn(null);
-    }
-
-    function its_typeHint_is_mutable()
-    {
-        $this->setTypeHint('array');
-        $this->getTypeHint()->shouldReturn('array');
-    }
-
-    function it_does_not_have_default_value_by_default()
-    {
-        $this->getDefault()->shouldReturn(null);
-    }
-
-    function it_is_not_optional_by_default()
-    {
-        $this->isOptional()->shouldReturn(false);
-    }
-
-    function its_default_is_mutable()
-    {
-        $this->setDefault(array());
-        $this->getDefault()->shouldReturn(array());
-    }
-
-    function it_is_marked_as_optional_when_default_is_set()
-    {
-        $this->setDefault(null);
-        $this->isOptional()->shouldReturn(true);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ClassNodeSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ClassNodeSpec.php
deleted file mode 100644
index 16fc498b46a6e3a822ddb11636b0588a1c15d366..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ClassNodeSpec.php
+++ /dev/null
@@ -1,185 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler\Generator\Node;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Doubler\Generator\Node\MethodNode;
-use Prophecy\Exception\Doubler\MethodNotExtendableException;
-
-class ClassNodeSpec extends ObjectBehavior
-{
-    function its_parentClass_is_a_stdClass_by_default()
-    {
-        $this->getParentClass()->shouldReturn('stdClass');
-    }
-
-    function its_parentClass_is_mutable()
-    {
-        $this->setParentClass('Exception');
-        $this->getParentClass()->shouldReturn('Exception');
-    }
-
-    function its_parentClass_is_set_to_stdClass_if_user_set_null()
-    {
-        $this->setParentClass(null);
-        $this->getParentClass()->shouldReturn('stdClass');
-    }
-
-    function it_does_not_implement_any_interface_by_default()
-    {
-        $this->getInterfaces()->shouldHaveCount(0);
-    }
-
-    function its_addInterface_adds_item_to_the_list_of_implemented_interfaces()
-    {
-        $this->addInterface('MyInterface');
-        $this->getInterfaces()->shouldHaveCount(1);
-    }
-
-    function its_hasInterface_returns_true_if_class_implements_interface()
-    {
-        $this->addInterface('MyInterface');
-        $this->hasInterface('MyInterface')->shouldReturn(true);
-    }
-
-    function its_hasInterface_returns_false_if_class_does_not_implements_interface()
-    {
-        $this->hasInterface('MyInterface')->shouldReturn(false);
-    }
-
-    function it_supports_implementation_of_multiple_interfaces()
-    {
-        $this->addInterface('MyInterface');
-        $this->addInterface('MySecondInterface');
-        $this->getInterfaces()->shouldHaveCount(2);
-    }
-
-    function it_ignores_same_interfaces_added_twice()
-    {
-        $this->addInterface('MyInterface');
-        $this->addInterface('MyInterface');
-
-        $this->getInterfaces()->shouldHaveCount(1);
-        $this->getInterfaces()->shouldReturn(array('MyInterface'));
-    }
-
-    function it_does_not_have_methods_by_default()
-    {
-        $this->getMethods()->shouldHaveCount(0);
-    }
-
-    function it_can_has_methods(MethodNode $method1, MethodNode $method2)
-    {
-        $method1->getName()->willReturn('__construct');
-        $method2->getName()->willReturn('getName');
-
-        $this->addMethod($method1);
-        $this->addMethod($method2);
-
-        $this->getMethods()->shouldReturn(array(
-            '__construct' => $method1,
-            'getName'     => $method2
-        ));
-    }
-
-    function its_hasMethod_returns_true_if_method_exists(MethodNode $method)
-    {
-        $method->getName()->willReturn('getName');
-
-        $this->addMethod($method);
-
-        $this->hasMethod('getName')->shouldReturn(true);
-    }
-
-    function its_getMethod_returns_method_by_name(MethodNode $method)
-    {
-        $method->getName()->willReturn('getName');
-
-        $this->addMethod($method);
-
-        $this->getMethod('getName')->shouldReturn($method);
-    }
-
-    function its_hasMethod_returns_false_if_method_does_not_exists()
-    {
-        $this->hasMethod('getName')->shouldReturn(false);
-    }
-
-    function its_hasMethod_returns_false_if_method_has_been_removed(MethodNode $method)
-    {
-        $method->getName()->willReturn('getName');
-        $this->addMethod($method);
-        $this->removeMethod('getName');
-
-        $this->hasMethod('getName')->shouldReturn(false);
-    }
-
-
-    function it_does_not_have_properties_by_default()
-    {
-        $this->getProperties()->shouldHaveCount(0);
-    }
-
-    function it_is_able_to_have_properties()
-    {
-        $this->addProperty('title');
-        $this->addProperty('text', 'private');
-        $this->getProperties()->shouldReturn(array(
-            'title' => 'public',
-            'text'  => 'private'
-        ));
-    }
-
-    function its_addProperty_does_not_accept_unsupported_visibility()
-    {
-        $this->shouldThrow('InvalidArgumentException')->duringAddProperty('title', 'town');
-    }
-
-    function its_addProperty_lowercases_visibility_before_setting()
-    {
-        $this->addProperty('text', 'PRIVATE');
-        $this->getProperties()->shouldReturn(array('text' => 'private'));
-    }
-
-    function its_has_no_unextendable_methods_by_default()
-    {
-        $this->getUnextendableMethods()->shouldHaveCount(0);
-    }
-
-    function its_addUnextendableMethods_adds_an_unextendable_method()
-    {
-        $this->addUnextendableMethod('testMethod');
-        $this->getUnextendableMethods()->shouldHaveCount(1);
-    }
-
-    function its_methods_are_extendable_by_default()
-    {
-        $this->isExtendable('testMethod')->shouldReturn(true);
-    }
-
-    function its_unextendable_methods_are_not_extendable()
-    {
-        $this->addUnextendableMethod('testMethod');
-        $this->isExtendable('testMethod')->shouldReturn(false);
-    }
-
-    function its_addUnextendableMethods_doesnt_create_duplicates()
-    {
-        $this->addUnextendableMethod('testMethod');
-        $this->addUnextendableMethod('testMethod');
-        $this->getUnextendableMethods()->shouldHaveCount(1);
-    }
-
-    function it_throws_an_exception_when_adding_a_method_that_isnt_extendable(MethodNode $method)
-    {
-        $this->addUnextendableMethod('testMethod');
-        $method->getName()->willReturn('testMethod');
-
-        $expectedException = new MethodNotExtendableException(
-            "Method `testMethod` is not extendable, so can not be added.",
-            "stdClass",
-            "testMethod"
-        );
-        $this->shouldThrow($expectedException)->duringAddMethod($method);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/MethodNodeSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/MethodNodeSpec.php
deleted file mode 100644
index 14cfe8dec7c8254c217b20e6e2c173668f7737e3..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/MethodNodeSpec.php
+++ /dev/null
@@ -1,134 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler\Generator\Node;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Doubler\Generator\Node\ArgumentNode;
-
-class MethodNodeSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith('getTitle');
-    }
-
-    function it_has_a_name()
-    {
-        $this->getName()->shouldReturn('getTitle');
-    }
-
-    function it_has_public_visibility_by_default()
-    {
-        $this->getVisibility()->shouldReturn('public');
-    }
-
-    function its_visibility_is_mutable()
-    {
-        $this->setVisibility('private');
-        $this->getVisibility()->shouldReturn('private');
-    }
-
-    function it_is_not_static_by_default()
-    {
-        $this->shouldNotBeStatic();
-    }
-
-    function it_does_not_return_a_reference_by_default()
-    {
-        $this->returnsReference()->shouldReturn(false);
-    }
-
-    function it_should_be_settable_as_returning_a_reference_through_setter()
-    {
-        $this->setReturnsReference();
-        $this->returnsReference()->shouldReturn(true);
-    } 
-
-    function it_should_be_settable_as_static_through_setter()
-    {
-        $this->setStatic();
-        $this->shouldBeStatic();
-    }
-
-    function it_accepts_only_supported_visibilities()
-    {
-        $this->shouldThrow('InvalidArgumentException')->duringSetVisibility('stealth');
-    }
-
-    function it_lowercases_visibility_before_setting_it()
-    {
-        $this->setVisibility('Public');
-        $this->getVisibility()->shouldReturn('public');
-    }
-
-    function its_useParentCode_causes_method_to_call_parent(ArgumentNode $argument1, ArgumentNode $argument2)
-    {
-        $argument1->getName()->willReturn('objectName');
-        $argument2->getName()->willReturn('default');
-
-        $argument1->isVariadic()->willReturn(false);
-        $argument2->isVariadic()->willReturn(true);
-
-        $this->addArgument($argument1);
-        $this->addArgument($argument2);
-
-        $this->useParentCode();
-
-        $this->getCode()->shouldReturn(
-            'return parent::getTitle($objectName, ...$default);'
-        );
-    }
-
-    function its_code_is_mutable()
-    {
-        $this->setCode('echo "code";');
-        $this->getCode()->shouldReturn('echo "code";');
-    }
-
-    function its_reference_returning_methods_will_generate_exceptions()
-    {
-        $this->setCode('echo "code";');
-        $this->setReturnsReference();
-        $this->getCode()->shouldReturn("throw new \Prophecy\Exception\Doubler\ReturnByReferenceException('Returning by reference not supported', get_class(\$this), 'getTitle');");
-    }
-
-    function its_setCode_provided_with_null_cleans_method_body()
-    {
-        $this->setCode(null);
-        $this->getCode()->shouldReturn('');
-    }
-
-    function it_is_constructable_with_code()
-    {
-        $this->beConstructedWith('getTitle', 'die();');
-        $this->getCode()->shouldReturn('die();');
-    }
-
-    function it_does_not_have_arguments_by_default()
-    {
-        $this->getArguments()->shouldHaveCount(0);
-    }
-
-    function it_supports_adding_arguments(ArgumentNode $argument1, ArgumentNode $argument2)
-    {
-        $this->addArgument($argument1);
-        $this->addArgument($argument2);
-
-        $this->getArguments()->shouldReturn(array($argument1, $argument2));
-    }
-
-    function it_does_not_have_return_type_by_default()
-    {
-        $this->hasReturnType()->shouldReturn(false);
-    }
-
-    function it_setReturnType_sets_return_type()
-    {
-        $returnType = 'string';
-
-        $this->setReturnType($returnType);
-
-        $this->hasReturnType()->shouldReturn(true);
-        $this->getReturnType()->shouldReturn($returnType);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/LazyDoubleSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/LazyDoubleSpec.php
deleted file mode 100644
index fdf1e9621c133d7f84366961c230f02ae6b36fb2..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/LazyDoubleSpec.php
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Doubler\Doubler;
-use Prophecy\Prophecy\ProphecySubjectInterface;
-
-class LazyDoubleSpec extends ObjectBehavior
-{
-    function let(Doubler $doubler)
-    {
-        $this->beConstructedWith($doubler);
-    }
-
-    function it_returns_anonymous_double_instance_by_default($doubler, ProphecySubjectInterface $double)
-    {
-        $doubler->double(null, array())->willReturn($double);
-
-        $this->getInstance()->shouldReturn($double);
-    }
-
-    function it_returns_class_double_instance_if_set($doubler, ProphecySubjectInterface $double, \ReflectionClass $class)
-    {
-        $doubler->double($class, array())->willReturn($double);
-
-        $this->setParentClass($class);
-
-        $this->getInstance()->shouldReturn($double);
-    }
-
-    function it_returns_same_double_instance_if_called_2_times(
-        $doubler,
-        ProphecySubjectInterface $double1,
-        ProphecySubjectInterface $double2
-    ) {
-        $doubler->double(null, array())->willReturn($double1);
-        $doubler->double(null, array())->willReturn($double2);
-
-        $this->getInstance()->shouldReturn($double2);
-        $this->getInstance()->shouldReturn($double2);
-    }
-
-    function its_setParentClass_throws_ClassNotFoundException_if_class_not_found()
-    {
-        $this->shouldThrow('Prophecy\Exception\Doubler\ClassNotFoundException')
-            ->duringSetParentClass('SomeUnexistingClass');
-    }
-
-    function its_setParentClass_throws_exception_if_prophecy_is_already_created(
-        $doubler,
-        ProphecySubjectInterface $double
-    ) {
-        $doubler->double(null, array())->willReturn($double);
-
-        $this->getInstance();
-
-        $this->shouldThrow('Prophecy\Exception\Doubler\DoubleException')
-            ->duringSetParentClass('stdClass');
-    }
-
-    function its_addInterface_throws_InterfaceNotFoundException_if_no_interface_found()
-    {
-        $this->shouldThrow('Prophecy\Exception\Doubler\InterfaceNotFoundException')
-            ->duringAddInterface('SomeUnexistingInterface');
-    }
-
-    function its_addInterface_throws_exception_if_prophecy_is_already_created(
-        $doubler,
-        ProphecySubjectInterface $double
-    ) {
-        $doubler->double(null, array())->willReturn($double);
-
-        $this->getInstance();
-
-        $this->shouldThrow('Prophecy\Exception\Doubler\DoubleException')
-            ->duringAddInterface('ArrayAccess');
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/NameGeneratorSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/NameGeneratorSpec.php
deleted file mode 100644
index 1e9b17fb65be35e0563a59a87d24f7b47e164750..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/NameGeneratorSpec.php
+++ /dev/null
@@ -1,60 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler;
-
-use PhpSpec\ObjectBehavior;
-
-class NameGeneratorSpec extends ObjectBehavior
-{
-    function its_name_generates_name_based_on_simple_class_reflection(\ReflectionClass $class)
-    {
-        $class->getName()->willReturn('stdClass');
-        $this->name($class, array())->shouldStartWith('Double\stdClass\\');
-    }
-
-    function its_name_generates_name_based_on_namespaced_class_reflection(\ReflectionClass $class)
-    {
-        $class->getName()->willReturn('Some\Custom\Class');
-        $this->name($class, array())->shouldStartWith('Double\Some\Custom\Class\P');
-    }
-
-    function its_name_generates_name_based_on_interface_shortnames(
-        \ReflectionClass $interface1,
-        \ReflectionClass $interface2
-    ) {
-        $interface1->getShortName()->willReturn('HandlerInterface');
-        $interface2->getShortName()->willReturn('LoaderInterface');
-
-        $this->name(null, array($interface1, $interface2))->shouldStartWith(
-            'Double\HandlerInterface\LoaderInterface\P'
-        );
-    }
-
-    function it_generates_proper_name_for_no_class_and_interfaces_list()
-    {
-        $this->name(null, array())->shouldStartWith('Double\stdClass\P');
-    }
-
-    function its_name_generates_name_based_only_on_class_if_its_available(
-        \ReflectionClass $class,
-        \ReflectionClass $interface1,
-        \ReflectionClass $interface2
-    ) {
-        $class->getName()->willReturn('Some\Custom\Class');
-        $interface1->getShortName()->willReturn('HandlerInterface');
-        $interface2->getShortName()->willReturn('LoaderInterface');
-
-        $this->name($class, array($interface1, $interface2))->shouldStartWith(
-            'Double\Some\Custom\Class\P'
-        );
-    }
-
-    public function getMatchers()
-    {
-        return array(
-            'startWith' => function ($subject, $string) {
-                return 0 === strpos($subject, $string);
-            },
-        );
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Call/UnexpectedCallExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Call/UnexpectedCallExceptionSpec.php
deleted file mode 100644
index 5e2c635b4c70dea13d888f2ea4b5868c863a42f8..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Call/UnexpectedCallExceptionSpec.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Exception\Call;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Prophecy\ObjectProphecy;
-use spec\Prophecy\Exception\Prophecy\Prophecy;
-
-class UnexpectedCallExceptionSpec extends ObjectBehavior
-{
-    function let(ObjectProphecy $objectProphecy)
-    {
-        $this->beConstructedWith('msg', $objectProphecy, 'getName', array('arg1', 'arg2'));
-    }
-
-    function it_is_prophecy_exception()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Exception\Prophecy\ObjectProphecyException');
-    }
-
-    function it_exposes_method_name_through_getter()
-    {
-        $this->getMethodName()->shouldReturn('getName');
-    }
-
-    function it_exposes_arguments_through_getter()
-    {
-        $this->getArguments()->shouldReturn(array('arg1', 'arg2'));
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassCreatorExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassCreatorExceptionSpec.php
deleted file mode 100644
index da3aa580006929105363aade6a2898a2d0379d33..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassCreatorExceptionSpec.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Exception\Doubler;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Doubler\Generator\Node\ClassNode;
-use spec\Prophecy\Exception\Prophecy;
-
-class ClassCreatorExceptionSpec extends ObjectBehavior
-{
-    function let(ClassNode $node)
-    {
-        $this->beConstructedWith('', $node);
-    }
-
-    function it_is_a_prophecy_exception()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Exception\Exception');
-        $this->shouldBeAnInstanceOf('Prophecy\Exception\Doubler\DoublerException');
-    }
-
-    function it_contains_a_reflected_node($node)
-    {
-        $this->getClassNode()->shouldReturn($node);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassMirrorExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassMirrorExceptionSpec.php
deleted file mode 100644
index c4f547a78a1f9ba0f76fab58e74a8d2e475dfaf1..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassMirrorExceptionSpec.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Exception\Doubler;
-
-use PhpSpec\ObjectBehavior;
-
-class ClassMirrorExceptionSpec extends ObjectBehavior
-{
-    function let(\ReflectionClass $class)
-    {
-        $this->beConstructedWith('', $class);
-    }
-
-    function it_is_a_prophecy_exception()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Exception\Exception');
-        $this->shouldBeAnInstanceOf('Prophecy\Exception\Doubler\DoublerException');
-    }
-
-    function it_contains_a_reflected_class_link($class)
-    {
-        $this->getReflectedClass()->shouldReturn($class);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassNotFoundExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassNotFoundExceptionSpec.php
deleted file mode 100644
index 251512b9bb6ee73545f58a755b25bfefcec78b46..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassNotFoundExceptionSpec.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Exception\Doubler;
-
-use PhpSpec\ObjectBehavior;
-use spec\Prophecy\Exception\Prophecy;
-
-class ClassNotFoundExceptionSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith('msg', 'CustomClass');
-    }
-
-    function it_is_a_prophecy_exception()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Exception\Exception');
-        $this->shouldBeAnInstanceOf('Prophecy\Exception\Doubler\DoubleException');
-    }
-
-    function its_getClassname_returns_classname()
-    {
-        $this->getClassname()->shouldReturn('CustomClass');
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/DoubleExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/DoubleExceptionSpec.php
deleted file mode 100644
index 6fe5a19aeb4274da9cdf7c1af9099bf65e6875d2..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/DoubleExceptionSpec.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Exception\Doubler;
-
-use PhpSpec\ObjectBehavior;
-
-class DoubleExceptionSpec extends ObjectBehavior
-{
-    function it_is_a_double_exception()
-    {
-        $this->shouldBeAnInstanceOf('RuntimeException');
-        $this->shouldBeAnInstanceOf('Prophecy\Exception\Doubler\DoublerException');
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/InterfaceNotFoundExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/InterfaceNotFoundExceptionSpec.php
deleted file mode 100644
index ad1a439e77c63b2c471fb7f203b227bbc03f4a19..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/InterfaceNotFoundExceptionSpec.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Exception\Doubler;
-
-use PhpSpec\ObjectBehavior;
-use spec\Prophecy\Exception\Prophecy;
-
-class InterfaceNotFoundExceptionSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith('msg', 'CustomInterface');
-    }
-
-    function it_extends_ClassNotFoundException()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Exception\Doubler\ClassNotFoundException');
-    }
-
-    function its_getClassname_returns_classname()
-    {
-        $this->getClassname()->shouldReturn('CustomInterface');
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotExtendableExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotExtendableExceptionSpec.php
deleted file mode 100644
index 5028b0263fb09947d9137fcee14a615bd9fc226e..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotExtendableExceptionSpec.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Exception\Doubler;
-
-use PhpSpec\ObjectBehavior;
-use spec\Prophecy\Exception\Prophecy;
-
-class MethodNotExtendableExceptionSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith('', 'User', 'getName');
-    }
-
-    function it_is_DoubleException()
-    {
-        $this->shouldHaveType('Prophecy\Exception\Doubler\DoubleException');
-    }
-
-    function it_has_MethodName()
-    {
-        $this->getMethodName()->shouldReturn('getName');
-    }
-
-    function it_has_classname()
-    {
-        $this->getClassName()->shouldReturn('User');
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotFoundExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotFoundExceptionSpec.php
deleted file mode 100644
index a889dd7ef45c64e773a7ad2ae84ca933bd352384..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotFoundExceptionSpec.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Exception\Doubler;
-
-use PhpSpec\ObjectBehavior;
-use spec\Prophecy\Exception\Prophecy;
-
-class MethodNotFoundExceptionSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith('', 'User', 'getName', array(1, 2, 3));
-    }
-
-    function it_is_DoubleException()
-    {
-        $this->shouldHaveType('Prophecy\Exception\Doubler\DoubleException');
-    }
-
-    function it_has_MethodName()
-    {
-        $this->getMethodName()->shouldReturn('getName');
-    }
-
-    function it_has_classnamej()
-    {
-        $this->getClassname()->shouldReturn('User');
-    }
-
-    function it_has_an_arguments_list()
-    {
-        $this->getArguments()->shouldReturn(array(1, 2, 3));
-    }
-
-    function it_has_a_default_null_argument_list()
-    {
-        $this->beConstructedWith('', 'User', 'getName');
-        $this->getArguments()->shouldReturn(null);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/AggregateExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/AggregateExceptionSpec.php
deleted file mode 100644
index d78ea7386fa95f710acaa470b3d806cfa383b818..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/AggregateExceptionSpec.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Exception\Prediction;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Exception\Prediction\PredictionException;
-use Prophecy\Prophecy\ObjectProphecy;
-
-class AggregateExceptionSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith(null);
-    }
-
-    function it_is_prediction_exception()
-    {
-        $this->shouldBeAnInstanceOf('RuntimeException');
-        $this->shouldBeAnInstanceOf('Prophecy\Exception\Prediction\PredictionException');
-    }
-
-    function it_can_store_objectProphecy_link(ObjectProphecy $object)
-    {
-        $this->setObjectProphecy($object);
-        $this->getObjectProphecy()->shouldReturn($object);
-    }
-
-    function it_should_not_have_exceptions_at_the_beginning()
-    {
-        $this->getExceptions()->shouldHaveCount(0);
-    }
-
-    function it_should_append_exception_through_append_method(PredictionException $exception)
-    {
-        $exception->getMessage()->willReturn('Exception #1');
-
-        $this->append($exception);
-
-        $this->getExceptions()->shouldReturn(array($exception));
-    }
-
-    function it_should_update_message_during_append(PredictionException $exception)
-    {
-        $exception->getMessage()->willReturn('Exception #1');
-
-        $this->append($exception);
-
-        $this->getMessage()->shouldReturn("  Exception #1");
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/NoCallsExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/NoCallsExceptionSpec.php
deleted file mode 100644
index c2aa31dff9936f57d1c9fb0e1e82119133093107..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/NoCallsExceptionSpec.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Exception\Prediction;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ObjectProphecy;
-
-class NoCallsExceptionSpec extends ObjectBehavior
-{
-    function let(ObjectProphecy $objectProphecy, MethodProphecy $methodProphecy)
-    {
-        $methodProphecy->getObjectProphecy()->willReturn($objectProphecy);
-
-        $this->beConstructedWith('message', $methodProphecy);
-    }
-
-    function it_is_PredictionException()
-    {
-        $this->shouldHaveType('Prophecy\Exception\Prediction\PredictionException');
-    }
-
-    function it_extends_MethodProphecyException()
-    {
-        $this->shouldHaveType('Prophecy\Exception\Prophecy\MethodProphecyException');
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsCountExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsCountExceptionSpec.php
deleted file mode 100644
index e18932edcdb675bc8ea1d12c127aa86c088fa5e0..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsCountExceptionSpec.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Exception\Prediction;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Call\Call;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ObjectProphecy;
-
-class UnexpectedCallsCountExceptionSpec extends ObjectBehavior
-{
-    function let( ObjectProphecy $objectProphecy, MethodProphecy $methodProphecy, Call $call1, Call $call2) {
-        $methodProphecy->getObjectProphecy()->willReturn($objectProphecy);
-
-        $this->beConstructedWith('message', $methodProphecy, 5, array($call1, $call2));
-    }
-
-    function it_extends_UnexpectedCallsException()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Exception\Prediction\UnexpectedCallsException');
-    }
-
-    function it_should_expose_expectedCount_through_getter()
-    {
-        $this->getExpectedCount()->shouldReturn(5);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsExceptionSpec.php
deleted file mode 100644
index 49d12d597de5b969ddd03b4e2ae59e805b604c0c..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsExceptionSpec.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Exception\Prediction;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Call\Call;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ObjectProphecy;
-
-class UnexpectedCallsExceptionSpec extends ObjectBehavior
-{
-    function let(ObjectProphecy $objectProphecy, MethodProphecy $methodProphecy, Call $call1, Call $call2)
-    {
-        $methodProphecy->getObjectProphecy()->willReturn($objectProphecy);
-
-        $this->beConstructedWith('message', $methodProphecy, array($call1, $call2));
-    }
-
-    function it_is_PredictionException()
-    {
-        $this->shouldHaveType('Prophecy\Exception\Prediction\PredictionException');
-    }
-
-    function it_extends_MethodProphecyException()
-    {
-        $this->shouldHaveType('Prophecy\Exception\Prophecy\MethodProphecyException');
-    }
-
-    function it_should_expose_calls_list_through_getter($call1, $call2)
-    {
-        $this->getCalls()->shouldReturn(array($call1, $call2));
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/MethodProphecyExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/MethodProphecyExceptionSpec.php
deleted file mode 100644
index d05c66a587b15dbd991a8ee6fce11da3021c4dc4..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/MethodProphecyExceptionSpec.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Exception\Prophecy;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ObjectProphecy;
-use spec\Prophecy\Exception\Prophecy;
-
-class MethodProphecyExceptionSpec extends ObjectBehavior
-{
-    function let(ObjectProphecy $objectProphecy, MethodProphecy $methodProphecy)
-    {
-        $methodProphecy->getObjectProphecy()->willReturn($objectProphecy);
-
-        $this->beConstructedWith('message', $methodProphecy);
-    }
-
-    function it_extends_DoubleException()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Exception\Prophecy\ObjectProphecyException');
-    }
-
-    function it_holds_a_stub_reference($methodProphecy)
-    {
-        $this->getMethodProphecy()->shouldReturn($methodProphecy);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/ObjectProphecyExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/ObjectProphecyExceptionSpec.php
deleted file mode 100644
index 91ffd5b9c03d67cfdee029e815dec147d9bd94ba..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/ObjectProphecyExceptionSpec.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Exception\Prophecy;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Prophecy\ObjectProphecy;
-
-class ObjectProphecyExceptionSpec extends ObjectBehavior
-{
-    function let(ObjectProphecy $objectProphecy)
-    {
-        $this->beConstructedWith('message', $objectProphecy);
-    }
-
-    function it_should_be_a_prophecy_exception()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Exception\Prophecy\ProphecyException');
-    }
-
-    function it_holds_double_reference($objectProphecy)
-    {
-        $this->getObjectProphecy()->shouldReturn($objectProphecy);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallPredictionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallPredictionSpec.php
deleted file mode 100644
index 4f03db2f2d801cb798c9921b004045947e81abdd..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallPredictionSpec.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Prediction;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Argument\ArgumentsWildcard;
-use Prophecy\Call\Call;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ObjectProphecy;
-
-class CallPredictionSpec extends ObjectBehavior
-{
-    function it_is_prediction()
-    {
-        $this->shouldHaveType('Prophecy\Prediction\PredictionInterface');
-    }
-
-    function it_does_nothing_if_there_is_more_than_one_call_been_made(
-        ObjectProphecy $object,
-        MethodProphecy $method,
-        Call $call
-    ) {
-        $this->check(array($call), $object, $method)->shouldReturn(null);
-    }
-
-    function it_throws_NoCallsException_if_no_calls_found(
-        ObjectProphecy $object,
-        MethodProphecy $method,
-        ArgumentsWildcard $arguments
-    ) {
-        $method->getObjectProphecy()->willReturn($object);
-        $method->getMethodName()->willReturn('getName');
-        $method->getArgumentsWildcard()->willReturn($arguments);
-        $arguments->__toString()->willReturn('123');
-        $object->reveal()->willReturn(new \stdClass());
-        $object->findProphecyMethodCalls('getName', Argument::any())->willReturn(array());
-
-        $this->shouldThrow('Prophecy\Exception\Prediction\NoCallsException')
-            ->duringCheck(array(), $object, $method);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallTimesPredictionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallTimesPredictionSpec.php
deleted file mode 100644
index 52ce31cfd1793070d3c34929ed6d02a0d99b5728..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallTimesPredictionSpec.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Prediction;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument\ArgumentsWildcard;
-use Prophecy\Call\Call;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ObjectProphecy;
-
-class CallTimesPredictionSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith(2);
-    }
-
-    function it_is_prediction()
-    {
-        $this->shouldHaveType('Prophecy\Prediction\PredictionInterface');
-    }
-
-    function it_does_nothing_if_there_were_exact_amount_of_calls_being_made(
-        ObjectProphecy $object,
-        MethodProphecy $method,
-        Call $call1,
-        Call $call2
-    ) {
-        $this->check(array($call1, $call2), $object, $method)->shouldReturn(null);
-    }
-
-    function it_throws_UnexpectedCallsCountException_if_calls_found(
-        ObjectProphecy $object,
-        MethodProphecy $method,
-        Call $call,
-        ArgumentsWildcard $arguments
-    ) {
-        $method->getObjectProphecy()->willReturn($object);
-        $method->getMethodName()->willReturn('getName');
-        $method->getArgumentsWildcard()->willReturn($arguments);
-        $arguments->__toString()->willReturn('123');
-
-        $call->getMethodName()->willReturn('getName');
-        $call->getArguments()->willReturn(array(5, 4, 'three'));
-        $call->getCallPlace()->willReturn('unknown');
-
-        $this->shouldThrow('Prophecy\Exception\Prediction\UnexpectedCallsCountException')
-            ->duringCheck(array($call), $object, $method);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallbackPredictionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallbackPredictionSpec.php
deleted file mode 100644
index 6da95f06a3292be22337d7159502d965610f73d5..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallbackPredictionSpec.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Prediction;
-
-use PhpSpec\ObjectBehavior;
-
-use Prophecy\Call\Call;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ObjectProphecy;
-use RuntimeException;
-
-class CallbackPredictionSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith('get_class');
-    }
-
-    function it_is_prediction()
-    {
-        $this->shouldHaveType('Prophecy\Prediction\PredictionInterface');
-    }
-
-    function it_proxies_call_to_callback(ObjectProphecy $object, MethodProphecy $method, Call $call)
-    {
-        $returnFirstCallCallback = function ($calls, $object, $method) {
-            throw new RuntimeException;
-        };
-
-        $this->beConstructedWith($returnFirstCallCallback);
-
-        $this->shouldThrow('RuntimeException')->duringCheck(array($call), $object, $method);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Prediction/NoCallsPredictionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Prediction/NoCallsPredictionSpec.php
deleted file mode 100644
index b5fa28a9eea472ba692167e5e4eb926e5ad00bbd..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Prediction/NoCallsPredictionSpec.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Prediction;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument\ArgumentsWildcard;
-use Prophecy\Call\Call;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ObjectProphecy;
-
-class NoCallsPredictionSpec extends ObjectBehavior
-{
-    function it_is_prediction()
-    {
-        $this->shouldHaveType('Prophecy\Prediction\PredictionInterface');
-    }
-
-    function it_does_nothing_if_there_is_no_calls_made(ObjectProphecy $object, MethodProphecy $method)
-    {
-        $this->check(array(), $object, $method)->shouldReturn(null);
-    }
-
-    function it_throws_UnexpectedCallsException_if_calls_found(
-        ObjectProphecy $object,
-        MethodProphecy $method,
-        Call $call,
-        ArgumentsWildcard $arguments
-    ) {
-        $method->getObjectProphecy()->willReturn($object);
-        $method->getMethodName()->willReturn('getName');
-        $method->getArgumentsWildcard()->willReturn($arguments);
-        $arguments->__toString()->willReturn('123');
-
-        $call->getMethodName()->willReturn('getName');
-        $call->getArguments()->willReturn(array(5, 4, 'three'));
-        $call->getCallPlace()->willReturn('unknown');
-
-        $this->shouldThrow('Prophecy\Exception\Prediction\UnexpectedCallsException')
-            ->duringCheck(array($call), $object, $method);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Promise/CallbackPromiseSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Promise/CallbackPromiseSpec.php
deleted file mode 100644
index fb1dc62eb98d059c5a13484bb38ab47dec4881e2..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Promise/CallbackPromiseSpec.php
+++ /dev/null
@@ -1,96 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Promise;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ObjectProphecy;
-
-class CallbackPromiseSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith('get_class');
-    }
-
-    function it_is_promise()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Promise\PromiseInterface');
-    }
-
-    function it_should_execute_closure_callback(ObjectProphecy $object, MethodProphecy $method)
-    {
-        $firstArgumentCallback = function ($args) {
-            return $args[0];
-        };
-
-        $this->beConstructedWith($firstArgumentCallback);
-
-        $this->execute(array('one', 'two'), $object, $method)->shouldReturn('one');
-    }
-
-    function it_should_execute_static_array_callback(ObjectProphecy $object, MethodProphecy $method)
-    {
-        $firstArgumentCallback = array('spec\Prophecy\Promise\ClassCallback', 'staticCallbackMethod');
-
-        $this->beConstructedWith($firstArgumentCallback);
-
-        $this->execute(array('one', 'two'), $object, $method)->shouldReturn('one');
-    }
-
-    function it_should_execute_instance_array_callback(ObjectProphecy $object, MethodProphecy $method)
-    {
-        $class = new ClassCallback();
-        $firstArgumentCallback = array($class, 'callbackMethod');
-
-        $this->beConstructedWith($firstArgumentCallback);
-
-        $this->execute(array('one', 'two'), $object, $method)->shouldReturn('one');
-    }
-
-    function it_should_execute_string_function_callback(ObjectProphecy $object, MethodProphecy $method)
-    {
-        $firstArgumentCallback = 'spec\Prophecy\Promise\functionCallbackFirstArgument';
-
-        $this->beConstructedWith($firstArgumentCallback);
-
-        $this->execute(array('one', 'two'), $object, $method)->shouldReturn('one');
-    }
-
-}
-
-/**
- * Class used to test callbackpromise
- *
- * @param array
- * @return string
- */
-class ClassCallback
-{
-    /**
-     * @param array $args
-     */
-    function callbackMethod($args)
-    {
-        return $args[0];
-    }
-
-    /**
-     * @param array $args
-     */
-    static function staticCallbackMethod($args)
-    {
-        return $args[0];
-    }
-}
-
-/**
- * Callback function used to test callbackpromise
- *
- * @param array
- * @return string
- */
-function functionCallbackFirstArgument($args)
-{
-    return $args[0];
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnArgumentPromiseSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnArgumentPromiseSpec.php
deleted file mode 100644
index 1cef3aa641825c361e22ea87b036161ce01de2dc..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnArgumentPromiseSpec.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Promise;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ObjectProphecy;
-
-class ReturnArgumentPromiseSpec extends ObjectBehavior
-{
-    function it_is_promise()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Promise\PromiseInterface');
-    }
-
-    function it_should_return_first_argument_if_provided(ObjectProphecy $object, MethodProphecy $method)
-    {
-        $this->execute(array('one', 'two'), $object, $method)->shouldReturn('one');
-    }
-
-    function it_should_return_null_if_no_arguments_provided(ObjectProphecy $object, MethodProphecy $method)
-    {
-        $this->execute(array(), $object, $method)->shouldReturn(null);
-    }
-
-    function it_should_return_nth_argument_if_provided(ObjectProphecy $object, MethodProphecy $method)
-    {
-        $this->beConstructedWith(1);
-        $this->execute(array('one', 'two'), $object, $method)->shouldReturn('two');
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnPromiseSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnPromiseSpec.php
deleted file mode 100644
index bc6a99188e57471f92161b64e7c3bd0cec1a40bb..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnPromiseSpec.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Promise;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ObjectProphecy;
-
-class ReturnPromiseSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith(array(42));
-    }
-
-    function it_is_promise()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Promise\PromiseInterface');
-    }
-
-    function it_returns_value_it_was_constructed_with(ObjectProphecy $object, MethodProphecy $method)
-    {
-        $this->execute(array(), $object, $method)->shouldReturn(42);
-    }
-
-    function it_always_returns_last_value_left_in_the_return_values(ObjectProphecy $object, MethodProphecy $method)
-    {
-        $this->execute(array(), $object, $method)->shouldReturn(42);
-        $this->execute(array(), $object, $method)->shouldReturn(42);
-    }
-
-    function it_consequently_returns_multiple_values_it_was_constructed_with(
-        ObjectProphecy $object,
-        MethodProphecy $method
-    ) {
-        $this->beConstructedWith(array(42, 24, 12));
-
-        $this->execute(array(), $object, $method)->shouldReturn(42);
-        $this->execute(array(), $object, $method)->shouldReturn(24);
-        $this->execute(array(), $object, $method)->shouldReturn(12);
-    }
-
-    function it_returns_null_if_constructed_with_empty_array(ObjectProphecy $object, MethodProphecy $method)
-    {
-        $this->beConstructedWith(array());
-
-        $this->execute(array(), $object, $method)->shouldReturn(null);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Promise/ThrowPromiseSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Promise/ThrowPromiseSpec.php
deleted file mode 100644
index b5a10bc1eba6b5227cfd7383660816ee7d57e50c..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Promise/ThrowPromiseSpec.php
+++ /dev/null
@@ -1,92 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Promise;
-
-use PhpSpec\Exception\Example\SkippingException;
-use PhpSpec\ObjectBehavior;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ObjectProphecy;
-
-class ThrowPromiseSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith('RuntimeException');
-    }
-
-    function it_is_promise()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Promise\PromiseInterface');
-    }
-
-    function it_instantiates_and_throws_exception_from_provided_classname(ObjectProphecy $object, MethodProphecy $method)
-    {
-        $this->beConstructedWith('InvalidArgumentException');
-
-        $this->shouldThrow('InvalidArgumentException')
-            ->duringExecute(array(), $object, $method);
-    }
-
-    function it_instantiates_exceptions_with_required_arguments(ObjectProphecy $object, MethodProphecy $method)
-    {
-        $this->beConstructedWith('spec\Prophecy\Promise\RequiredArgumentException');
-
-        $this->shouldThrow('spec\Prophecy\Promise\RequiredArgumentException')
-            ->duringExecute(array(), $object, $method);
-    }
-
-    function it_throws_provided_exception(ObjectProphecy $object, MethodProphecy $method)
-    {
-        $this->beConstructedWith($exc = new \RuntimeException('Some exception'));
-
-        $this->shouldThrow($exc)->duringExecute(array(), $object, $method);
-    }
-
-    function it_throws_error_instances(ObjectProphecy $object, MethodProphecy $method)
-    {
-        if (!class_exists('\Error')) {
-            throw new SkippingException('The class Error, introduced in PHP 7, does not exist');
-        }
-
-        $this->beConstructedWith($exc = new \Error('Error exception'));
-
-        $this->shouldThrow($exc)->duringExecute(array(), $object, $method);
-    }
-
-    function it_throws_errors_by_class_name()
-    {
-        if (!class_exists('\Error')) {
-            throw new SkippingException('The class Error, introduced in PHP 7, does not exist');
-        }
-
-        $this->beConstructedWith('\Error');
-
-        $this->shouldNotThrow('Prophecy\Exception\InvalidArgumentException')->duringInstantiation();
-    }
-
-    function it_does_not_throw_something_that_is_not_throwable_by_class_name()
-    {
-        $this->beConstructedWith('\stdClass');
-
-        $this->shouldThrow('Prophecy\Exception\InvalidArgumentException')->duringInstantiation();
-    }
-
-    function it_does_not_throw_something_that_is_not_throwable_by_instance()
-    {
-        $this->beConstructedWith(new \stdClass());
-
-        $this->shouldThrow('Prophecy\Exception\InvalidArgumentException')->duringInstantiation();
-    }
-
-    function it_throws_an_exception_by_class_name()
-    {
-        $this->beConstructedWith('\Exception');
-
-        $this->shouldNotThrow('Prophecy\Exception\InvalidArgumentException')->duringInstantiation();
-    }
-}
-
-class RequiredArgumentException extends \Exception
-{
-    final public function __construct($message, $code) {}
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/MethodProphecySpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/MethodProphecySpec.php
deleted file mode 100644
index 969e644a776ccb8e1bd86ac453db070b0b3151a6..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/MethodProphecySpec.php
+++ /dev/null
@@ -1,342 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Prophecy;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument\ArgumentsWildcard;
-use Prophecy\Call\Call;
-use Prophecy\Prediction\PredictionInterface;
-use Prophecy\Promise\PromiseInterface;
-use Prophecy\Prophecy\ObjectProphecy;
-
-class ClassWithFinalMethod
-{
-    final public function finalMethod() {}
-}
-
-class MethodProphecySpec extends ObjectBehavior
-{
-    function let(ObjectProphecy $objectProphecy, \ReflectionClass $reflection)
-    {
-        $objectProphecy->reveal()->willReturn($reflection);
-
-        $this->beConstructedWith($objectProphecy, 'getName', null);
-    }
-
-    function it_is_initializable()
-    {
-        $this->shouldHaveType('Prophecy\Prophecy\MethodProphecy');
-    }
-
-    function its_constructor_throws_MethodNotFoundException_for_unexisting_method($objectProphecy)
-    {
-        $this->shouldThrow('Prophecy\Exception\Doubler\MethodNotFoundException')->during(
-            '__construct', array($objectProphecy, 'getUnexisting', null)
-        );
-    }
-
-    function its_constructor_throws_MethodProphecyException_for_final_methods($objectProphecy, ClassWithFinalMethod $subject)
-    {
-        $objectProphecy->reveal()->willReturn($subject);
-
-        $this->shouldThrow('Prophecy\Exception\Prophecy\MethodProphecyException')->during(
-            '__construct', array($objectProphecy, 'finalMethod', null)
-        );
-    }
-
-    function its_constructor_transforms_array_passed_as_3rd_argument_to_ArgumentsWildcard(
-        $objectProphecy
-    )
-    {
-        $this->beConstructedWith($objectProphecy, 'getName', array(42, 33));
-
-        $wildcard = $this->getArgumentsWildcard();
-        $wildcard->shouldNotBe(null);
-        $wildcard->__toString()->shouldReturn('exact(42), exact(33)');
-    }
-
-    function its_constructor_does_not_touch_third_argument_if_it_is_null($objectProphecy)
-    {
-        $this->beConstructedWith($objectProphecy, 'getName', null);
-
-        $wildcard = $this->getArgumentsWildcard();
-        $wildcard->shouldBe(null);
-    }
-
-    function it_records_promise_through_will_method(PromiseInterface $promise, $objectProphecy)
-    {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-
-        $this->will($promise);
-        $this->getPromise()->shouldReturn($promise);
-    }
-
-    function it_adds_itself_to_ObjectProphecy_during_call_to_will(PromiseInterface $objectProphecy, $promise)
-    {
-        $objectProphecy->addMethodProphecy($this)->shouldBeCalled();
-
-        $this->will($promise);
-    }
-
-    function it_adds_ReturnPromise_during_willReturn_call($objectProphecy)
-    {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-
-        $this->willReturn(42);
-        $this->getPromise()->shouldBeAnInstanceOf('Prophecy\Promise\ReturnPromise');
-    }
-
-    function it_adds_ThrowPromise_during_willThrow_call($objectProphecy)
-    {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-
-        $this->willThrow('RuntimeException');
-        $this->getPromise()->shouldBeAnInstanceOf('Prophecy\Promise\ThrowPromise');
-    }
-
-    function it_adds_ReturnArgumentPromise_during_willReturnArgument_call($objectProphecy)
-    {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-
-        $this->willReturnArgument();
-        $this->getPromise()->shouldBeAnInstanceOf('Prophecy\Promise\ReturnArgumentPromise');
-    }
-
-    function it_adds_ReturnArgumentPromise_during_willReturnArgument_call_with_index_argument($objectProphecy)
-    {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-
-        $this->willReturnArgument(1);
-        $promise = $this->getPromise();
-        $promise->shouldBeAnInstanceOf('Prophecy\Promise\ReturnArgumentPromise');
-        $promise->execute(array('one', 'two'), $objectProphecy, $this)->shouldReturn('two');
-    }
-
-    function it_adds_CallbackPromise_during_will_call_with_callback_argument($objectProphecy)
-    {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-
-        $callback = function () {};
-
-        $this->will($callback);
-        $this->getPromise()->shouldBeAnInstanceOf('Prophecy\Promise\CallbackPromise');
-    }
-
-    function it_records_prediction_through_should_method(PredictionInterface $prediction, $objectProphecy)
-    {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-
-        $this->callOnWrappedObject('should', array($prediction));
-        $this->getPrediction()->shouldReturn($prediction);
-    }
-
-    function it_adds_CallbackPrediction_during_should_call_with_callback_argument($objectProphecy)
-    {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-
-        $callback = function () {};
-
-        $this->callOnWrappedObject('should', array($callback));
-        $this->getPrediction()->shouldBeAnInstanceOf('Prophecy\Prediction\CallbackPrediction');
-    }
-
-    function it_adds_itself_to_ObjectProphecy_during_call_to_should($objectProphecy, PredictionInterface $prediction)
-    {
-        $objectProphecy->addMethodProphecy($this)->shouldBeCalled();
-
-        $this->callOnWrappedObject('should', array($prediction));
-    }
-
-    function it_adds_CallPrediction_during_shouldBeCalled_call($objectProphecy)
-    {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-
-        $this->callOnWrappedObject('shouldBeCalled', array());
-        $this->getPrediction()->shouldBeAnInstanceOf('Prophecy\Prediction\CallPrediction');
-    }
-
-    function it_adds_NoCallsPrediction_during_shouldNotBeCalled_call($objectProphecy)
-    {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-
-        $this->callOnWrappedObject('shouldNotBeCalled', array());
-        $this->getPrediction()->shouldBeAnInstanceOf('Prophecy\Prediction\NoCallsPrediction');
-    }
-
-    function it_adds_CallTimesPrediction_during_shouldBeCalledTimes_call($objectProphecy)
-    {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-
-        $this->callOnWrappedObject('shouldBeCalledTimes', array(5));
-        $this->getPrediction()->shouldBeAnInstanceOf('Prophecy\Prediction\CallTimesPrediction');
-    }
-
-    function it_checks_prediction_via_shouldHave_method_call(
-        $objectProphecy,
-        ArgumentsWildcard $arguments,
-        PredictionInterface $prediction,
-        Call $call1,
-        Call $call2
-    ) {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-        $prediction->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->shouldBeCalled();
-        $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2));
-
-        $this->withArguments($arguments);
-        $this->callOnWrappedObject('shouldHave', array($prediction));
-    }
-
-    function it_sets_return_promise_during_shouldHave_call_if_none_was_set_before(
-        $objectProphecy,
-        ArgumentsWildcard $arguments,
-        PredictionInterface $prediction,
-        Call $call1,
-        Call $call2
-    ) {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-        $prediction->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->shouldBeCalled();
-        $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2));
-
-        $this->withArguments($arguments);
-        $this->callOnWrappedObject('shouldHave', array($prediction));
-
-        $this->getPromise()->shouldReturnAnInstanceOf('Prophecy\Promise\ReturnPromise');
-    }
-
-    function it_does_not_set_return_promise_during_shouldHave_call_if_it_was_set_before(
-        $objectProphecy,
-        ArgumentsWildcard $arguments,
-        PredictionInterface $prediction,
-        Call $call1,
-        Call $call2,
-        PromiseInterface $promise
-    ) {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-        $prediction->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->shouldBeCalled();
-        $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2));
-
-        $this->will($promise);
-        $this->withArguments($arguments);
-        $this->callOnWrappedObject('shouldHave', array($prediction));
-
-        $this->getPromise()->shouldReturn($promise);
-    }
-
-    function it_records_checked_predictions(
-        $objectProphecy,
-        ArgumentsWildcard $arguments,
-        PredictionInterface $prediction1,
-        PredictionInterface $prediction2,
-        Call $call1,
-        Call $call2,
-        PromiseInterface $promise
-    ) {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-        $prediction1->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->willReturn();
-        $prediction2->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->willReturn();
-        $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2));
-
-        $this->will($promise);
-        $this->withArguments($arguments);
-        $this->callOnWrappedObject('shouldHave', array($prediction1));
-        $this->callOnWrappedObject('shouldHave', array($prediction2));
-
-        $this->getCheckedPredictions()->shouldReturn(array($prediction1, $prediction2));
-    }
-
-    function it_records_even_failed_checked_predictions(
-        $objectProphecy,
-        ArgumentsWildcard $arguments,
-        PredictionInterface $prediction,
-        Call $call1,
-        Call $call2,
-        PromiseInterface $promise
-    ) {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-        $prediction->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->willThrow(new \RuntimeException());
-        $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2));
-
-        $this->will($promise);
-        $this->withArguments($arguments);
-
-        try {
-          $this->callOnWrappedObject('shouldHave', array($prediction));
-        } catch (\Exception $e) {}
-
-        $this->getCheckedPredictions()->shouldReturn(array($prediction));
-    }
-
-    function it_checks_prediction_via_shouldHave_method_call_with_callback(
-        $objectProphecy,
-        ArgumentsWildcard $arguments,
-        Call $call1,
-        Call $call2
-    ) {
-        $callback = function ($calls, $object, $method) {
-            throw new \RuntimeException;
-        };
-        $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2));
-
-        $this->withArguments($arguments);
-        $this->shouldThrow('RuntimeException')->duringShouldHave($callback);
-    }
-
-    function it_does_nothing_during_checkPrediction_if_no_prediction_set()
-    {
-        $this->checkPrediction()->shouldReturn(null);
-    }
-
-    function it_checks_set_prediction_during_checkPrediction(
-        $objectProphecy,
-        ArgumentsWildcard $arguments,
-        PredictionInterface $prediction,
-        Call $call1,
-        Call $call2
-    ) {
-        $prediction->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->shouldBeCalled();
-        $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2));
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-
-        $this->withArguments($arguments);
-        $this->callOnWrappedObject('should', array($prediction));
-        $this->checkPrediction();
-    }
-
-    function it_links_back_to_ObjectProphecy_through_getter($objectProphecy)
-    {
-        $this->getObjectProphecy()->shouldReturn($objectProphecy);
-    }
-
-    function it_has_MethodName()
-    {
-        $this->getMethodName()->shouldReturn('getName');
-    }
-
-    function it_contains_ArgumentsWildcard_it_was_constructed_with($objectProphecy, ArgumentsWildcard $wildcard)
-    {
-        $this->beConstructedWith($objectProphecy, 'getName', $wildcard);
-
-        $this->getArgumentsWildcard()->shouldReturn($wildcard);
-    }
-
-    function its_ArgumentWildcard_is_mutable_through_setter(ArgumentsWildcard $wildcard)
-    {
-        $this->withArguments($wildcard);
-
-        $this->getArgumentsWildcard()->shouldReturn($wildcard);
-    }
-
-    function its_withArguments_transforms_passed_array_into_ArgumentsWildcard()
-    {
-        $this->withArguments(array(42, 33));
-
-        $wildcard = $this->getArgumentsWildcard();
-        $wildcard->shouldNotBe(null);
-        $wildcard->__toString()->shouldReturn('exact(42), exact(33)');
-    }
-
-    function its_withArguments_throws_exception_if_wrong_arguments_provided()
-    {
-        $this->shouldThrow('Prophecy\Exception\InvalidArgumentException')->duringWithArguments(42);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/ObjectProphecySpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/ObjectProphecySpec.php
deleted file mode 100644
index c6afb3ef0224976118f92f9c1e1dcbaa806c7143..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/ObjectProphecySpec.php
+++ /dev/null
@@ -1,283 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Prophecy;
-
-use phpDocumentor\Reflection\DocBlock\Tags\Method;
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Argument\ArgumentsWildcard;
-use Prophecy\Call\Call;
-use Prophecy\Call\CallCenter;
-use Prophecy\Doubler\Doubler;
-use Prophecy\Doubler\LazyDouble;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ProphecySubjectInterface;
-use Prophecy\Prophecy\RevealerInterface;
-
-class ObjectProphecySpec extends ObjectBehavior
-{
-    function let(LazyDouble $lazyDouble, ProphecySubjectInterface $double)
-    {
-        $this->beConstructedWith($lazyDouble);
-
-        $lazyDouble->getInstance()->willReturn($double);
-    }
-
-    function it_implements_ProphecyInterface()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Prophecy\ProphecyInterface');
-    }
-
-    function it_sets_parentClass_during_willExtend_call($lazyDouble)
-    {
-        $lazyDouble->setParentClass('123')->shouldBeCalled();
-
-        $this->willExtend('123');
-    }
-
-    function it_adds_interface_during_willImplement_call($lazyDouble)
-    {
-        $lazyDouble->addInterface('222')->shouldBeCalled();
-
-        $this->willImplement('222');
-    }
-
-    function it_sets_constructor_arguments_during_willBeConstructedWith_call($lazyDouble)
-    {
-        $lazyDouble->setArguments(array(1, 2, 5))->shouldBeCalled();
-
-        $this->willBeConstructedWith(array(1, 2, 5));
-    }
-
-    function it_does_not_have_method_prophecies_by_default()
-    {
-        $this->getMethodProphecies()->shouldHaveCount(0);
-    }
-
-    function it_should_get_method_prophecies_by_method_name(
-        MethodProphecy $method1,
-        MethodProphecy $method2,
-        ArgumentsWildcard $arguments
-    ) {
-        $method1->getMethodName()->willReturn('getName');
-        $method1->getArgumentsWildcard()->willReturn($arguments);
-        $method2->getMethodName()->willReturn('setName');
-        $method2->getArgumentsWildcard()->willReturn($arguments);
-
-        $this->addMethodProphecy($method1);
-        $this->addMethodProphecy($method2);
-
-        $methods = $this->getMethodProphecies('setName');
-        $methods->shouldHaveCount(1);
-        $methods[0]->getMethodName()->shouldReturn('setName');
-    }
-
-    function it_should_return_empty_array_if_no_method_prophecies_found()
-    {
-        $methods = $this->getMethodProphecies('setName');
-        $methods->shouldHaveCount(0);
-    }
-
-    function it_should_proxy_makeProphecyMethodCall_to_CallCenter($lazyDouble, CallCenter $callCenter)
-    {
-        $this->beConstructedWith($lazyDouble, $callCenter);
-
-        $callCenter->makeCall($this->getWrappedObject(), 'setName', array('everzet'))->willReturn(42);
-
-        $this->makeProphecyMethodCall('setName', array('everzet'))->shouldReturn(42);
-    }
-
-    function it_should_reveal_arguments_and_return_values_from_callCenter(
-        $lazyDouble,
-        CallCenter $callCenter,
-        RevealerInterface $revealer
-    ) {
-        $this->beConstructedWith($lazyDouble, $callCenter, $revealer);
-
-        $revealer->reveal(array('question'))->willReturn(array('life'));
-        $revealer->reveal('answer')->willReturn(42);
-
-        $callCenter->makeCall($this->getWrappedObject(), 'setName', array('life'))->willReturn('answer');
-
-        $this->makeProphecyMethodCall('setName', array('question'))->shouldReturn(42);
-    }
-
-    function it_should_proxy_getProphecyMethodCalls_to_CallCenter(
-        $lazyDouble,
-        CallCenter $callCenter,
-        ArgumentsWildcard $wildcard,
-        Call $call
-    ) {
-        $this->beConstructedWith($lazyDouble, $callCenter);
-
-        $callCenter->findCalls('setName', $wildcard)->willReturn(array($call));
-
-        $this->findProphecyMethodCalls('setName', $wildcard)->shouldReturn(array($call));
-    }
-
-    function its_addMethodProphecy_adds_method_prophecy(
-        MethodProphecy $methodProphecy,
-        ArgumentsWildcard $argumentsWildcard
-    ) {
-        $methodProphecy->getArgumentsWildcard()->willReturn($argumentsWildcard);
-        $methodProphecy->getMethodName()->willReturn('getUsername');
-
-        $this->addMethodProphecy($methodProphecy);
-
-        $this->getMethodProphecies()->shouldReturn(array(
-            'getUsername' => array($methodProphecy)
-        ));
-    }
-
-    function its_addMethodProphecy_handles_prophecies_with_different_arguments(
-        MethodProphecy $methodProphecy1,
-        MethodProphecy $methodProphecy2,
-        ArgumentsWildcard $argumentsWildcard1,
-        ArgumentsWildcard $argumentsWildcard2
-    ) {
-        $methodProphecy1->getArgumentsWildcard()->willReturn($argumentsWildcard1);
-        $methodProphecy1->getMethodName()->willReturn('getUsername');
-
-        $methodProphecy2->getArgumentsWildcard()->willReturn($argumentsWildcard2);
-        $methodProphecy2->getMethodName()->willReturn('getUsername');
-
-        $this->addMethodProphecy($methodProphecy1);
-        $this->addMethodProphecy($methodProphecy2);
-
-        $this->getMethodProphecies()->shouldReturn(array(
-            'getUsername' => array(
-                $methodProphecy1,
-                $methodProphecy2,
-            )
-        ));
-    }
-
-    function its_addMethodProphecy_handles_prophecies_for_different_methods(
-        MethodProphecy $methodProphecy1,
-        MethodProphecy $methodProphecy2,
-        ArgumentsWildcard $argumentsWildcard1,
-        ArgumentsWildcard $argumentsWildcard2
-    ) {
-        $methodProphecy1->getArgumentsWildcard()->willReturn($argumentsWildcard1);
-        $methodProphecy1->getMethodName()->willReturn('getUsername');
-
-        $methodProphecy2->getArgumentsWildcard()->willReturn($argumentsWildcard2);
-        $methodProphecy2->getMethodName()->willReturn('isUsername');
-
-        $this->addMethodProphecy($methodProphecy1);
-        $this->addMethodProphecy($methodProphecy2);
-
-        $this->getMethodProphecies()->shouldReturn(array(
-            'getUsername' => array(
-                $methodProphecy1
-            ),
-            'isUsername' => array(
-                $methodProphecy2
-            )
-        ));
-    }
-
-    function its_addMethodProphecy_throws_exception_when_method_has_no_ArgumentsWildcard(MethodProphecy $methodProphecy)
-    {
-        $methodProphecy->getArgumentsWildcard()->willReturn(null);
-        $methodProphecy->getObjectProphecy()->willReturn($this);
-        $methodProphecy->getMethodName()->willReturn('getTitle');
-
-        $this->shouldThrow('Prophecy\Exception\Prophecy\MethodProphecyException')->duringAddMethodProphecy(
-            $methodProphecy
-        );
-    }
-
-    function it_returns_null_after_checkPredictions_call_if_there_is_no_method_prophecies()
-    {
-        $this->checkProphecyMethodsPredictions()->shouldReturn(null);
-    }
-
-    function it_throws_AggregateException_during_checkPredictions_if_predictions_fail(
-        MethodProphecy $methodProphecy1, MethodProphecy $methodProphecy2,
-        ArgumentsWildcard $argumentsWildcard1,
-        ArgumentsWildcard $argumentsWildcard2
-    ) {
-        $methodProphecy1->getMethodName()->willReturn('getName');
-        $methodProphecy1->getArgumentsWildcard()->willReturn($argumentsWildcard1);
-        $methodProphecy1->checkPrediction()
-            ->willThrow('Prophecy\Exception\Prediction\AggregateException');
-
-        $methodProphecy2->getMethodName()->willReturn('setName');
-        $methodProphecy2->getArgumentsWildcard()->willReturn($argumentsWildcard2);
-        $methodProphecy2->checkPrediction()
-            ->willThrow('Prophecy\Exception\Prediction\AggregateException');
-
-        $this->addMethodProphecy($methodProphecy1);
-        $this->addMethodProphecy($methodProphecy2);
-
-        $this->shouldThrow('Prophecy\Exception\Prediction\AggregateException')
-            ->duringCheckProphecyMethodsPredictions();
-    }
-
-    function it_returns_new_MethodProphecy_instance_for_arbitrary_call(
-        Doubler $doubler,
-        ProphecySubjectInterface $reflection
-    ) {
-        $doubler->double(Argument::any())->willReturn($reflection);
-
-        $return = $this->getProphecy();
-        $return->shouldBeAnInstanceOf('Prophecy\Prophecy\MethodProphecy');
-        $return->getMethodName()->shouldReturn('getProphecy');
-    }
-
-    function it_returns_same_MethodProphecy_for_same_registered_signature(
-        Doubler $doubler,
-        ProphecySubjectInterface $reflection
-    ) {
-        $doubler->double(Argument::any())->willReturn($reflection);
-
-        $this->addMethodProphecy($methodProphecy1 = $this->getProphecy(1, 2, 3));
-        $methodProphecy2 = $this->getProphecy(1, 2, 3);
-
-        $methodProphecy2->shouldBe($methodProphecy1);
-    }
-
-    function it_returns_new_MethodProphecy_for_different_signatures(
-        Doubler $doubler,
-        ProphecySubjectInterface $reflection
-    ) {
-        $doubler->double(Argument::any())->willReturn($reflection);
-
-        $value = new ObjectProphecySpecFixtureB('ABC');
-        $value2 = new ObjectProphecySpecFixtureB('CBA');
-
-        $this->addMethodProphecy($methodProphecy1 = $this->getProphecy(1, 2, 3, $value));
-        $methodProphecy2 = $this->getProphecy(1, 2, 3, $value2);
-
-        $methodProphecy2->shouldNotBe($methodProphecy1);
-    }
-
-    function it_returns_new_MethodProphecy_for_all_callback_signatures(
-        Doubler $doubler,
-        ProphecySubjectInterface $reflection
-    ) {
-        $doubler->double(Argument::any())->willReturn($reflection);
-
-        $this->addMethodProphecy($methodProphecy1 = $this->getProphecy(function(){}));
-        $methodProphecy2 = $this->getProphecy(function(){});
-
-        $methodProphecy2->shouldNotBe($methodProphecy1);
-    }
-}
-
-class ObjectProphecySpecFixtureA
-{
-	public $errors;
-}
-
-class ObjectProphecySpecFixtureB extends ObjectProphecySpecFixtureA
-{
-    public $errors;
-    public $value = null;
-
-    public function __construct($value)
-    {
-        $this->value = $value;
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/RevealerSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/RevealerSpec.php
deleted file mode 100644
index fcaa7ca3a3b194b9d6ef6df4e766c7dab04cb486..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/RevealerSpec.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Prophecy;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Prophecy\ProphecyInterface;
-
-class RevealerSpec extends ObjectBehavior
-{
-    function it_is_revealer()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Prophecy\RevealerInterface');
-    }
-
-    function it_reveals_single_instance_of_ProphecyInterface(ProphecyInterface $prophecy, \stdClass $object)
-    {
-        $prophecy->reveal()->willReturn($object);
-
-        $this->reveal($prophecy)->shouldReturn($object);
-    }
-
-    function it_reveals_instances_of_ProphecyInterface_inside_array(
-        ProphecyInterface $prophecy1,
-        ProphecyInterface $prophecy2,
-        \stdClass $object1,
-        \stdClass $object2
-    ) {
-        $prophecy1->reveal()->willReturn($object1);
-        $prophecy2->reveal()->willReturn($object2);
-
-        $this->reveal(array(
-            array('item' => $prophecy2),
-            $prophecy1
-        ))->shouldReturn(array(
-            array('item' => $object2),
-            $object1
-        ));
-    }
-
-    function it_does_not_touch_non_prophecy_interface()
-    {
-        $this->reveal(42)->shouldReturn(42);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/ProphetSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/ProphetSpec.php
deleted file mode 100644
index 67f0275259e91a2bbfc2adaca8e0b8a9cdf705f5..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/ProphetSpec.php
+++ /dev/null
@@ -1,81 +0,0 @@
-<?php
-
-namespace spec\Prophecy;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Argument\ArgumentsWildcard;
-use Prophecy\Doubler\Doubler;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ProphecySubjectInterface;
-
-class ProphetSpec extends ObjectBehavior
-{
-    function let(Doubler $doubler, ProphecySubjectInterface $double)
-    {
-        $doubler->double(null, array())->willReturn($double);
-
-        $this->beConstructedWith($doubler);
-    }
-
-    function it_constructs_new_prophecy_on_prophesize_call()
-    {
-        $prophecy = $this->prophesize();
-        $prophecy->shouldBeAnInstanceOf('Prophecy\Prophecy\ObjectProphecy');
-    }
-
-    function it_constructs_new_prophecy_with_parent_class_if_specified($doubler, ProphecySubjectInterface $newDouble)
-    {
-        $doubler->double(Argument::any(), array())->willReturn($newDouble);
-
-        $this->prophesize('Prophecy\Prophet')->reveal()->shouldReturn($newDouble);
-    }
-
-    function it_constructs_new_prophecy_with_interface_if_specified($doubler, ProphecySubjectInterface $newDouble)
-    {
-        $doubler->double(null, Argument::any())->willReturn($newDouble);
-
-        $this->prophesize('ArrayAccess')->reveal()->shouldReturn($newDouble);
-    }
-
-    function it_exposes_all_created_prophecies_through_getter()
-    {
-        $prophecy1 = $this->prophesize();
-        $prophecy2 = $this->prophesize();
-
-        $this->getProphecies()->shouldReturn(array($prophecy1, $prophecy2));
-    }
-
-    function it_does_nothing_during_checkPredictions_call_if_no_predictions_defined()
-    {
-        $this->checkPredictions()->shouldReturn(null);
-    }
-
-    function it_throws_AggregateException_if_defined_predictions_fail(
-        MethodProphecy $method1,
-        MethodProphecy $method2,
-        ArgumentsWildcard $arguments1,
-        ArgumentsWildcard $arguments2
-    ) {
-        $method1->getMethodName()->willReturn('getName');
-        $method1->getArgumentsWildcard()->willReturn($arguments1);
-        $method1->checkPrediction()->willReturn(null);
-
-        $method2->getMethodName()->willReturn('isSet');
-        $method2->getArgumentsWildcard()->willReturn($arguments2);
-        $method2->checkPrediction()->willThrow(
-            'Prophecy\Exception\Prediction\AggregateException'
-        );
-
-        $this->prophesize()->addMethodProphecy($method1);
-        $this->prophesize()->addMethodProphecy($method2);
-
-        $this->shouldThrow('Prophecy\Exception\Prediction\AggregateException')
-            ->duringCheckPredictions();
-    }
-
-    function it_exposes_doubler_through_getter($doubler)
-    {
-        $this->getDoubler()->shouldReturn($doubler);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Util/StringUtilSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Util/StringUtilSpec.php
deleted file mode 100644
index 80573cffb349af8bf5686251b4aabf3ff5a5538a..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Util/StringUtilSpec.php
+++ /dev/null
@@ -1,91 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Util;
-
-use PhpSpec\ObjectBehavior;
-
-class StringUtilSpec extends ObjectBehavior
-{
-    function it_generates_proper_string_representation_for_integer()
-    {
-        $this->stringify(42)->shouldReturn('42');
-    }
-
-    function it_generates_proper_string_representation_for_string()
-    {
-        $this->stringify('some string')->shouldReturn('"some string"');
-    }
-
-    function it_generates_single_line_representation_for_multiline_string()
-    {
-        $this->stringify("some\nstring")->shouldReturn('"some\\nstring"');
-    }
-
-    function it_generates_proper_string_representation_for_double()
-    {
-        $this->stringify(42.3)->shouldReturn('42.3');
-    }
-
-    function it_generates_proper_string_representation_for_boolean_true()
-    {
-        $this->stringify(true)->shouldReturn('true');
-    }
-
-    function it_generates_proper_string_representation_for_boolean_false()
-    {
-        $this->stringify(false)->shouldReturn('false');
-    }
-
-    function it_generates_proper_string_representation_for_null()
-    {
-        $this->stringify(null)->shouldReturn('null');
-    }
-
-    function it_generates_proper_string_representation_for_empty_array()
-    {
-        $this->stringify(array())->shouldReturn('[]');
-    }
-
-    function it_generates_proper_string_representation_for_array()
-    {
-        $this->stringify(array('zet', 42))->shouldReturn('["zet", 42]');
-    }
-
-    function it_generates_proper_string_representation_for_hash_containing_one_value()
-    {
-        $this->stringify(array('ever' => 'zet'))->shouldReturn('["ever" => "zet"]');
-    }
-
-    function it_generates_proper_string_representation_for_hash()
-    {
-        $this->stringify(array('ever' => 'zet', 52 => 'hey', 'num' => 42))->shouldReturn(
-            '["ever" => "zet", 52 => "hey", "num" => 42]'
-        );
-    }
-
-    function it_generates_proper_string_representation_for_resource()
-    {
-        $resource = fopen(__FILE__, 'r');
-        $this->stringify($resource)->shouldReturn('stream:'.$resource);
-    }
-
-    function it_generates_proper_string_representation_for_object(\stdClass $object)
-    {
-        $objHash = sprintf('%s:%s',
-            get_class($object->getWrappedObject()),
-            spl_object_hash($object->getWrappedObject())
-        ) . " Object (\n    'objectProphecy' => Prophecy\Prophecy\ObjectProphecy Object (*Prophecy*)\n)";
-
-        $this->stringify($object)->shouldReturn("$objHash");
-    }
-
-    function it_generates_proper_string_representation_for_object_without_exporting(\stdClass $object)
-    {
-        $objHash = sprintf('%s:%s',
-            get_class($object->getWrappedObject()),
-            spl_object_hash($object->getWrappedObject())
-        );
-
-        $this->stringify($object, false)->shouldReturn("$objHash");
-    }
-}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php
index b0d9793aa4857d4eb000bab994b093b0f8f4b376..41ea2fc1c10c6bfde5ce64410782fad1e6b1d5bc 100644
--- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php
@@ -51,7 +51,8 @@ class KeywordPatch implements ClassPatchInterface
      *
      * @return int Priority number (higher - earlier)
      */
-    public function getPriority() {
+    public function getPriority()
+    {
         return 49;
     }
 
@@ -60,7 +61,11 @@ class KeywordPatch implements ClassPatchInterface
      *
      * @return array
      */
-    private function getKeywords() {
+    private function getKeywords()
+    {
+        if (\PHP_VERSION_ID >= 70000) {
+            return array('__halt_compiler');
+        }
 
         return array(
             '__halt_compiler',
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php
index eba82980d02b676db346b87e8818b3a4d674945e..3d8e44f3d2f64f42ece214ca922e4d8c8c6fcf7b 100644
--- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php
@@ -61,7 +61,8 @@ class SplFileInfoPatch implements ClassPatchInterface
         }
 
         if ($this->nodeIsSplFileObject($node)) {
-            $constructor->setCode('return parent::__construct("' . __FILE__ .'");');
+            $filePath = str_replace('\\','\\\\',__FILE__);
+            $constructor->setCode('return parent::__construct("' . $filePath .'");');
 
             return;
         }
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php
index 71aabfa9401267ef3ac0d04e23e4d29abb414151..ee363ab3f901c861390c7571634163e9a8213e1d 100644
--- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php
@@ -117,7 +117,7 @@ class MethodNode
                 $this->returnType = null;
                 break;
 
-            case 'string';
+            case 'string':
             case 'float':
             case 'int':
             case 'bool':
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php
index 5c0ede9a66d79939e7319198578fb911bf11bdae..90df1efc8ce5bed079cd7ac4dd03cf7aa4787200 100644
--- a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php
+++ b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php
@@ -164,7 +164,7 @@ class MethodProphecy
     /**
      * Sets return promise to the prophecy.
      *
-     * @see Prophecy\Promise\ReturnPromise
+     * @see \Prophecy\Promise\ReturnPromise
      *
      * @return $this
      */
@@ -185,7 +185,7 @@ class MethodProphecy
      *
      * @param int $index The zero-indexed number of the argument to return
      *
-     * @see Prophecy\Promise\ReturnArgumentPromise
+     * @see \Prophecy\Promise\ReturnArgumentPromise
      *
      * @return $this
      */
@@ -201,7 +201,7 @@ class MethodProphecy
     /**
      * Sets throw promise to the prophecy.
      *
-     * @see Prophecy\Promise\ThrowPromise
+     * @see \Prophecy\Promise\ThrowPromise
      *
      * @param string|\Exception $exception Exception class or instance
      *
@@ -243,7 +243,7 @@ class MethodProphecy
     /**
      * Sets call prediction to the prophecy.
      *
-     * @see Prophecy\Prediction\CallPrediction
+     * @see \Prophecy\Prediction\CallPrediction
      *
      * @return $this
      */
@@ -255,7 +255,7 @@ class MethodProphecy
     /**
      * Sets no calls prediction to the prophecy.
      *
-     * @see Prophecy\Prediction\NoCallsPrediction
+     * @see \Prophecy\Prediction\NoCallsPrediction
      *
      * @return $this
      */
@@ -267,7 +267,7 @@ class MethodProphecy
     /**
      * Sets call times prediction to the prophecy.
      *
-     * @see Prophecy\Prediction\CallTimesPrediction
+     * @see \Prophecy\Prediction\CallTimesPrediction
      *
      * @param $count
      *
@@ -324,7 +324,7 @@ class MethodProphecy
     /**
      * Checks call prediction.
      *
-     * @see Prophecy\Prediction\CallPrediction
+     * @see \Prophecy\Prediction\CallPrediction
      *
      * @return $this
      */
@@ -336,7 +336,7 @@ class MethodProphecy
     /**
      * Checks no calls prediction.
      *
-     * @see Prophecy\Prediction\NoCallsPrediction
+     * @see \Prophecy\Prediction\NoCallsPrediction
      *
      * @return $this
      */
@@ -348,7 +348,7 @@ class MethodProphecy
     /**
      * Checks no calls prediction.
      *
-     * @see Prophecy\Prediction\NoCallsPrediction
+     * @see \Prophecy\Prediction\NoCallsPrediction
      * @deprecated
      *
      * @return $this
@@ -361,7 +361,7 @@ class MethodProphecy
     /**
      * Checks call times prediction.
      *
-     * @see Prophecy\Prediction\CallTimesPrediction
+     * @see \Prophecy\Prediction\CallTimesPrediction
      *
      * @param int $count
      *
diff --git a/vendor/phpspec/prophecy/tests/Doubler/Generator/ClassMirrorTest.php b/vendor/phpspec/prophecy/tests/Doubler/Generator/ClassMirrorTest.php
deleted file mode 100644
index 77f3ad8f6e34e82352b004a2e27d5c081d7833a9..0000000000000000000000000000000000000000
--- a/vendor/phpspec/prophecy/tests/Doubler/Generator/ClassMirrorTest.php
+++ /dev/null
@@ -1,469 +0,0 @@
-<?php
-
-namespace Tests\Prophecy\Doubler\Generator;
-
-use Prophecy\Doubler\Generator\ClassMirror;
-
-class ClassMirrorTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @test
-     */
-    public function it_reflects_allowed_magic_methods()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\SpecialMethods');
-
-        $mirror = new ClassMirror();
-
-        $node = $mirror->reflect($class, array());
-
-        $this->assertCount(7, $node->getMethods());
-    }
-
-    /**
-     * @test
-     */
-    public function it_reflects_protected_abstract_methods()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\WithProtectedAbstractMethod');
-
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect($class, array());
-
-        $this->assertEquals('Fixtures\Prophecy\WithProtectedAbstractMethod', $classNode->getParentClass());
-
-        $methodNodes = $classNode->getMethods();
-        $this->assertCount(1, $methodNodes);
-
-        $this->assertEquals('protected', $methodNodes['innerDetail']->getVisibility());
-    }
-
-    /**
-     * @test
-     */
-    public function it_reflects_public_static_methods()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\WithStaticMethod');
-
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect($class, array());
-
-        $this->assertEquals('Fixtures\Prophecy\WithStaticMethod', $classNode->getParentClass());
-
-        $methodNodes = $classNode->getMethods();
-        $this->assertCount(1, $methodNodes);
-
-        $this->assertTrue($methodNodes['innerDetail']->isStatic());
-    }
-
-    /**
-     * @test
-     */
-    public function it_marks_required_args_without_types_as_not_optional()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\WithArguments');
-
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect($class, array());
-        $methodNode = $classNode->getMethod('methodWithoutTypeHints');
-        $argNodes = $methodNode->getArguments();
-
-        $this->assertCount(1, $argNodes);
-
-        $this->assertEquals('arg', $argNodes[0]->getName());
-        $this->assertNull($argNodes[0]->getTypeHint());
-        $this->assertFalse($argNodes[0]->isOptional());
-        $this->assertNull($argNodes[0]->getDefault());
-        $this->assertFalse($argNodes[0]->isPassedByReference());
-        $this->assertFalse($argNodes[0]->isVariadic());
-    }
-
-    /**
-     * @test
-     */
-    public function it_properly_reads_methods_arguments_with_types()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\WithArguments');
-
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect($class, array());
-        $methodNode = $classNode->getMethod('methodWithArgs');
-        $argNodes = $methodNode->getArguments();
-
-        $this->assertCount(3, $argNodes);
-
-        $this->assertEquals('arg_1', $argNodes[0]->getName());
-        $this->assertEquals('array', $argNodes[0]->getTypeHint());
-        $this->assertTrue($argNodes[0]->isOptional());
-        $this->assertEquals(array(), $argNodes[0]->getDefault());
-        $this->assertFalse($argNodes[0]->isPassedByReference());
-        $this->assertFalse($argNodes[0]->isVariadic());
-
-        $this->assertEquals('arg_2', $argNodes[1]->getName());
-        $this->assertEquals('ArrayAccess', $argNodes[1]->getTypeHint());
-        $this->assertFalse($argNodes[1]->isOptional());
-
-        $this->assertEquals('arg_3', $argNodes[2]->getName());
-        $this->assertEquals('ArrayAccess', $argNodes[2]->getTypeHint());
-        $this->assertTrue($argNodes[2]->isOptional());
-        $this->assertNull($argNodes[2]->getDefault());
-        $this->assertFalse($argNodes[2]->isPassedByReference());
-        $this->assertFalse($argNodes[2]->isVariadic());
-    }
-
-    /**
-     * @test
-     * @requires PHP 5.4
-     */
-    public function it_properly_reads_methods_arguments_with_callable_types()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\WithCallableArgument');
-
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect($class, array());
-        $methodNode = $classNode->getMethod('methodWithArgs');
-        $argNodes = $methodNode->getArguments();
-
-        $this->assertCount(2, $argNodes);
-
-        $this->assertEquals('arg_1', $argNodes[0]->getName());
-        $this->assertEquals('callable', $argNodes[0]->getTypeHint());
-        $this->assertFalse($argNodes[0]->isOptional());
-        $this->assertFalse($argNodes[0]->isPassedByReference());
-        $this->assertFalse($argNodes[0]->isVariadic());
-
-        $this->assertEquals('arg_2', $argNodes[1]->getName());
-        $this->assertEquals('callable', $argNodes[1]->getTypeHint());
-        $this->assertTrue($argNodes[1]->isOptional());
-        $this->assertNull($argNodes[1]->getDefault());
-        $this->assertFalse($argNodes[1]->isPassedByReference());
-        $this->assertFalse($argNodes[1]->isVariadic());
-    }
-
-    /**
-     * @test
-     * @requires PHP 5.6
-     */
-    public function it_properly_reads_methods_variadic_arguments()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\WithVariadicArgument');
-
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect($class, array());
-        $methodNode = $classNode->getMethod('methodWithArgs');
-        $argNodes = $methodNode->getArguments();
-
-        $this->assertCount(1, $argNodes);
-
-        $this->assertEquals('args', $argNodes[0]->getName());
-        $this->assertNull($argNodes[0]->getTypeHint());
-        $this->assertFalse($argNodes[0]->isOptional());
-        $this->assertFalse($argNodes[0]->isPassedByReference());
-        $this->assertTrue($argNodes[0]->isVariadic());
-    }
-
-    /**
-     * @test
-     * @requires PHP 5.6
-     */
-    public function it_properly_reads_methods_typehinted_variadic_arguments()
-    {
-        if (defined('HHVM_VERSION_ID')) {
-            $this->markTestSkipped('HHVM does not support typehints on variadic arguments.');
-        }
-
-        $class = new \ReflectionClass('Fixtures\Prophecy\WithTypehintedVariadicArgument');
-
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect($class, array());
-        $methodNode = $classNode->getMethod('methodWithTypeHintedArgs');
-        $argNodes = $methodNode->getArguments();
-
-        $this->assertCount(1, $argNodes);
-
-        $this->assertEquals('args', $argNodes[0]->getName());
-        $this->assertEquals('array', $argNodes[0]->getTypeHint());
-        $this->assertFalse($argNodes[0]->isOptional());
-        $this->assertFalse($argNodes[0]->isPassedByReference());
-        $this->assertTrue($argNodes[0]->isVariadic());
-    }
-
-    /**
-     * @test
-     */
-    public function it_marks_passed_by_reference_args_as_passed_by_reference()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\WithReferences');
-
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect($class, array());
-
-        $this->assertTrue($classNode->hasMethod('methodWithReferenceArgument'));
-
-        $argNodes = $classNode->getMethod('methodWithReferenceArgument')->getArguments();
-
-        $this->assertCount(2, $argNodes);
-
-        $this->assertTrue($argNodes[0]->isPassedByReference());
-        $this->assertTrue($argNodes[1]->isPassedByReference());
-    }
-
-    /**
-     * @test
-     */
-    public function it_throws_an_exception_if_class_is_final()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\FinalClass');
-
-        $mirror = new ClassMirror();
-
-        $this->setExpectedException('Prophecy\Exception\Doubler\ClassMirrorException');
-
-        $mirror->reflect($class, array());
-    }
-
-    /**
-     * @test
-     */
-    public function it_ignores_final_methods()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\WithFinalMethod');
-
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect($class, array());
-
-        $this->assertCount(0, $classNode->getMethods());
-    }
-
-    /**
-     * @test
-     */
-    public function it_marks_final_methods_as_unextendable()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\WithFinalMethod');
-
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect($class, array());
-
-        $this->assertCount(1, $classNode->getUnextendableMethods());
-        $this->assertFalse($classNode->isExtendable('finalImplementation'));
-    }
-
-    /**
-     * @test
-     */
-    public function it_throws_an_exception_if_interface_provided_instead_of_class()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\EmptyInterface');
-
-        $mirror = new ClassMirror();
-
-        $this->setExpectedException('Prophecy\Exception\InvalidArgumentException');
-
-        $mirror->reflect($class, array());
-    }
-
-    /**
-     * @test
-     */
-    public function it_reflects_all_interfaces_methods()
-    {
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect(null, array(
-            new \ReflectionClass('Fixtures\Prophecy\Named'),
-            new \ReflectionClass('Fixtures\Prophecy\ModifierInterface'),
-        ));
-
-        $this->assertEquals('stdClass', $classNode->getParentClass());
-        $this->assertEquals(array(
-            'Prophecy\Doubler\Generator\ReflectionInterface',
-            'Fixtures\Prophecy\ModifierInterface',
-            'Fixtures\Prophecy\Named',
-        ), $classNode->getInterfaces());
-
-        $this->assertCount(3, $classNode->getMethods());
-        $this->assertTrue($classNode->hasMethod('getName'));
-        $this->assertTrue($classNode->hasMethod('isAbstract'));
-        $this->assertTrue($classNode->hasMethod('getVisibility'));
-    }
-
-    /**
-     * @test
-     */
-    public function it_ignores_virtually_private_methods()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\WithVirtuallyPrivateMethod');
-
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect($class, array());
-
-        $this->assertCount(2, $classNode->getMethods());
-        $this->assertTrue($classNode->hasMethod('isAbstract'));
-        $this->assertTrue($classNode->hasMethod('__toString'));
-        $this->assertFalse($classNode->hasMethod('_getName'));
-    }
-
-    /**
-     * @test
-     */
-    public function it_does_not_throw_exception_for_virtually_private_finals()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\WithFinalVirtuallyPrivateMethod');
-
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect($class, array());
-
-        $this->assertCount(0, $classNode->getMethods());
-    }
-
-    /**
-     * @test
-     * @requires PHP 7
-     */
-    public function it_reflects_return_typehints()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\WithReturnTypehints');
-
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect($class, array());
-
-        $this->assertCount(3, $classNode->getMethods());
-        $this->assertTrue($classNode->hasMethod('getName'));
-        $this->assertTrue($classNode->hasMethod('getSelf'));
-        $this->assertTrue($classNode->hasMethod('getParent'));
-
-        $this->assertEquals('string', $classNode->getMethod('getName')->getReturnType());
-        $this->assertEquals('\Fixtures\Prophecy\WithReturnTypehints', $classNode->getMethod('getSelf')->getReturnType());
-        $this->assertEquals('\Fixtures\Prophecy\EmptyClass', $classNode->getMethod('getParent')->getReturnType());
-    }
-
-    /**
-     * @test
-     */
-    public function it_throws_an_exception_if_class_provided_in_interfaces_list()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\EmptyClass');
-
-        $mirror = new ClassMirror();
-
-        $this->setExpectedException('InvalidArgumentException');
-
-        $mirror->reflect(null, array($class));
-    }
-
-    /**
-     * @test
-     */
-    public function it_throws_an_exception_if_not_reflection_provided_as_interface()
-    {
-        $mirror = new ClassMirror();
-
-        $this->setExpectedException('InvalidArgumentException');
-
-        $mirror->reflect(null, array(null));
-    }
-
-    /**
-     * @test
-     */
-    public function it_doesnt_use_scalar_typehints()
-    {
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect(new \ReflectionClass('ReflectionMethod'), array());
-        $method = $classNode->getMethod('export');
-        $arguments = $method->getArguments();
-
-        $this->assertNull($arguments[0]->getTypeHint());
-        $this->assertNull($arguments[1]->getTypeHint());
-        $this->assertNull($arguments[2]->getTypeHint());
-    }
-
-    /**
-     * @test
-     */
-    public function it_doesnt_fail_to_typehint_nonexistent_FQCN()
-    {
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect(new \ReflectionClass('Fixtures\Prophecy\OptionalDepsClass'), array());
-        $method = $classNode->getMethod('iHaveAStrangeTypeHintedArg');
-        $arguments = $method->getArguments();
-        $this->assertEquals('I\Simply\Am\Nonexistent', $arguments[0]->getTypeHint());
-    }
-
-    /**
-     * @test
-     */
-    public function it_doesnt_fail_to_typehint_nonexistent_RQCN()
-    {
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect(new \ReflectionClass('Fixtures\Prophecy\OptionalDepsClass'), array());
-        $method = $classNode->getMethod('iHaveAnEvenStrangerTypeHintedArg');
-        $arguments = $method->getArguments();
-        $this->assertEquals('I\Simply\Am\Not', $arguments[0]->getTypeHint());
-    }
-
-    /**
-     * @test
-     */
-    function it_changes_argument_names_if_they_are_varying()
-    {
-        // Use test doubles in this test, as arguments named ... in the Reflection API can only happen for internal classes
-        $class = $this->prophesize('ReflectionClass');
-        $method = $this->prophesize('ReflectionMethod');
-        $parameter = $this->prophesize('ReflectionParameter');
-
-        $class->getName()->willReturn('Custom\ClassName');
-        $class->isInterface()->willReturn(false);
-        $class->isFinal()->willReturn(false);
-        $class->getMethods(\ReflectionMethod::IS_PUBLIC)->willReturn(array($method));
-        $class->getMethods(\ReflectionMethod::IS_ABSTRACT)->willReturn(array());
-
-        $method->getParameters()->willReturn(array($parameter));
-        $method->getName()->willReturn('methodName');
-        $method->isFinal()->willReturn(false);
-        $method->isProtected()->willReturn(false);
-        $method->isStatic()->willReturn(false);
-        $method->returnsReference()->willReturn(false);
-
-        if (version_compare(PHP_VERSION, '7.0', '>=')) {
-            $method->hasReturnType()->willReturn(false);
-        }
-
-        $parameter->getName()->willReturn('...');
-        $parameter->isDefaultValueAvailable()->willReturn(true);
-        $parameter->getDefaultValue()->willReturn(null);
-        $parameter->isPassedByReference()->willReturn(false);
-        $parameter->getClass()->willReturn($class);
-        if (version_compare(PHP_VERSION, '5.6', '>=')) {
-            $parameter->isVariadic()->willReturn(false);
-        }
-
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect($class->reveal(), array());
-
-        $methodNodes = $classNode->getMethods();
-
-        $argumentNodes = $methodNodes['methodName']->getArguments();
-        $argumentNode = $argumentNodes[0];
-
-        $this->assertEquals('__dot_dot_dot__', $argumentNode->getName());
-    }
-}
diff --git a/vendor/phpunit/php-token-stream/.gitignore b/vendor/phpunit/php-token-stream/.gitignore
index 103eecf83749ea5a2cfa63ae618923a833e5cc13..77aae3df6e338a127a446377b660bb4c99cbd55e 100644
--- a/vendor/phpunit/php-token-stream/.gitignore
+++ b/vendor/phpunit/php-token-stream/.gitignore
@@ -1,4 +1,3 @@
 /.idea
 /composer.lock
-/composer.phar
 /vendor
diff --git a/vendor/phpunit/php-token-stream/.travis.yml b/vendor/phpunit/php-token-stream/.travis.yml
index 3f31d02f7700b0014802335957fea9d3d741e62e..9305d516bafa0a568935052fc9d75b511088d221 100644
--- a/vendor/phpunit/php-token-stream/.travis.yml
+++ b/vendor/phpunit/php-token-stream/.travis.yml
@@ -1,14 +1,12 @@
 language: php
 
 php:
-  - 5.3
-  - 5.4
-  - 5.5
-  - 5.6
   - 7.0
   - 7.0snapshot
   - 7.1
   - 7.1snapshot
+  - 7.2
+  - 7.2snapshot
   - master
 
 sudo: false
@@ -18,10 +16,13 @@ before_install:
   - composer clear-cache
 
 install:
-  - travis_retry composer update --no-interaction --no-ansi --no-progress --no-suggest --optimize-autoloader --prefer-stable
+  - travis_retry composer update --no-interaction --no-ansi --no-progress --no-suggest
 
 script:
-  - ./vendor/bin/phpunit --configuration ./build/phpunit.xml
+  - ./vendor/bin/phpunit --coverage-clover=coverage.xml
+
+after_success:
+  - bash <(curl -s https://codecov.io/bash)
 
 notifications:
   email: false
diff --git a/vendor/phpunit/php-token-stream/ChangeLog.md b/vendor/phpunit/php-token-stream/ChangeLog.md
new file mode 100644
index 0000000000000000000000000000000000000000..9992a8f45f14f7bfb81c4639a4222873564c5030
--- /dev/null
+++ b/vendor/phpunit/php-token-stream/ChangeLog.md
@@ -0,0 +1,14 @@
+# Change Log
+
+All notable changes to `sebastianbergmann/php-token-stream` are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles.
+
+## [2.0.1] - 2017-08-20
+
+### Fixed
+
+* Fixed [#68](https://github.com/sebastianbergmann/php-token-stream/issues/68): Method with name `empty` wrongly recognized as anonymous function
+
+## [2.0.0] - 2017-08-03
+
+[2.0.1]: https://github.com/sebastianbergmann/php-token-stream/compare/2.0.0...2.0.1
+[2.0.0]: https://github.com/sebastianbergmann/php-token-stream/compare/1.4.11...2.0.0
diff --git a/vendor/phpunit/php-token-stream/LICENSE b/vendor/phpunit/php-token-stream/LICENSE
index 6a176fa0f341e8203d8d5f98510650f82f9d9e1d..cdd1374f0e6dacc5e226c16f11f8b5dac5291f15 100644
--- a/vendor/phpunit/php-token-stream/LICENSE
+++ b/vendor/phpunit/php-token-stream/LICENSE
@@ -1,6 +1,6 @@
 PHP_TokenStream
 
-Copyright (c) 2009-2015, Sebastian Bergmann <sebastian@phpunit.de>.
+Copyright (c) 2009-2017, Sebastian Bergmann <sebastian@phpunit.de>.
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
diff --git a/vendor/phpunit/php-token-stream/README.md b/vendor/phpunit/php-token-stream/README.md
index 1cee04873c5086cfa868cad5d13bea8578d1b49a..149b7e2dfb2dc019a9fa7304a23efb14db8bd58f 100644
--- a/vendor/phpunit/php-token-stream/README.md
+++ b/vendor/phpunit/php-token-stream/README.md
@@ -1,6 +1,6 @@
 [![Build Status](https://travis-ci.org/sebastianbergmann/php-token-stream.svg?branch=master)](https://travis-ci.org/sebastianbergmann/php-token-stream)
 
-# PHP_TokenStream
+# php-token-stream
 
 ## Installation
 
diff --git a/vendor/phpunit/php-token-stream/build.xml b/vendor/phpunit/php-token-stream/build.xml
index f02f4b5cff1a6437e6c722b692c587c712b457a9..0da8056e583065032a56e3fe3e3dbad66f3e020c 100644
--- a/vendor/phpunit/php-token-stream/build.xml
+++ b/vendor/phpunit/php-token-stream/build.xml
@@ -1,33 +1,21 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project name="php-token-stream">
- <target name="clean" description="Cleanup build artifacts">
-  <delete dir="${basedir}/vendor"/>
-  <delete file="${basedir}/composer.lock"/>
- </target>
+<project name="php-token-stream" default="setup">
+    <target name="setup" depends="clean,composer"/>
 
- <target name="composer" depends="clean" description="Install dependencies with Composer">
-  <tstamp>
-   <format property="thirty.days.ago" pattern="MM/dd/yyyy hh:mm aa" offset="-30" unit="day"/>
-  </tstamp>
-  <delete>
-   <fileset dir="${basedir}">
-    <include name="composer.phar" />
-    <date datetime="${thirty.days.ago}" when="before"/>
-   </fileset>
-  </delete>
+    <target name="clean" description="Cleanup build artifacts">
+        <delete dir="${basedir}/vendor"/>
+        <delete file="${basedir}/composer.lock"/>
+    </target>
 
-  <get src="https://getcomposer.org/composer.phar" dest="${basedir}/composer.phar" skipexisting="true"/>
-
-  <exec executable="php">
-   <arg value="composer.phar"/>
-   <arg value="install"/>
-  </exec>
- </target>
-
- <target name="phpunit" description="Run unit tests with PHPUnit">
-  <exec executable="${basedir}/vendor/bin/phpunit" failonerror="true">
-   <arg value="--configuration"/>
-   <arg path="${basedir}/build/phpunit.xml"/>
-  </exec>
- </target>
+    <target name="composer" depends="clean" description="Install dependencies with Composer">
+        <exec executable="composer" taskname="composer">
+            <env key="COMPOSER_DISABLE_XDEBUG_WARN" value="1"/>
+            <arg value="update"/>
+            <arg value="--no-interaction"/>
+            <arg value="--no-progress"/>
+            <arg value="--no-ansi"/>
+            <arg value="--no-suggest"/>
+        </exec>
+    </target>
 </project>
+
diff --git a/vendor/phpunit/php-token-stream/build/phpunit.xml b/vendor/phpunit/php-token-stream/build/phpunit.xml
deleted file mode 100644
index 139586d2f7166183ac73af6d738b6476a3bc7cdd..0000000000000000000000000000000000000000
--- a/vendor/phpunit/php-token-stream/build/phpunit.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<phpunit backupGlobals="false"
-         backupStaticAttributes="false"
-         bootstrap="../tests/bootstrap.php"
-         verbode="true">
-  <testsuites>
-    <testsuite name="php-token-stream">
-      <directory suffix="Test.php">../tests</directory>
-    </testsuite>
-  </testsuites>
-
-  <filter>
-    <whitelist addUncoveredFilesFromWhitelist="true">
-      <directory suffix=".php">../src</directory>
-    </whitelist>
-  </filter>
-</phpunit>
diff --git a/vendor/phpunit/php-token-stream/composer.json b/vendor/phpunit/php-token-stream/composer.json
index dfde7299546b74378ba17c668c822f04687c8c1e..4bf07e706f387f765f9ebc59266924921839cdd9 100644
--- a/vendor/phpunit/php-token-stream/composer.json
+++ b/vendor/phpunit/php-token-stream/composer.json
@@ -15,11 +15,15 @@
         "issues": "https://github.com/sebastianbergmann/php-token-stream/issues"
     },
     "require": {
-        "php": ">=5.3.3",
+        "php": "^7.0",
         "ext-tokenizer": "*"
     },
     "require-dev": {
-        "phpunit/phpunit": "~4.2"
+        "phpunit/phpunit": "^6.2.4"
+    },
+    "config": {
+        "optimize-autoloader": true,
+        "sort-packages": true
     },
     "autoload": {
         "classmap": [
@@ -28,7 +32,7 @@
     },
     "extra": {
         "branch-alias": {
-            "dev-master": "1.4-dev"
+            "dev-master": "2.0-dev"
         }
     }
 }
diff --git a/vendor/phpunit/php-token-stream/phpunit.xml b/vendor/phpunit/php-token-stream/phpunit.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1f789ba2a95292c335ef1ecbf3df3dbce8b917cb
--- /dev/null
+++ b/vendor/phpunit/php-token-stream/phpunit.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/6.0/phpunit.xsd"
+         bootstrap="tests/bootstrap.php"
+         beStrictAboutOutputDuringTests="true"
+         beStrictAboutTodoAnnotatedTests="true"
+         verbose="true">
+    <testsuite>
+        <directory suffix="Test.php">tests</directory>
+    </testsuite>
+
+    <filter>
+        <whitelist processUncoveredFilesFromWhitelist="true">
+            <directory suffix=".php">src</directory>
+        </whitelist>
+    </filter>
+</phpunit>
diff --git a/vendor/phpunit/php-token-stream/src/Token.php b/vendor/phpunit/php-token-stream/src/Token.php
index 2452e1c12ee90d3e7294ca353bc19085c5712520..f4db9a7817a12c1e4f181bf2fc7c26bdd47b9d0a 100644
--- a/vendor/phpunit/php-token-stream/src/Token.php
+++ b/vendor/phpunit/php-token-stream/src/Token.php
@@ -1,6 +1,6 @@
 <?php
 /*
- * This file is part of the PHP_TokenStream package.
+ * This file is part of php-token-stream.
  *
  * (c) Sebastian Bergmann <sebastian@phpunit.de>
  *
@@ -10,12 +10,6 @@
 
 /**
  * A PHP token.
- *
- * @author    Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license   http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
- * @link      http://github.com/sebastianbergmann/php-token-stream/tree
- * @since     Class available since Release 1.0.0
  */
 abstract class PHP_Token
 {
@@ -25,7 +19,7 @@ abstract class PHP_Token
     protected $text;
 
     /**
-     * @var integer
+     * @var int
      */
     protected $line;
 
@@ -35,17 +29,15 @@ abstract class PHP_Token
     protected $tokenStream;
 
     /**
-     * @var integer
+     * @var int
      */
     protected $id;
 
     /**
-     * Constructor.
-     *
      * @param string           $text
-     * @param integer          $line
+     * @param int              $line
      * @param PHP_Token_Stream $tokenStream
-     * @param integer          $id
+     * @param int              $id
      */
     public function __construct($text, $line, PHP_Token_Stream $tokenStream, $id)
     {
@@ -64,18 +56,26 @@ abstract class PHP_Token
     }
 
     /**
-     * @return integer
+     * @return int
      */
     public function getLine()
     {
         return $this->line;
     }
+
+    /**
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
 }
 
 abstract class PHP_TokenWithScope extends PHP_Token
 {
     /**
-     * @var integer
+     * @var int
      */
     protected $endTokenId;
 
@@ -120,12 +120,12 @@ abstract class PHP_TokenWithScope extends PHP_Token
                 break;
             }
 
-            return (string)$tokens[$i];
+            return (string) $tokens[$i];
         }
     }
 
     /**
-     * @return integer
+     * @return int
      */
     public function getEndTokenId()
     {
@@ -162,7 +162,7 @@ abstract class PHP_TokenWithScope extends PHP_Token
     }
 
     /**
-     * @return integer
+     * @return int
      */
     public function getEndLine()
     {
@@ -203,7 +203,7 @@ abstract class PHP_TokenWithScopeAndVisibility extends PHP_TokenWithScope
      */
     public function getKeywords()
     {
-        $keywords = array();
+        $keywords = [];
         $tokens   = $this->tokenStream->tokens();
 
         for ($i = $this->id - 2; $i > $this->id - 7; $i -= 2) {
@@ -268,8 +268,8 @@ abstract class PHP_Token_Includes extends PHP_Token
     {
         $tokens = $this->tokenStream->tokens();
 
-        if ($tokens[$this->id+2] instanceof PHP_Token_CONSTANT_ENCAPSED_STRING) {
-            $this->name = trim($tokens[$this->id+2], "'\"");
+        if ($tokens[$this->id + 2] instanceof PHP_Token_CONSTANT_ENCAPSED_STRING) {
+            $this->name = trim($tokens[$this->id + 2], "'\"");
             $this->type = strtolower(
                 str_replace('PHP_Token_', '', get_class($tokens[$this->id]))
             );
@@ -277,7 +277,6 @@ abstract class PHP_Token_Includes extends PHP_Token
     }
 }
 
-
 class PHP_Token_FUNCTION extends PHP_TokenWithScopeAndVisibility
 {
     /**
@@ -286,7 +285,7 @@ class PHP_Token_FUNCTION extends PHP_TokenWithScopeAndVisibility
     protected $arguments;
 
     /**
-     * @var integer
+     * @var int
      */
     protected $ccn;
 
@@ -300,6 +299,11 @@ class PHP_Token_FUNCTION extends PHP_TokenWithScopeAndVisibility
      */
     protected $signature;
 
+    /**
+     * @var bool
+     */
+    private $anonymous = false;
+
     /**
      * @return array
      */
@@ -309,23 +313,23 @@ class PHP_Token_FUNCTION extends PHP_TokenWithScopeAndVisibility
             return $this->arguments;
         }
 
-        $this->arguments = array();
+        $this->arguments = [];
         $tokens          = $this->tokenStream->tokens();
         $typeDeclaration = null;
 
         // Search for first token inside brackets
         $i = $this->id + 2;
 
-        while (!$tokens[$i-1] instanceof PHP_Token_OPEN_BRACKET) {
+        while (!$tokens[$i - 1] instanceof PHP_Token_OPEN_BRACKET) {
             $i++;
         }
 
         while (!$tokens[$i] instanceof PHP_Token_CLOSE_BRACKET) {
             if ($tokens[$i] instanceof PHP_Token_STRING) {
-                $typeDeclaration = (string)$tokens[$i];
+                $typeDeclaration = (string) $tokens[$i];
             } elseif ($tokens[$i] instanceof PHP_Token_VARIABLE) {
-                $this->arguments[(string)$tokens[$i]] = $typeDeclaration;
-                $typeDeclaration                      = null;
+                $this->arguments[(string) $tokens[$i]] = $typeDeclaration;
+                $typeDeclaration                       = null;
             }
 
             $i++;
@@ -345,24 +349,35 @@ class PHP_Token_FUNCTION extends PHP_TokenWithScopeAndVisibility
 
         $tokens = $this->tokenStream->tokens();
 
-        for ($i = $this->id + 1; $i < count($tokens); $i++) {
-            if ($tokens[$i] instanceof PHP_Token_STRING) {
-                $this->name = (string)$tokens[$i];
-                break;
-            } elseif ($tokens[$i] instanceof PHP_Token_AMPERSAND &&
-                     $tokens[$i+1] instanceof PHP_Token_STRING) {
-                $this->name = (string)$tokens[$i+1];
-                break;
-            } elseif ($tokens[$i] instanceof PHP_Token_OPEN_BRACKET) {
-                $this->name = 'anonymous function';
-                break;
-            }
+        $i = $this->id + 1;
+
+        if ($tokens[$i] instanceof PHP_Token_WHITESPACE) {
+            $i++;
+        }
+
+        if ($tokens[$i] instanceof PHP_Token_AMPERSAND) {
+            $i++;
+        }
+
+        if ($tokens[$i + 1] instanceof PHP_Token_OPEN_BRACKET) {
+            $this->name = (string) $tokens[$i];
+        } elseif ($tokens[$i + 1] instanceof PHP_Token_WHITESPACE && $tokens[$i + 2] instanceof PHP_Token_OPEN_BRACKET) {
+            $this->name = (string) $tokens[$i];
+        } else {
+            $this->anonymous = true;
+
+            $this->name = sprintf(
+                'anonymousFunction:%s#%s',
+                $this->getLine(),
+                $this->getId()
+            );
         }
 
-        if ($this->name != 'anonymous function') {
+        if (!$this->isAnonymous()) {
             for ($i = $this->id; $i; --$i) {
                 if ($tokens[$i] instanceof PHP_Token_NAMESPACE) {
                     $this->name = $tokens[$i]->getName() . '\\' . $this->name;
+
                     break;
                 }
 
@@ -376,7 +391,7 @@ class PHP_Token_FUNCTION extends PHP_TokenWithScopeAndVisibility
     }
 
     /**
-     * @return integer
+     * @return int
      */
     public function getCCN()
     {
@@ -419,8 +434,8 @@ class PHP_Token_FUNCTION extends PHP_TokenWithScopeAndVisibility
             return $this->signature;
         }
 
-        if ($this->getName() == 'anonymous function') {
-            $this->signature = 'anonymous function';
+        if ($this->isAnonymous()) {
+            $this->signature = 'anonymousFunction';
             $i               = $this->id + 1;
         } else {
             $this->signature = '';
@@ -439,6 +454,14 @@ class PHP_Token_FUNCTION extends PHP_TokenWithScopeAndVisibility
 
         return $this->signature;
     }
+
+    /**
+     * @return bool
+     */
+    public function isAnonymous()
+    {
+        return $this->anonymous;
+    }
 }
 
 class PHP_Token_INTERFACE extends PHP_TokenWithScopeAndVisibility
@@ -453,11 +476,11 @@ class PHP_Token_INTERFACE extends PHP_TokenWithScopeAndVisibility
      */
     public function getName()
     {
-        return (string)$this->tokenStream[$this->id + 2];
+        return (string) $this->tokenStream[$this->id + 2];
     }
 
     /**
-     * @return boolean
+     * @return bool
      */
     public function hasParent()
     {
@@ -472,13 +495,13 @@ class PHP_Token_INTERFACE extends PHP_TokenWithScopeAndVisibility
         $className  = $this->getName();
         $docComment = $this->getDocblock();
 
-        $result = array(
+        $result = [
             'namespace'   => '',
             'fullPackage' => '',
             'category'    => '',
             'package'     => '',
             'subpackage'  => ''
-        );
+        ];
 
         for ($i = $this->id; $i; --$i) {
             if ($this->tokenStream[$i] instanceof PHP_Token_NAMESPACE) {
@@ -512,8 +535,9 @@ class PHP_Token_INTERFACE extends PHP_TokenWithScopeAndVisibility
     }
 
     /**
-     * @param  array  $parts
-     * @param  string $join
+     * @param array  $parts
+     * @param string $join
+     *
      * @return string
      */
     protected function arrayToName(array $parts, $join = '\\')
@@ -523,14 +547,14 @@ class PHP_Token_INTERFACE extends PHP_TokenWithScopeAndVisibility
         if (count($parts) > 1) {
             array_pop($parts);
 
-            $result = join($join, $parts);
+            $result = implode($join, $parts);
         }
 
         return $result;
     }
 
     /**
-     * @return boolean|string
+     * @return bool|string
      */
     public function getParent()
     {
@@ -540,18 +564,18 @@ class PHP_Token_INTERFACE extends PHP_TokenWithScopeAndVisibility
 
         $i         = $this->id + 6;
         $tokens    = $this->tokenStream->tokens();
-        $className = (string)$tokens[$i];
+        $className = (string) $tokens[$i];
 
-        while (isset($tokens[$i+1]) &&
-               !$tokens[$i+1] instanceof PHP_Token_WHITESPACE) {
-            $className .= (string)$tokens[++$i];
+        while (isset($tokens[$i + 1]) &&
+               !$tokens[$i + 1] instanceof PHP_Token_WHITESPACE) {
+            $className .= (string) $tokens[++$i];
         }
 
         return $className;
     }
 
     /**
-     * @return boolean
+     * @return bool
      */
     public function hasInterfaces()
     {
@@ -562,7 +586,7 @@ class PHP_Token_INTERFACE extends PHP_TokenWithScopeAndVisibility
     }
 
     /**
-     * @return array|boolean
+     * @return array|bool
      */
     public function getInterfaces()
     {
@@ -582,11 +606,11 @@ class PHP_Token_INTERFACE extends PHP_TokenWithScopeAndVisibility
 
         $tokens = $this->tokenStream->tokens();
 
-        while (!$tokens[$i+1] instanceof PHP_Token_OPEN_CURLY) {
+        while (!$tokens[$i + 1] instanceof PHP_Token_OPEN_CURLY) {
             $i++;
 
             if ($tokens[$i] instanceof PHP_Token_STRING) {
-                $this->interfaces[] = (string)$tokens[$i];
+                $this->interfaces[] = (string) $tokens[$i];
             }
         }
 
@@ -594,31 +618,95 @@ class PHP_Token_INTERFACE extends PHP_TokenWithScopeAndVisibility
     }
 }
 
-class PHP_Token_ABSTRACT extends PHP_Token {}
-class PHP_Token_AMPERSAND extends PHP_Token {}
-class PHP_Token_AND_EQUAL extends PHP_Token {}
-class PHP_Token_ARRAY extends PHP_Token {}
-class PHP_Token_ARRAY_CAST extends PHP_Token {}
-class PHP_Token_AS extends PHP_Token {}
-class PHP_Token_AT extends PHP_Token {}
-class PHP_Token_BACKTICK extends PHP_Token {}
-class PHP_Token_BAD_CHARACTER extends PHP_Token {}
-class PHP_Token_BOOLEAN_AND extends PHP_Token {}
-class PHP_Token_BOOLEAN_OR extends PHP_Token {}
-class PHP_Token_BOOL_CAST extends PHP_Token {}
-class PHP_Token_BREAK extends PHP_Token {}
-class PHP_Token_CARET extends PHP_Token {}
-class PHP_Token_CASE extends PHP_Token {}
-class PHP_Token_CATCH extends PHP_Token {}
-class PHP_Token_CHARACTER extends PHP_Token {}
+class PHP_Token_ABSTRACT extends PHP_Token
+{
+}
+
+class PHP_Token_AMPERSAND extends PHP_Token
+{
+}
+
+class PHP_Token_AND_EQUAL extends PHP_Token
+{
+}
+
+class PHP_Token_ARRAY extends PHP_Token
+{
+}
+
+class PHP_Token_ARRAY_CAST extends PHP_Token
+{
+}
+
+class PHP_Token_AS extends PHP_Token
+{
+}
+
+class PHP_Token_AT extends PHP_Token
+{
+}
+
+class PHP_Token_BACKTICK extends PHP_Token
+{
+}
+
+class PHP_Token_BAD_CHARACTER extends PHP_Token
+{
+}
+
+class PHP_Token_BOOLEAN_AND extends PHP_Token
+{
+}
+
+class PHP_Token_BOOLEAN_OR extends PHP_Token
+{
+}
+
+class PHP_Token_BOOL_CAST extends PHP_Token
+{
+}
+
+class PHP_Token_BREAK extends PHP_Token
+{
+}
+
+class PHP_Token_CARET extends PHP_Token
+{
+}
+
+class PHP_Token_CASE extends PHP_Token
+{
+}
+
+class PHP_Token_CATCH extends PHP_Token
+{
+}
+
+class PHP_Token_CHARACTER extends PHP_Token
+{
+}
 
 class PHP_Token_CLASS extends PHP_Token_INTERFACE
 {
+    /**
+     * @var bool
+     */
+    private $anonymous = false;
+
+    /**
+     * @var string
+     */
+    private $name;
+
     /**
      * @return string
      */
     public function getName()
     {
+        if ($this->name !== null) {
+            return $this->name;
+        }
+
         $next = $this->tokenStream[$this->id + 1];
 
         if ($next instanceof PHP_Token_WHITESPACE) {
@@ -626,224 +714,747 @@ class PHP_Token_CLASS extends PHP_Token_INTERFACE
         }
 
         if ($next instanceof PHP_Token_STRING) {
-            return (string) $next;
+            $this->name =(string) $next;
+
+            return $this->name;
         }
 
         if ($next instanceof PHP_Token_OPEN_CURLY ||
             $next instanceof PHP_Token_EXTENDS ||
             $next instanceof PHP_Token_IMPLEMENTS) {
-            return 'anonymous class';
+
+            $this->name = sprintf(
+                'AnonymousClass:%s#%s',
+                $this->getLine(),
+                $this->getId()
+            );
+
+            $this->anonymous = true;
+
+            return $this->name;
         }
     }
+
+    public function isAnonymous()
+    {
+        return $this->anonymous;
+    }
 }
 
-class PHP_Token_CLASS_C extends PHP_Token {}
-class PHP_Token_CLASS_NAME_CONSTANT extends PHP_Token {}
-class PHP_Token_CLONE extends PHP_Token {}
-class PHP_Token_CLOSE_BRACKET extends PHP_Token {}
-class PHP_Token_CLOSE_CURLY extends PHP_Token {}
-class PHP_Token_CLOSE_SQUARE extends PHP_Token {}
-class PHP_Token_CLOSE_TAG extends PHP_Token {}
-class PHP_Token_COLON extends PHP_Token {}
-class PHP_Token_COMMA extends PHP_Token {}
-class PHP_Token_COMMENT extends PHP_Token {}
-class PHP_Token_CONCAT_EQUAL extends PHP_Token {}
-class PHP_Token_CONST extends PHP_Token {}
-class PHP_Token_CONSTANT_ENCAPSED_STRING extends PHP_Token {}
-class PHP_Token_CONTINUE extends PHP_Token {}
-class PHP_Token_CURLY_OPEN extends PHP_Token {}
-class PHP_Token_DEC extends PHP_Token {}
-class PHP_Token_DECLARE extends PHP_Token {}
-class PHP_Token_DEFAULT extends PHP_Token {}
-class PHP_Token_DIV extends PHP_Token {}
-class PHP_Token_DIV_EQUAL extends PHP_Token {}
-class PHP_Token_DNUMBER extends PHP_Token {}
-class PHP_Token_DO extends PHP_Token {}
-class PHP_Token_DOC_COMMENT extends PHP_Token {}
-class PHP_Token_DOLLAR extends PHP_Token {}
-class PHP_Token_DOLLAR_OPEN_CURLY_BRACES extends PHP_Token {}
-class PHP_Token_DOT extends PHP_Token {}
-class PHP_Token_DOUBLE_ARROW extends PHP_Token {}
-class PHP_Token_DOUBLE_CAST extends PHP_Token {}
-class PHP_Token_DOUBLE_COLON extends PHP_Token {}
-class PHP_Token_DOUBLE_QUOTES extends PHP_Token {}
-class PHP_Token_ECHO extends PHP_Token {}
-class PHP_Token_ELSE extends PHP_Token {}
-class PHP_Token_ELSEIF extends PHP_Token {}
-class PHP_Token_EMPTY extends PHP_Token {}
-class PHP_Token_ENCAPSED_AND_WHITESPACE extends PHP_Token {}
-class PHP_Token_ENDDECLARE extends PHP_Token {}
-class PHP_Token_ENDFOR extends PHP_Token {}
-class PHP_Token_ENDFOREACH extends PHP_Token {}
-class PHP_Token_ENDIF extends PHP_Token {}
-class PHP_Token_ENDSWITCH extends PHP_Token {}
-class PHP_Token_ENDWHILE extends PHP_Token {}
-class PHP_Token_END_HEREDOC extends PHP_Token {}
-class PHP_Token_EQUAL extends PHP_Token {}
-class PHP_Token_EVAL extends PHP_Token {}
-class PHP_Token_EXCLAMATION_MARK extends PHP_Token {}
-class PHP_Token_EXIT extends PHP_Token {}
-class PHP_Token_EXTENDS extends PHP_Token {}
-class PHP_Token_FILE extends PHP_Token {}
-class PHP_Token_FINAL extends PHP_Token {}
-class PHP_Token_FOR extends PHP_Token {}
-class PHP_Token_FOREACH extends PHP_Token {}
-class PHP_Token_FUNC_C extends PHP_Token {}
-class PHP_Token_GLOBAL extends PHP_Token {}
-class PHP_Token_GT extends PHP_Token {}
-class PHP_Token_IF extends PHP_Token {}
-class PHP_Token_IMPLEMENTS extends PHP_Token {}
-class PHP_Token_INC extends PHP_Token {}
-class PHP_Token_INCLUDE extends PHP_Token_Includes {}
-class PHP_Token_INCLUDE_ONCE extends PHP_Token_Includes {}
-class PHP_Token_INLINE_HTML extends PHP_Token {}
-class PHP_Token_INSTANCEOF extends PHP_Token {}
-class PHP_Token_INT_CAST extends PHP_Token {}
-class PHP_Token_ISSET extends PHP_Token {}
-class PHP_Token_IS_EQUAL extends PHP_Token {}
-class PHP_Token_IS_GREATER_OR_EQUAL extends PHP_Token {}
-class PHP_Token_IS_IDENTICAL extends PHP_Token {}
-class PHP_Token_IS_NOT_EQUAL extends PHP_Token {}
-class PHP_Token_IS_NOT_IDENTICAL extends PHP_Token {}
-class PHP_Token_IS_SMALLER_OR_EQUAL extends PHP_Token {}
-class PHP_Token_LINE extends PHP_Token {}
-class PHP_Token_LIST extends PHP_Token {}
-class PHP_Token_LNUMBER extends PHP_Token {}
-class PHP_Token_LOGICAL_AND extends PHP_Token {}
-class PHP_Token_LOGICAL_OR extends PHP_Token {}
-class PHP_Token_LOGICAL_XOR extends PHP_Token {}
-class PHP_Token_LT extends PHP_Token {}
-class PHP_Token_METHOD_C extends PHP_Token {}
-class PHP_Token_MINUS extends PHP_Token {}
-class PHP_Token_MINUS_EQUAL extends PHP_Token {}
-class PHP_Token_MOD_EQUAL extends PHP_Token {}
-class PHP_Token_MULT extends PHP_Token {}
-class PHP_Token_MUL_EQUAL extends PHP_Token {}
-class PHP_Token_NEW extends PHP_Token {}
-class PHP_Token_NUM_STRING extends PHP_Token {}
-class PHP_Token_OBJECT_CAST extends PHP_Token {}
-class PHP_Token_OBJECT_OPERATOR extends PHP_Token {}
-class PHP_Token_OPEN_BRACKET extends PHP_Token {}
-class PHP_Token_OPEN_CURLY extends PHP_Token {}
-class PHP_Token_OPEN_SQUARE extends PHP_Token {}
-class PHP_Token_OPEN_TAG extends PHP_Token {}
-class PHP_Token_OPEN_TAG_WITH_ECHO extends PHP_Token {}
-class PHP_Token_OR_EQUAL extends PHP_Token {}
-class PHP_Token_PAAMAYIM_NEKUDOTAYIM extends PHP_Token {}
-class PHP_Token_PERCENT extends PHP_Token {}
-class PHP_Token_PIPE extends PHP_Token {}
-class PHP_Token_PLUS extends PHP_Token {}
-class PHP_Token_PLUS_EQUAL extends PHP_Token {}
-class PHP_Token_PRINT extends PHP_Token {}
-class PHP_Token_PRIVATE extends PHP_Token {}
-class PHP_Token_PROTECTED extends PHP_Token {}
-class PHP_Token_PUBLIC extends PHP_Token {}
-class PHP_Token_QUESTION_MARK extends PHP_Token {}
-class PHP_Token_REQUIRE extends PHP_Token_Includes {}
-class PHP_Token_REQUIRE_ONCE extends PHP_Token_Includes {}
-class PHP_Token_RETURN extends PHP_Token {}
-class PHP_Token_SEMICOLON extends PHP_Token {}
-class PHP_Token_SL extends PHP_Token {}
-class PHP_Token_SL_EQUAL extends PHP_Token {}
-class PHP_Token_SR extends PHP_Token {}
-class PHP_Token_SR_EQUAL extends PHP_Token {}
-class PHP_Token_START_HEREDOC extends PHP_Token {}
-class PHP_Token_STATIC extends PHP_Token {}
-class PHP_Token_STRING extends PHP_Token {}
-class PHP_Token_STRING_CAST extends PHP_Token {}
-class PHP_Token_STRING_VARNAME extends PHP_Token {}
-class PHP_Token_SWITCH extends PHP_Token {}
-class PHP_Token_THROW extends PHP_Token {}
-class PHP_Token_TILDE extends PHP_Token {}
-class PHP_Token_TRY extends PHP_Token {}
-class PHP_Token_UNSET extends PHP_Token {}
-class PHP_Token_UNSET_CAST extends PHP_Token {}
-class PHP_Token_USE extends PHP_Token {}
-class PHP_Token_USE_FUNCTION extends PHP_Token {}
-class PHP_Token_VAR extends PHP_Token {}
-class PHP_Token_VARIABLE extends PHP_Token {}
-class PHP_Token_WHILE extends PHP_Token {}
-class PHP_Token_WHITESPACE extends PHP_Token {}
-class PHP_Token_XOR_EQUAL extends PHP_Token {}
+class PHP_Token_CLASS_C extends PHP_Token
+{
+}
 
-// Tokens introduced in PHP 5.1
-class PHP_Token_HALT_COMPILER extends PHP_Token {}
+class PHP_Token_CLASS_NAME_CONSTANT extends PHP_Token
+{
+}
 
-// Tokens introduced in PHP 5.3
-class PHP_Token_DIR extends PHP_Token {}
-class PHP_Token_GOTO extends PHP_Token {}
+class PHP_Token_CLONE extends PHP_Token
+{
+}
 
-class PHP_Token_NAMESPACE extends PHP_TokenWithScope
+class PHP_Token_CLOSE_BRACKET extends PHP_Token
 {
-    /**
-     * @return string
-     */
-    public function getName()
-    {
-        $tokens    = $this->tokenStream->tokens();
-        $namespace = (string)$tokens[$this->id+2];
+}
 
-        for ($i = $this->id + 3;; $i += 2) {
-            if (isset($tokens[$i]) &&
-                $tokens[$i] instanceof PHP_Token_NS_SEPARATOR) {
-                $namespace .= '\\' . $tokens[$i+1];
-            } else {
-                break;
-            }
-        }
+class PHP_Token_CLOSE_CURLY extends PHP_Token
+{
+}
 
-        return $namespace;
-    }
+class PHP_Token_CLOSE_SQUARE extends PHP_Token
+{
 }
 
-class PHP_Token_NS_C extends PHP_Token {}
-class PHP_Token_NS_SEPARATOR extends PHP_Token {}
+class PHP_Token_CLOSE_TAG extends PHP_Token
+{
+}
 
-// Tokens introduced in PHP 5.4
-class PHP_Token_CALLABLE extends PHP_Token {}
-class PHP_Token_INSTEADOF extends PHP_Token {}
-class PHP_Token_TRAIT extends PHP_Token_INTERFACE {}
-class PHP_Token_TRAIT_C extends PHP_Token {}
+class PHP_Token_COLON extends PHP_Token
+{
+}
 
-// Tokens introduced in PHP 5.5
-class PHP_Token_FINALLY extends PHP_Token {}
-class PHP_Token_YIELD extends PHP_Token {}
+class PHP_Token_COMMA extends PHP_Token
+{
+}
 
-// Tokens introduced in PHP 5.6
-class PHP_Token_ELLIPSIS extends PHP_Token {}
-class PHP_Token_POW extends PHP_Token {}
-class PHP_Token_POW_EQUAL extends PHP_Token {}
+class PHP_Token_COMMENT extends PHP_Token
+{
+}
 
-// Tokens introduced in PHP 7.0
-class PHP_Token_COALESCE extends PHP_Token {}
-class PHP_Token_SPACESHIP extends PHP_Token {}
-class PHP_Token_YIELD_FROM extends PHP_Token {}
+class PHP_Token_CONCAT_EQUAL extends PHP_Token
+{
+}
 
-// Tokens introduced in HackLang / HHVM
-class PHP_Token_ASYNC extends PHP_Token {}
-class PHP_Token_AWAIT extends PHP_Token {}
-class PHP_Token_COMPILER_HALT_OFFSET extends PHP_Token {}
-class PHP_Token_ENUM extends PHP_Token {}
-class PHP_Token_EQUALS extends PHP_Token {}
-class PHP_Token_IN extends PHP_Token {}
-class PHP_Token_JOIN extends PHP_Token {}
-class PHP_Token_LAMBDA_ARROW extends PHP_Token {}
-class PHP_Token_LAMBDA_CP extends PHP_Token {}
-class PHP_Token_LAMBDA_OP extends PHP_Token {}
-class PHP_Token_ONUMBER extends PHP_Token {}
-class PHP_Token_NULLSAFE_OBJECT_OPERATOR extends PHP_Token {}
-class PHP_Token_SHAPE extends PHP_Token {}
-class PHP_Token_SUPER extends PHP_Token {}
-class PHP_Token_TYPE extends PHP_Token {}
-class PHP_Token_TYPELIST_GT extends PHP_Token {}
-class PHP_Token_TYPELIST_LT extends PHP_Token {}
-class PHP_Token_WHERE extends PHP_Token {}
-class PHP_Token_XHP_ATTRIBUTE extends PHP_Token {}
-class PHP_Token_XHP_CATEGORY extends PHP_Token {}
-class PHP_Token_XHP_CATEGORY_LABEL extends PHP_Token {}
-class PHP_Token_XHP_CHILDREN extends PHP_Token {}
-class PHP_Token_XHP_LABEL extends PHP_Token {}
-class PHP_Token_XHP_REQUIRED extends PHP_Token {}
-class PHP_Token_XHP_TAG_GT extends PHP_Token {}
-class PHP_Token_XHP_TAG_LT extends PHP_Token {}
-class PHP_Token_XHP_TEXT extends PHP_Token {}
+class PHP_Token_CONST extends PHP_Token
+{
+}
+
+class PHP_Token_CONSTANT_ENCAPSED_STRING extends PHP_Token
+{
+}
+
+class PHP_Token_CONTINUE extends PHP_Token
+{
+}
+
+class PHP_Token_CURLY_OPEN extends PHP_Token
+{
+}
+
+class PHP_Token_DEC extends PHP_Token
+{
+}
+
+class PHP_Token_DECLARE extends PHP_Token
+{
+}
+
+class PHP_Token_DEFAULT extends PHP_Token
+{
+}
+
+class PHP_Token_DIV extends PHP_Token
+{
+}
+
+class PHP_Token_DIV_EQUAL extends PHP_Token
+{
+}
+
+class PHP_Token_DNUMBER extends PHP_Token
+{
+}
+
+class PHP_Token_DO extends PHP_Token
+{
+}
+
+class PHP_Token_DOC_COMMENT extends PHP_Token
+{
+}
+
+class PHP_Token_DOLLAR extends PHP_Token
+{
+}
+
+class PHP_Token_DOLLAR_OPEN_CURLY_BRACES extends PHP_Token
+{
+}
+
+class PHP_Token_DOT extends PHP_Token
+{
+}
+
+class PHP_Token_DOUBLE_ARROW extends PHP_Token
+{
+}
+
+class PHP_Token_DOUBLE_CAST extends PHP_Token
+{
+}
+
+class PHP_Token_DOUBLE_COLON extends PHP_Token
+{
+}
+
+class PHP_Token_DOUBLE_QUOTES extends PHP_Token
+{
+}
+
+class PHP_Token_ECHO extends PHP_Token
+{
+}
+
+class PHP_Token_ELSE extends PHP_Token
+{
+}
+
+class PHP_Token_ELSEIF extends PHP_Token
+{
+}
+
+class PHP_Token_EMPTY extends PHP_Token
+{
+}
+
+class PHP_Token_ENCAPSED_AND_WHITESPACE extends PHP_Token
+{
+}
+
+class PHP_Token_ENDDECLARE extends PHP_Token
+{
+}
+
+class PHP_Token_ENDFOR extends PHP_Token
+{
+}
+
+class PHP_Token_ENDFOREACH extends PHP_Token
+{
+}
+
+class PHP_Token_ENDIF extends PHP_Token
+{
+}
+
+class PHP_Token_ENDSWITCH extends PHP_Token
+{
+}
+
+class PHP_Token_ENDWHILE extends PHP_Token
+{
+}
+
+class PHP_Token_END_HEREDOC extends PHP_Token
+{
+}
+
+class PHP_Token_EQUAL extends PHP_Token
+{
+}
+
+class PHP_Token_EVAL extends PHP_Token
+{
+}
+
+class PHP_Token_EXCLAMATION_MARK extends PHP_Token
+{
+}
+
+class PHP_Token_EXIT extends PHP_Token
+{
+}
+
+class PHP_Token_EXTENDS extends PHP_Token
+{
+}
+
+class PHP_Token_FILE extends PHP_Token
+{
+}
+
+class PHP_Token_FINAL extends PHP_Token
+{
+}
+
+class PHP_Token_FOR extends PHP_Token
+{
+}
+
+class PHP_Token_FOREACH extends PHP_Token
+{
+}
+
+class PHP_Token_FUNC_C extends PHP_Token
+{
+}
+
+class PHP_Token_GLOBAL extends PHP_Token
+{
+}
+
+class PHP_Token_GT extends PHP_Token
+{
+}
+
+class PHP_Token_IF extends PHP_Token
+{
+}
+
+class PHP_Token_IMPLEMENTS extends PHP_Token
+{
+}
+
+class PHP_Token_INC extends PHP_Token
+{
+}
+
+class PHP_Token_INCLUDE extends PHP_Token_Includes
+{
+}
+
+class PHP_Token_INCLUDE_ONCE extends PHP_Token_Includes
+{
+}
+
+class PHP_Token_INLINE_HTML extends PHP_Token
+{
+}
+
+class PHP_Token_INSTANCEOF extends PHP_Token
+{
+}
+
+class PHP_Token_INT_CAST extends PHP_Token
+{
+}
+
+class PHP_Token_ISSET extends PHP_Token
+{
+}
+
+class PHP_Token_IS_EQUAL extends PHP_Token
+{
+}
+
+class PHP_Token_IS_GREATER_OR_EQUAL extends PHP_Token
+{
+}
+
+class PHP_Token_IS_IDENTICAL extends PHP_Token
+{
+}
+
+class PHP_Token_IS_NOT_EQUAL extends PHP_Token
+{
+}
+
+class PHP_Token_IS_NOT_IDENTICAL extends PHP_Token
+{
+}
+
+class PHP_Token_IS_SMALLER_OR_EQUAL extends PHP_Token
+{
+}
+
+class PHP_Token_LINE extends PHP_Token
+{
+}
+
+class PHP_Token_LIST extends PHP_Token
+{
+}
+
+class PHP_Token_LNUMBER extends PHP_Token
+{
+}
+
+class PHP_Token_LOGICAL_AND extends PHP_Token
+{
+}
+
+class PHP_Token_LOGICAL_OR extends PHP_Token
+{
+}
+
+class PHP_Token_LOGICAL_XOR extends PHP_Token
+{
+}
+
+class PHP_Token_LT extends PHP_Token
+{
+}
+
+class PHP_Token_METHOD_C extends PHP_Token
+{
+}
+
+class PHP_Token_MINUS extends PHP_Token
+{
+}
+
+class PHP_Token_MINUS_EQUAL extends PHP_Token
+{
+}
+
+class PHP_Token_MOD_EQUAL extends PHP_Token
+{
+}
+
+class PHP_Token_MULT extends PHP_Token
+{
+}
+
+class PHP_Token_MUL_EQUAL extends PHP_Token
+{
+}
+
+class PHP_Token_NEW extends PHP_Token
+{
+}
+
+class PHP_Token_NUM_STRING extends PHP_Token
+{
+}
+
+class PHP_Token_OBJECT_CAST extends PHP_Token
+{
+}
+
+class PHP_Token_OBJECT_OPERATOR extends PHP_Token
+{
+}
+
+class PHP_Token_OPEN_BRACKET extends PHP_Token
+{
+}
+
+class PHP_Token_OPEN_CURLY extends PHP_Token
+{
+}
+
+class PHP_Token_OPEN_SQUARE extends PHP_Token
+{
+}
+
+class PHP_Token_OPEN_TAG extends PHP_Token
+{
+}
+
+class PHP_Token_OPEN_TAG_WITH_ECHO extends PHP_Token
+{
+}
+
+class PHP_Token_OR_EQUAL extends PHP_Token
+{
+}
+
+class PHP_Token_PAAMAYIM_NEKUDOTAYIM extends PHP_Token
+{
+}
+
+class PHP_Token_PERCENT extends PHP_Token
+{
+}
+
+class PHP_Token_PIPE extends PHP_Token
+{
+}
+
+class PHP_Token_PLUS extends PHP_Token
+{
+}
+
+class PHP_Token_PLUS_EQUAL extends PHP_Token
+{
+}
+
+class PHP_Token_PRINT extends PHP_Token
+{
+}
+
+class PHP_Token_PRIVATE extends PHP_Token
+{
+}
+
+class PHP_Token_PROTECTED extends PHP_Token
+{
+}
+
+class PHP_Token_PUBLIC extends PHP_Token
+{
+}
+
+class PHP_Token_QUESTION_MARK extends PHP_Token
+{
+}
+
+class PHP_Token_REQUIRE extends PHP_Token_Includes
+{
+}
+
+class PHP_Token_REQUIRE_ONCE extends PHP_Token_Includes
+{
+}
+
+class PHP_Token_RETURN extends PHP_Token
+{
+}
+
+class PHP_Token_SEMICOLON extends PHP_Token
+{
+}
+
+class PHP_Token_SL extends PHP_Token
+{
+}
+
+class PHP_Token_SL_EQUAL extends PHP_Token
+{
+}
+
+class PHP_Token_SR extends PHP_Token
+{
+}
+
+class PHP_Token_SR_EQUAL extends PHP_Token
+{
+}
+
+class PHP_Token_START_HEREDOC extends PHP_Token
+{
+}
+
+class PHP_Token_STATIC extends PHP_Token
+{
+}
+
+class PHP_Token_STRING extends PHP_Token
+{
+}
+
+class PHP_Token_STRING_CAST extends PHP_Token
+{
+}
+
+class PHP_Token_STRING_VARNAME extends PHP_Token
+{
+}
+
+class PHP_Token_SWITCH extends PHP_Token
+{
+}
+
+class PHP_Token_THROW extends PHP_Token
+{
+}
+
+class PHP_Token_TILDE extends PHP_Token
+{
+}
+
+class PHP_Token_TRY extends PHP_Token
+{
+}
+
+class PHP_Token_UNSET extends PHP_Token
+{
+}
+
+class PHP_Token_UNSET_CAST extends PHP_Token
+{
+}
+
+class PHP_Token_USE extends PHP_Token
+{
+}
+
+class PHP_Token_USE_FUNCTION extends PHP_Token
+{
+}
+
+class PHP_Token_VAR extends PHP_Token
+{
+}
+
+class PHP_Token_VARIABLE extends PHP_Token
+{
+}
+
+class PHP_Token_WHILE extends PHP_Token
+{
+}
+
+class PHP_Token_WHITESPACE extends PHP_Token
+{
+}
+
+class PHP_Token_XOR_EQUAL extends PHP_Token
+{
+}
+
+// Tokens introduced in PHP 5.1
+class PHP_Token_HALT_COMPILER extends PHP_Token
+{
+}
+
+// Tokens introduced in PHP 5.3
+class PHP_Token_DIR extends PHP_Token
+{
+}
+
+class PHP_Token_GOTO extends PHP_Token
+{
+}
+
+class PHP_Token_NAMESPACE extends PHP_TokenWithScope
+{
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        $tokens    = $this->tokenStream->tokens();
+        $namespace = (string) $tokens[$this->id + 2];
+
+        for ($i = $this->id + 3;; $i += 2) {
+            if (isset($tokens[$i]) &&
+                $tokens[$i] instanceof PHP_Token_NS_SEPARATOR) {
+                $namespace .= '\\' . $tokens[$i + 1];
+            } else {
+                break;
+            }
+        }
+
+        return $namespace;
+    }
+}
+
+class PHP_Token_NS_C extends PHP_Token
+{
+}
+
+class PHP_Token_NS_SEPARATOR extends PHP_Token
+{
+}
+
+// Tokens introduced in PHP 5.4
+class PHP_Token_CALLABLE extends PHP_Token
+{
+}
+
+class PHP_Token_INSTEADOF extends PHP_Token
+{
+}
+
+class PHP_Token_TRAIT extends PHP_Token_INTERFACE
+{
+}
+
+class PHP_Token_TRAIT_C extends PHP_Token
+{
+}
+
+// Tokens introduced in PHP 5.5
+class PHP_Token_FINALLY extends PHP_Token
+{
+}
+
+class PHP_Token_YIELD extends PHP_Token
+{
+}
+
+// Tokens introduced in PHP 5.6
+class PHP_Token_ELLIPSIS extends PHP_Token
+{
+}
+
+class PHP_Token_POW extends PHP_Token
+{
+}
+
+class PHP_Token_POW_EQUAL extends PHP_Token
+{
+}
+
+// Tokens introduced in PHP 7.0
+class PHP_Token_COALESCE extends PHP_Token
+{
+}
+
+class PHP_Token_SPACESHIP extends PHP_Token
+{
+}
+
+class PHP_Token_YIELD_FROM extends PHP_Token
+{
+}
+
+// Tokens introduced in HackLang / HHVM
+class PHP_Token_ASYNC extends PHP_Token
+{
+}
+
+class PHP_Token_AWAIT extends PHP_Token
+{
+}
+
+class PHP_Token_COMPILER_HALT_OFFSET extends PHP_Token
+{
+}
+
+class PHP_Token_ENUM extends PHP_Token
+{
+}
+
+class PHP_Token_EQUALS extends PHP_Token
+{
+}
+
+class PHP_Token_IN extends PHP_Token
+{
+}
+
+class PHP_Token_JOIN extends PHP_Token
+{
+}
+
+class PHP_Token_LAMBDA_ARROW extends PHP_Token
+{
+}
+
+class PHP_Token_LAMBDA_CP extends PHP_Token
+{
+}
+
+class PHP_Token_LAMBDA_OP extends PHP_Token
+{
+}
+
+class PHP_Token_ONUMBER extends PHP_Token
+{
+}
+
+class PHP_Token_NULLSAFE_OBJECT_OPERATOR extends PHP_Token
+{
+}
+
+class PHP_Token_SHAPE extends PHP_Token
+{
+}
+
+class PHP_Token_SUPER extends PHP_Token
+{
+}
+
+class PHP_Token_TYPE extends PHP_Token
+{
+}
+
+class PHP_Token_TYPELIST_GT extends PHP_Token
+{
+}
+
+class PHP_Token_TYPELIST_LT extends PHP_Token
+{
+}
+
+class PHP_Token_WHERE extends PHP_Token
+{
+}
+
+class PHP_Token_XHP_ATTRIBUTE extends PHP_Token
+{
+}
+
+class PHP_Token_XHP_CATEGORY extends PHP_Token
+{
+}
+
+class PHP_Token_XHP_CATEGORY_LABEL extends PHP_Token
+{
+}
+
+class PHP_Token_XHP_CHILDREN extends PHP_Token
+{
+}
+
+class PHP_Token_XHP_LABEL extends PHP_Token
+{
+}
+
+class PHP_Token_XHP_REQUIRED extends PHP_Token
+{
+}
+
+class PHP_Token_XHP_TAG_GT extends PHP_Token
+{
+}
+
+class PHP_Token_XHP_TAG_LT extends PHP_Token
+{
+}
+
+class PHP_Token_XHP_TEXT extends PHP_Token
+{
+}
diff --git a/vendor/phpunit/php-token-stream/src/Token/Stream.php b/vendor/phpunit/php-token-stream/src/Token/Stream.php
index aff7e3d4daa1dee1d13d7314e0055a47dcb9527e..4d9bf1bcf09399cba73b2c6f467dc5a7bf420d61 100644
--- a/vendor/phpunit/php-token-stream/src/Token/Stream.php
+++ b/vendor/phpunit/php-token-stream/src/Token/Stream.php
@@ -1,6 +1,6 @@
 <?php
 /*
- * This file is part of the PHP_TokenStream package.
+ * This file is part of php-token-stream.
  *
  * (c) Sebastian Bergmann <sebastian@phpunit.de>
  *
@@ -10,19 +10,13 @@
 
 /**
  * A stream of PHP tokens.
- *
- * @author    Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license   http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
- * @link      http://github.com/sebastianbergmann/php-token-stream/tree
- * @since     Class available since Release 1.0.0
  */
 class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
 {
     /**
      * @var array
      */
-    protected static $customTokens = array(
+    protected static $customTokens = [
         '(' => 'PHP_Token_OPEN_BRACKET',
         ')' => 'PHP_Token_CLOSE_BRACKET',
         '[' => 'PHP_Token_OPEN_SQUARE',
@@ -51,7 +45,7 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
         '^' => 'PHP_Token_CARET',
         '~' => 'PHP_Token_TILDE',
         '`' => 'PHP_Token_BACKTICK'
-    );
+    ];
 
     /**
      * @var string
@@ -61,17 +55,17 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
     /**
      * @var array
      */
-    protected $tokens = array();
+    protected $tokens = [];
 
     /**
-     * @var integer
+     * @var int
      */
     protected $position = 0;
 
     /**
      * @var array
      */
-    protected $linesOfCode = array('loc' => 0, 'cloc' => 0, 'ncloc' => 0);
+    protected $linesOfCode = ['loc' => 0, 'cloc' => 0, 'ncloc' => 0];
 
     /**
      * @var array
@@ -101,7 +95,7 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
     /**
      * @var array
      */
-    protected $lineToFunctionMap = array();
+    protected $lineToFunctionMap = [];
 
     /**
      * Constructor.
@@ -123,7 +117,7 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
      */
     public function __destruct()
     {
-        $this->tokens = array();
+        $this->tokens = [];
     }
 
     /**
@@ -142,7 +136,6 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
 
     /**
      * @return string
-     * @since  Method available since Release 1.1.0
      */
     public function getFilename()
     {
@@ -174,7 +167,7 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
 
                 if ($lastNonWhitespaceTokenWasDoubleColon && $name == 'CLASS') {
                     $name = 'CLASS_NAME_CONSTANT';
-                } elseif ($name == 'USE' && isset($tokens[$i+2][0]) && $tokens[$i+2][0] == T_FUNCTION) {
+                } elseif ($name == 'USE' && isset($tokens[$i + 2][0]) && $tokens[$i + 2][0] == T_FUNCTION) {
                     $name = 'USE_FUNCTION';
                     $skip = 2;
                 }
@@ -187,7 +180,7 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
 
             $this->tokens[] = new $tokenClass($text, $line, $this, $id++);
             $lines          = substr_count($text, "\n");
-            $line          += $lines;
+            $line += $lines;
 
             if ($tokenClass == 'PHP_Token_HALT_COMPILER') {
                 break;
@@ -211,7 +204,7 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
     }
 
     /**
-     * @return integer
+     * @return int
      */
     public function count()
     {
@@ -270,7 +263,6 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
 
     /**
      * @return array
-     * @since  Method available since Release 1.1.0
      */
     public function getTraits()
     {
@@ -295,19 +287,19 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
      *
      * @param bool   $categorize OPTIONAL
      * @param string $category   OPTIONAL Either 'require_once', 'require',
-     *                                           'include_once', 'include'.
+     *                           'include_once', 'include'.
+     *
      * @return array
-     * @since  Method available since Release 1.1.0
      */
     public function getIncludes($categorize = false, $category = null)
     {
         if ($this->includes === null) {
-            $this->includes = array(
-              'require_once' => array(),
-              'require'      => array(),
-              'include_once' => array(),
-              'include'      => array()
-            );
+            $this->includes = [
+              'require_once' => [],
+              'require'      => [],
+              'include_once' => [],
+              'include'      => []
+            ];
 
             foreach ($this->tokens as $token) {
                 switch (get_class($token)) {
@@ -341,7 +333,6 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
      * Returns the name of the function or method a line belongs to.
      *
      * @return string or null if the line is not in a function or method
-     * @since  Method available since Release 1.2.0
      */
     public function getFunctionForLine($line)
     {
@@ -354,12 +345,12 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
 
     protected function parse()
     {
-        $this->interfaces = array();
-        $this->classes    = array();
-        $this->traits     = array();
-        $this->functions  = array();
-        $class            = array();
-        $classEndLine     = array();
+        $this->interfaces = [];
+        $this->classes    = [];
+        $this->traits     = [];
+        $this->functions  = [];
+        $class            = [];
+        $classEndLine     = [];
         $trait            = false;
         $traitEndLine     = false;
         $interface        = false;
@@ -374,8 +365,8 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
                     $interface        = $token->getName();
                     $interfaceEndLine = $token->getEndLine();
 
-                    $this->interfaces[$interface] = array(
-                      'methods'   => array(),
+                    $this->interfaces[$interface] = [
+                      'methods'   => [],
                       'parent'    => $token->getParent(),
                       'keywords'  => $token->getKeywords(),
                       'docblock'  => $token->getDocblock(),
@@ -383,13 +374,13 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
                       'endLine'   => $interfaceEndLine,
                       'package'   => $token->getPackage(),
                       'file'      => $this->filename
-                    );
+                    ];
                     break;
 
                 case 'PHP_Token_CLASS':
                 case 'PHP_Token_TRAIT':
-                    $tmp = array(
-                      'methods'   => array(),
+                    $tmp = [
+                      'methods'   => [],
                       'parent'    => $token->getParent(),
                       'interfaces'=> $token->getInterfaces(),
                       'keywords'  => $token->getKeywords(),
@@ -398,15 +389,13 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
                       'endLine'   => $token->getEndLine(),
                       'package'   => $token->getPackage(),
                       'file'      => $this->filename
-                    );
+                    ];
 
                     if ($token instanceof PHP_Token_CLASS) {
                         $class[]        = $token->getName();
                         $classEndLine[] = $token->getEndLine();
 
-                        if ($class[count($class)-1] != 'anonymous class') {
-                            $this->classes[$class[count($class)-1]] = $tmp;
-                        }
+                        $this->classes[$class[count($class) - 1]] = $tmp;
                     } else {
                         $trait                = $token->getName();
                         $traitEndLine         = $token->getEndLine();
@@ -416,7 +405,7 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
 
                 case 'PHP_Token_FUNCTION':
                     $name = $token->getName();
-                    $tmp  = array(
+                    $tmp  = [
                       'docblock'  => $token->getDocblock(),
                       'keywords'  => $token->getKeywords(),
                       'visibility'=> $token->getVisibility(),
@@ -425,7 +414,7 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
                       'endLine'   => $token->getEndLine(),
                       'ccn'       => $token->getCCN(),
                       'file'      => $this->filename
-                    );
+                    ];
 
                     if (empty($class) &&
                         $trait === false &&
@@ -437,11 +426,11 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
                             $tmp['startLine'],
                             $tmp['endLine']
                         );
-                    } elseif (!empty($class) && $class[count($class)-1] != 'anonymous class') {
-                        $this->classes[$class[count($class)-1]]['methods'][$name] = $tmp;
+                    } elseif (!empty($class)) {
+                        $this->classes[$class[count($class) - 1]]['methods'][$name] = $tmp;
 
                         $this->addFunctionToMap(
-                            $class[count($class)-1] . '::' . $name,
+                            $class[count($class) - 1] . '::' . $name,
                             $tmp['startLine'],
                             $tmp['endLine']
                         );
@@ -460,7 +449,7 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
 
                 case 'PHP_Token_CLOSE_CURLY':
                     if (!empty($classEndLine) &&
-                        $classEndLine[count($classEndLine)-1] == $token->getLine()) {
+                        $classEndLine[count($classEndLine) - 1] == $token->getLine()) {
                         array_pop($classEndLine);
                         array_pop($class);
                     } elseif ($traitEndLine !== false &&
@@ -493,7 +482,7 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
     }
 
     /**
-     * @return boolean
+     * @return bool
      */
     public function valid()
     {
@@ -501,7 +490,7 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
     }
 
     /**
-     * @return integer
+     * @return int
      */
     public function key()
     {
@@ -524,8 +513,9 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
     }
 
     /**
-     * @param  integer $offset
-     * @return boolean
+     * @param int $offset
+     *
+     * @return bool
      */
     public function offsetExists($offset)
     {
@@ -533,8 +523,10 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
     }
 
     /**
-     * @param  integer $offset
+     * @param int $offset
+     *
      * @return mixed
+     *
      * @throws OutOfBoundsException
      */
     public function offsetGet($offset)
@@ -552,8 +544,8 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
     }
 
     /**
-     * @param integer $offset
-     * @param mixed   $value
+     * @param int   $offset
+     * @param mixed $value
      */
     public function offsetSet($offset, $value)
     {
@@ -561,7 +553,8 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
     }
 
     /**
-     * @param  integer $offset
+     * @param int $offset
+     *
      * @throws OutOfBoundsException
      */
     public function offsetUnset($offset)
@@ -581,7 +574,8 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
     /**
      * Seek to an absolute position.
      *
-     * @param  integer $position
+     * @param int $position
+     *
      * @throws OutOfBoundsException
      */
     public function seek($position)
@@ -599,9 +593,9 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
     }
 
     /**
-     * @param string  $name
-     * @param integer $startLine
-     * @param integer $endLine
+     * @param string $name
+     * @param int    $startLine
+     * @param int    $endLine
      */
     private function addFunctionToMap($name, $startLine, $endLine)
     {
diff --git a/vendor/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php b/vendor/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php
index b41b25f608b6971b3cff192b6e02bc4d2875c4e5..9d693938a87632d72ab4a9fff559723278305417 100644
--- a/vendor/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php
+++ b/vendor/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php
@@ -1,6 +1,6 @@
 <?php
 /*
- * This file is part of the PHP_TokenStream package.
+ * This file is part of php-token-stream.
  *
  * (c) Sebastian Bergmann <sebastian@phpunit.de>
  *
@@ -10,22 +10,17 @@
 
 /**
  * A caching factory for token stream objects.
- *
- * @author    Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright Sebastian Bergmann <sebastian@phpunit.de>
- * @license   http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
- * @link      http://github.com/sebastianbergmann/php-token-stream/tree
- * @since     Class available since Release 1.0.0
  */
 class PHP_Token_Stream_CachingFactory
 {
     /**
      * @var array
      */
-    protected static $cache = array();
+    protected static $cache = [];
 
     /**
-     * @param  string $filename
+     * @param string $filename
+     *
      * @return PHP_Token_Stream
      */
     public static function get($filename)
@@ -45,7 +40,7 @@ class PHP_Token_Stream_CachingFactory
         if (is_string($filename)) {
             unset(self::$cache[$filename]);
         } else {
-            self::$cache = array();
+            self::$cache = [];
         }
     }
 }
diff --git a/vendor/phpunit/php-token-stream/tests/Token/ClassTest.php b/vendor/phpunit/php-token-stream/tests/Token/ClassTest.php
index d1b25d839a5d43e21c48f8e3d23d16523a028217..811a8524558644583a248e13dae662831b5d5ad9 100644
--- a/vendor/phpunit/php-token-stream/tests/Token/ClassTest.php
+++ b/vendor/phpunit/php-token-stream/tests/Token/ClassTest.php
@@ -1,6 +1,6 @@
 <?php
 /*
- * This file is part of the PHP_TokenStream package.
+ * This file is part of php-token-stream.
  *
  * (c) Sebastian Bergmann <sebastian@phpunit.de>
  *
@@ -8,22 +8,19 @@
  * file that was distributed with this source code.
  */
 
-/**
- * Tests for the PHP_Token_CLASS class.
- *
- * @package    PHP_TokenStream
- * @subpackage Tests
- * @author     Laurent Laville <pear@laurent-laville.org>
- * @copyright  Sebastian Bergmann <sebastian@phpunit.de>
- * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
- * @version    Release: @package_version@
- * @link       http://github.com/sebastianbergmann/php-token-stream/
- * @since      Class available since Release 1.0.2
- */
-class PHP_Token_ClassTest extends PHPUnit_Framework_TestCase
+use PHPUnit\Framework\TestCase;
+
+class PHP_Token_ClassTest extends TestCase
 {
-    protected $class;
-    protected $function;
+    /**
+     * @var PHP_Token_CLASS
+     */
+    private $class;
+
+    /**
+     * @var PHP_Token_FUNCTION
+     */
+    private $function;
 
     protected function setUp()
     {
@@ -82,21 +79,27 @@ class PHP_Token_ClassTest extends PHPUnit_Framework_TestCase
         $this->assertCount(1, $ts->getClasses());
     }
 
-    /**
-     * @requires PHP 7
-     */
     public function testAnonymousClassesAreHandledCorrectly()
     {
         $ts = new PHP_Token_Stream(TEST_FILES_PATH . 'class_with_method_that_declares_anonymous_class.php');
 
         $classes = $ts->getClasses();
 
-        $this->assertEquals(array('class_with_method_that_declares_anonymous_class'), array_keys($classes));
+        $this->assertEquals(
+            [
+                'class_with_method_that_declares_anonymous_class',
+                'AnonymousClass:9#31',
+                'AnonymousClass:10#55',
+                'AnonymousClass:11#75',
+                'AnonymousClass:12#91',
+                'AnonymousClass:13#107'
+            ],
+            array_keys($classes)
+        );
     }
 
     /**
-     * @requires PHP 7
-     * @ticket   https://github.com/sebastianbergmann/php-token-stream/issues/52
+     * @ticket https://github.com/sebastianbergmann/php-token-stream/issues/52
      */
     public function testAnonymousClassesAreHandledCorrectly2()
     {
@@ -104,15 +107,12 @@ class PHP_Token_ClassTest extends PHPUnit_Framework_TestCase
 
         $classes = $ts->getClasses();
 
-        $this->assertEquals(array('Test'), array_keys($classes));
-        $this->assertEquals(array('methodOne', 'methodTwo'), array_keys($classes['Test']['methods']));
+        $this->assertEquals(['Test', 'AnonymousClass:4#23'], array_keys($classes));
+        $this->assertEquals(['methodOne', 'methodTwo'], array_keys($classes['Test']['methods']));
 
         $this->assertEmpty($ts->getFunctions());
     }
 
-    /**
-     * @requires PHP 5.6
-     */
     public function testImportedFunctionsAreHandledCorrectly()
     {
         $ts = new PHP_Token_Stream(TEST_FILES_PATH . 'classUsesNamespacedFunction.php');
@@ -120,4 +120,34 @@ class PHP_Token_ClassTest extends PHPUnit_Framework_TestCase
         $this->assertEmpty($ts->getFunctions());
         $this->assertCount(1, $ts->getClasses());
     }
+
+    /**
+     * @ticket https://github.com/sebastianbergmann/php-code-coverage/issues/543
+     */
+    public function testClassWithMultipleAnonymousClassesAndFunctionsIsHandledCorrectly()
+    {
+        $ts = new PHP_Token_Stream(TEST_FILES_PATH . 'class_with_multiple_anonymous_classes_and_functions.php');
+
+        $classes = $ts->getClasses();
+
+        $this->assertArrayHasKey('class_with_multiple_anonymous_classes_and_functions', $classes);
+        $this->assertArrayHasKey('AnonymousClass:6#23', $classes);
+        $this->assertArrayHasKey('AnonymousClass:12#53', $classes);
+        $this->assertArrayHasKey('m', $classes['class_with_multiple_anonymous_classes_and_functions']['methods']);
+        $this->assertArrayHasKey('anonymousFunction:18#81', $classes['class_with_multiple_anonymous_classes_and_functions']['methods']);
+        $this->assertArrayHasKey('anonymousFunction:22#108', $classes['class_with_multiple_anonymous_classes_and_functions']['methods']);
+    }
+
+    /**
+     * @ticket https://github.com/sebastianbergmann/php-token-stream/issues/68
+     */
+    public function testClassWithMethodNamedEmptyIsHandledCorrectly()
+    {
+        $ts = new PHP_Token_Stream(TEST_FILES_PATH . 'class_with_method_named_empty.php');
+
+        $classes = $ts->getClasses();
+
+        $this->assertArrayHasKey('class_with_method_named_empty', $classes);
+        $this->assertArrayHasKey('empty', $classes['class_with_method_named_empty']['methods']);
+    }
 }
diff --git a/vendor/phpunit/php-token-stream/tests/Token/ClosureTest.php b/vendor/phpunit/php-token-stream/tests/Token/ClosureTest.php
index f1e508cf264a51af60ec77d89baaa3549da976d8..b4a67356d8625a94fa61fae9d6a9ade566272e35 100644
--- a/vendor/phpunit/php-token-stream/tests/Token/ClosureTest.php
+++ b/vendor/phpunit/php-token-stream/tests/Token/ClosureTest.php
@@ -1,6 +1,6 @@
 <?php
 /*
- * This file is part of the PHP_TokenStream package.
+ * This file is part of php-token-stream.
  *
  * (c) Sebastian Bergmann <sebastian@phpunit.de>
  *
@@ -8,21 +8,14 @@
  * file that was distributed with this source code.
  */
 
-/**
- * Tests for the PHP_Token_FUNCTION class.
- *
- * @package    PHP_TokenStream
- * @subpackage Tests
- * @author     Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright  Sebastian Bergmann <sebastian@phpunit.de>
- * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
- * @version    Release: @package_version@
- * @link       http://github.com/sebastianbergmann/php-token-stream/
- * @since      Class available since Release 1.0.0
- */
-class PHP_Token_ClosureTest extends PHPUnit_Framework_TestCase
+use PHPUnit\Framework\TestCase;
+
+class PHP_Token_ClosureTest extends TestCase
 {
-    protected $functions;
+    /**
+     * @var PHP_Token_FUNCTION[]
+     */
+    private $functions;
 
     protected function setUp()
     {
@@ -40,12 +33,12 @@ class PHP_Token_ClosureTest extends PHPUnit_Framework_TestCase
      */
     public function testGetArguments()
     {
-        $this->assertEquals(array('$foo' => null, '$bar' => null), $this->functions[0]->getArguments());
-        $this->assertEquals(array('$foo' => 'Foo', '$bar' => null), $this->functions[1]->getArguments());
-        $this->assertEquals(array('$foo' => null, '$bar' => null, '$baz' => null), $this->functions[2]->getArguments());
-        $this->assertEquals(array('$foo' => 'Foo', '$bar' => null, '$baz' => null), $this->functions[3]->getArguments());
-        $this->assertEquals(array(), $this->functions[4]->getArguments());
-        $this->assertEquals(array(), $this->functions[5]->getArguments());
+        $this->assertEquals(['$foo' => null, '$bar' => null], $this->functions[0]->getArguments());
+        $this->assertEquals(['$foo' => 'Foo', '$bar' => null], $this->functions[1]->getArguments());
+        $this->assertEquals(['$foo' => null, '$bar' => null, '$baz' => null], $this->functions[2]->getArguments());
+        $this->assertEquals(['$foo' => 'Foo', '$bar' => null, '$baz' => null], $this->functions[3]->getArguments());
+        $this->assertEquals([], $this->functions[4]->getArguments());
+        $this->assertEquals([], $this->functions[5]->getArguments());
     }
 
     /**
@@ -53,12 +46,12 @@ class PHP_Token_ClosureTest extends PHPUnit_Framework_TestCase
      */
     public function testGetName()
     {
-        $this->assertEquals('anonymous function', $this->functions[0]->getName());
-        $this->assertEquals('anonymous function', $this->functions[1]->getName());
-        $this->assertEquals('anonymous function', $this->functions[2]->getName());
-        $this->assertEquals('anonymous function', $this->functions[3]->getName());
-        $this->assertEquals('anonymous function', $this->functions[4]->getName());
-        $this->assertEquals('anonymous function', $this->functions[5]->getName());
+        $this->assertEquals('anonymousFunction:2#5', $this->functions[0]->getName());
+        $this->assertEquals('anonymousFunction:3#27', $this->functions[1]->getName());
+        $this->assertEquals('anonymousFunction:4#51', $this->functions[2]->getName());
+        $this->assertEquals('anonymousFunction:5#71', $this->functions[3]->getName());
+        $this->assertEquals('anonymousFunction:6#93', $this->functions[4]->getName());
+        $this->assertEquals('anonymousFunction:7#106', $this->functions[5]->getName());
     }
 
     /**
diff --git a/vendor/phpunit/php-token-stream/tests/Token/FunctionTest.php b/vendor/phpunit/php-token-stream/tests/Token/FunctionTest.php
index 4f23c39d8f2e650153e512647fcc9ff06a083692..539f827c1345a95d2fe046c96547cb363386db2c 100644
--- a/vendor/phpunit/php-token-stream/tests/Token/FunctionTest.php
+++ b/vendor/phpunit/php-token-stream/tests/Token/FunctionTest.php
@@ -1,6 +1,6 @@
 <?php
 /*
- * This file is part of the PHP_TokenStream package.
+ * This file is part of php-token-stream.
  *
  * (c) Sebastian Bergmann <sebastian@phpunit.de>
  *
@@ -8,21 +8,14 @@
  * file that was distributed with this source code.
  */
 
-/**
- * Tests for the PHP_Token_FUNCTION class.
- *
- * @package    PHP_TokenStream
- * @subpackage Tests
- * @author     Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright  Sebastian Bergmann <sebastian@phpunit.de>
- * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
- * @version    Release: @package_version@
- * @link       http://github.com/sebastianbergmann/php-token-stream/
- * @since      Class available since Release 1.0.0
- */
-class PHP_Token_FunctionTest extends PHPUnit_Framework_TestCase
+use PHPUnit\Framework\TestCase;
+
+class PHP_Token_FunctionTest extends TestCase
 {
-    protected $functions;
+    /**
+     * @var PHP_Token_FUNCTION[]
+     */
+    private $functions;
 
     protected function setUp()
     {
@@ -40,23 +33,23 @@ class PHP_Token_FunctionTest extends PHPUnit_Framework_TestCase
      */
     public function testGetArguments()
     {
-        $this->assertEquals(array(), $this->functions[0]->getArguments());
+        $this->assertEquals([], $this->functions[0]->getArguments());
 
         $this->assertEquals(
-          array('$baz' => 'Baz'), $this->functions[1]->getArguments()
+          ['$baz' => 'Baz'], $this->functions[1]->getArguments()
         );
 
         $this->assertEquals(
-          array('$foobar' => 'Foobar'), $this->functions[2]->getArguments()
+          ['$foobar' => 'Foobar'], $this->functions[2]->getArguments()
         );
 
         $this->assertEquals(
-          array('$barfoo' => 'Barfoo'), $this->functions[3]->getArguments()
+          ['$barfoo' => 'Barfoo'], $this->functions[3]->getArguments()
         );
 
-        $this->assertEquals(array(), $this->functions[4]->getArguments());
+        $this->assertEquals([], $this->functions[4]->getArguments());
 
-        $this->assertEquals(array('$x' => null, '$y' => null), $this->functions[5]->getArguments());
+        $this->assertEquals(['$x' => null, '$y' => null], $this->functions[5]->getArguments());
     }
 
     /**
diff --git a/vendor/phpunit/php-token-stream/tests/Token/IncludeTest.php b/vendor/phpunit/php-token-stream/tests/Token/IncludeTest.php
index 1e43351292175d187e2e79522164b38ece3fd448..2056d122ab263a6418e7c3e0434024a018d8c290 100644
--- a/vendor/phpunit/php-token-stream/tests/Token/IncludeTest.php
+++ b/vendor/phpunit/php-token-stream/tests/Token/IncludeTest.php
@@ -1,6 +1,6 @@
 <?php
 /*
- * This file is part of the PHP_TokenStream package.
+ * This file is part of php-token-stream.
  *
  * (c) Sebastian Bergmann <sebastian@phpunit.de>
  *
@@ -8,22 +8,14 @@
  * file that was distributed with this source code.
  */
 
-/**
- * Tests for the PHP_Token_REQUIRE_ONCE, PHP_Token_REQUIRE
- * PHP_Token_INCLUDE_ONCE and PHP_Token_INCLUDE_ONCE classes.
- *
- * @package    PHP_TokenStream
- * @subpackage Tests
- * @author     Laurent Laville <pear@laurent-laville.org>
- * @copyright  Sebastian Bergmann <sebastian@phpunit.de>
- * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
- * @version    Release: @package_version@
- * @link       http://github.com/sebastianbergmann/php-token-stream/
- * @since      Class available since Release 1.0.2
- */
-class PHP_Token_IncludeTest extends PHPUnit_Framework_TestCase
+use PHPUnit\Framework\TestCase;
+
+class PHP_Token_IncludeTest extends TestCase
 {
-    protected $ts;
+    /**
+     * @var PHP_Token_Stream
+     */
+    private $ts;
 
     protected function setUp()
     {
@@ -37,7 +29,7 @@ class PHP_Token_IncludeTest extends PHPUnit_Framework_TestCase
     public function testGetIncludes()
     {
         $this->assertSame(
-          array('test4.php', 'test3.php', 'test2.php', 'test1.php'),
+          ['test4.php', 'test3.php', 'test2.php', 'test1.php'],
           $this->ts->getIncludes()
         );
     }
@@ -49,13 +41,13 @@ class PHP_Token_IncludeTest extends PHPUnit_Framework_TestCase
     public function testGetIncludesCategorized()
     {
         $this->assertSame(
-          array(
-            'require_once' => array('test4.php'),
-            'require'      => array('test3.php'),
-            'include_once' => array('test2.php'),
-            'include'      => array('test1.php')
-          ),
-          $this->ts->getIncludes(TRUE)
+          [
+            'require_once' => ['test4.php'],
+            'require'      => ['test3.php'],
+            'include_once' => ['test2.php'],
+            'include'      => ['test1.php']
+          ],
+          $this->ts->getIncludes(true)
         );
     }
 
@@ -66,8 +58,8 @@ class PHP_Token_IncludeTest extends PHPUnit_Framework_TestCase
     public function testGetIncludesCategory()
     {
         $this->assertSame(
-          array('test4.php'),
-          $this->ts->getIncludes(TRUE, 'require_once')
+          ['test4.php'],
+          $this->ts->getIncludes(true, 'require_once')
         );
     }
 }
diff --git a/vendor/phpunit/php-token-stream/tests/Token/InterfaceTest.php b/vendor/phpunit/php-token-stream/tests/Token/InterfaceTest.php
index 56caede2afa9988b64041acefc806b8bea927725..9e8cb248e2100659d6f97178beb76d2dcc20b8e4 100644
--- a/vendor/phpunit/php-token-stream/tests/Token/InterfaceTest.php
+++ b/vendor/phpunit/php-token-stream/tests/Token/InterfaceTest.php
@@ -1,6 +1,6 @@
 <?php
 /*
- * This file is part of the PHP_TokenStream package.
+ * This file is part of php-token-stream.
  *
  * (c) Sebastian Bergmann <sebastian@phpunit.de>
  *
@@ -8,33 +8,29 @@
  * file that was distributed with this source code.
  */
 
-/**
- * Tests for the PHP_Token_INTERFACE class.
- *
- * @package    PHP_TokenStream
- * @subpackage Tests
- * @author     Sebastian Bergmann <sebastian@phpunit.de>
- * @author     Laurent Laville <pear@laurent-laville.org>
- * @copyright  Sebastian Bergmann <sebastian@phpunit.de>
- * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
- * @version    Release: @package_version@
- * @link       http://github.com/sebastianbergmann/php-token-stream/
- * @since      Class available since Release 1.0.0
- */
-class PHP_Token_InterfaceTest extends PHPUnit_Framework_TestCase
+use PHPUnit\Framework\TestCase;
+
+class PHP_Token_InterfaceTest extends TestCase
 {
-    protected $class;
-    protected $interfaces;
+    /**
+     * @var PHP_Token_CLASS
+     */
+    private $class;
+
+    /**
+     * @var PHP_Token_INTERFACE[]
+     */
+    private $interfaces;
 
     protected function setUp()
     {
         $ts = new PHP_Token_Stream(TEST_FILES_PATH . 'source4.php');
         $i  = 0;
+
         foreach ($ts as $token) {
             if ($token instanceof PHP_Token_CLASS) {
                 $this->class = $token;
-            }
-            elseif ($token instanceof PHP_Token_INTERFACE) {
+            } elseif ($token instanceof PHP_Token_INTERFACE) {
                 $this->interfaces[$i] = $token;
                 $i++;
             }
@@ -97,7 +93,7 @@ class PHP_Token_InterfaceTest extends PHPUnit_Framework_TestCase
     public function testGetInterfacesExists()
     {
         $this->assertEquals(
-            array('b'),
+            ['b'],
             $this->class->getInterfaces()
         );
     }
@@ -111,13 +107,15 @@ class PHP_Token_InterfaceTest extends PHPUnit_Framework_TestCase
             $this->class->hasInterfaces()
         );
     }
+
     /**
      * @covers PHP_Token_INTERFACE::getPackage
      */
-    public function testGetPackageNamespace() {
+    public function testGetPackageNamespace()
+    {
         $tokenStream = new PHP_Token_Stream(TEST_FILES_PATH . 'classInNamespace.php');
-        foreach($tokenStream as $token) {
-            if($token instanceOf PHP_Token_INTERFACE) {
+        foreach ($tokenStream as $token) {
+            if ($token instanceof PHP_Token_INTERFACE) {
                 $package = $token->getPackage();
                 $this->assertSame('Foo\\Bar', $package['namespace']);
             }
@@ -125,22 +123,24 @@ class PHP_Token_InterfaceTest extends PHPUnit_Framework_TestCase
     }
 
 
-    public function provideFilesWithClassesWithinMultipleNamespaces() {
-        return array(
-            array(TEST_FILES_PATH . 'multipleNamespacesWithOneClassUsingBraces.php'),
-            array(TEST_FILES_PATH . 'multipleNamespacesWithOneClassUsingNonBraceSyntax.php'),
-        );
+    public function provideFilesWithClassesWithinMultipleNamespaces()
+    {
+        return [
+            [TEST_FILES_PATH . 'multipleNamespacesWithOneClassUsingBraces.php'],
+            [TEST_FILES_PATH . 'multipleNamespacesWithOneClassUsingNonBraceSyntax.php'],
+        ];
     }
 
     /**
      * @dataProvider provideFilesWithClassesWithinMultipleNamespaces
      * @covers PHP_Token_INTERFACE::getPackage
      */
-    public function testGetPackageNamespaceForFileWithMultipleNamespaces($filepath) {
-        $tokenStream = new PHP_Token_Stream($filepath);
+    public function testGetPackageNamespaceForFileWithMultipleNamespaces($filepath)
+    {
+        $tokenStream     = new PHP_Token_Stream($filepath);
         $firstClassFound = false;
-        foreach($tokenStream as $token) {
-            if($firstClassFound === false && $token instanceOf PHP_Token_INTERFACE) {
+        foreach ($tokenStream as $token) {
+            if ($firstClassFound === false && $token instanceof PHP_Token_INTERFACE) {
                 $package = $token->getPackage();
                 $this->assertSame('TestClassInBar', $token->getName());
                 $this->assertSame('Foo\\Bar', $package['namespace']);
@@ -148,44 +148,48 @@ class PHP_Token_InterfaceTest extends PHPUnit_Framework_TestCase
                 continue;
             }
             // Secound class
-            if($token instanceOf PHP_Token_INTERFACE) {
+            if ($token instanceof PHP_Token_INTERFACE) {
                 $package = $token->getPackage();
                 $this->assertSame('TestClassInBaz', $token->getName());
                 $this->assertSame('Foo\\Baz', $package['namespace']);
+
                 return;
             }
         }
-        $this->fail("Seachring for 2 classes failed");
+        $this->fail('Seachring for 2 classes failed');
     }
 
-    public function testGetPackageNamespaceIsEmptyForInterfacesThatAreNotWithinNamespaces() {
-        foreach($this->interfaces as $token) {
+    public function testGetPackageNamespaceIsEmptyForInterfacesThatAreNotWithinNamespaces()
+    {
+        foreach ($this->interfaces as $token) {
             $package = $token->getPackage();
-            $this->assertSame("", $package['namespace']);
+            $this->assertSame('', $package['namespace']);
         }
     }
 
     /**
      * @covers PHP_Token_INTERFACE::getPackage
      */
-    public function testGetPackageNamespaceWhenExtentingFromNamespaceClass() {
-        $tokenStream = new PHP_Token_Stream(TEST_FILES_PATH . 'classExtendsNamespacedClass.php');
+    public function testGetPackageNamespaceWhenExtentingFromNamespaceClass()
+    {
+        $tokenStream     = new PHP_Token_Stream(TEST_FILES_PATH . 'classExtendsNamespacedClass.php');
         $firstClassFound = false;
-        foreach($tokenStream as $token) {
-            if($firstClassFound === false && $token instanceOf PHP_Token_INTERFACE) {
+        foreach ($tokenStream as $token) {
+            if ($firstClassFound === false && $token instanceof PHP_Token_INTERFACE) {
                 $package = $token->getPackage();
                 $this->assertSame('Baz', $token->getName());
                 $this->assertSame('Foo\\Bar', $package['namespace']);
                 $firstClassFound = true;
                 continue;
             }
-            if($token instanceOf PHP_Token_INTERFACE) {
+            if ($token instanceof PHP_Token_INTERFACE) {
                 $package = $token->getPackage();
                 $this->assertSame('Extender', $token->getName());
                 $this->assertSame('Other\\Space', $package['namespace']);
+
                 return;
             }
         }
-        $this->fail("Searching for 2 classes failed");
+        $this->fail('Searching for 2 classes failed');
     }
 }
diff --git a/vendor/phpunit/php-token-stream/tests/Token/NamespaceTest.php b/vendor/phpunit/php-token-stream/tests/Token/NamespaceTest.php
index 469f787261eaecac7caded52e30fb5d1c2c638bf..98360cfac3bb0aea3e235fd02dd94c33fd98ba3c 100644
--- a/vendor/phpunit/php-token-stream/tests/Token/NamespaceTest.php
+++ b/vendor/phpunit/php-token-stream/tests/Token/NamespaceTest.php
@@ -1,6 +1,6 @@
 <?php
 /*
- * This file is part of the PHP_TokenStream package.
+ * This file is part of php-token-stream.
  *
  * (c) Sebastian Bergmann <sebastian@phpunit.de>
  *
@@ -8,19 +8,9 @@
  * file that was distributed with this source code.
  */
 
-/**
- * Tests for the PHP_Token_NAMESPACE class.
- *
- * @package    PHP_TokenStream
- * @subpackage Tests
- * @author     Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright  Sebastian Bergmann <sebastian@phpunit.de>
- * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
- * @version    Release: @package_version@
- * @link       http://github.com/sebastianbergmann/php-token-stream/
- * @since      Class available since Release 1.0.0
- */
-class PHP_Token_NamespaceTest extends PHPUnit_Framework_TestCase
+use PHPUnit\Framework\TestCase;
+
+class PHP_Token_NamespaceTest extends TestCase
 {
     /**
      * @covers PHP_Token_NAMESPACE::getName
@@ -41,8 +31,8 @@ class PHP_Token_NamespaceTest extends PHPUnit_Framework_TestCase
     public function testGetStartLineWithUnscopedNamespace()
     {
         $tokenStream = new PHP_Token_Stream(TEST_FILES_PATH . 'classInNamespace.php');
-        foreach($tokenStream as $token) {
-            if($token instanceOf PHP_Token_NAMESPACE) {
+        foreach ($tokenStream as $token) {
+            if ($token instanceof PHP_Token_NAMESPACE) {
                 $this->assertSame(2, $token->getLine());
             }
         }
@@ -51,8 +41,8 @@ class PHP_Token_NamespaceTest extends PHPUnit_Framework_TestCase
     public function testGetEndLineWithUnscopedNamespace()
     {
         $tokenStream = new PHP_Token_Stream(TEST_FILES_PATH . 'classInNamespace.php');
-        foreach($tokenStream as $token) {
-            if($token instanceOf PHP_Token_NAMESPACE) {
+        foreach ($tokenStream as $token) {
+            if ($token instanceof PHP_Token_NAMESPACE) {
                 $this->assertSame(2, $token->getEndLine());
             }
         }
@@ -60,8 +50,8 @@ class PHP_Token_NamespaceTest extends PHPUnit_Framework_TestCase
     public function testGetStartLineWithScopedNamespace()
     {
         $tokenStream = new PHP_Token_Stream(TEST_FILES_PATH . 'classInScopedNamespace.php');
-        foreach($tokenStream as $token) {
-            if($token instanceOf PHP_Token_NAMESPACE) {
+        foreach ($tokenStream as $token) {
+            if ($token instanceof PHP_Token_NAMESPACE) {
                 $this->assertSame(2, $token->getLine());
             }
         }
@@ -70,11 +60,10 @@ class PHP_Token_NamespaceTest extends PHPUnit_Framework_TestCase
     public function testGetEndLineWithScopedNamespace()
     {
         $tokenStream = new PHP_Token_Stream(TEST_FILES_PATH . 'classInScopedNamespace.php');
-        foreach($tokenStream as $token) {
-            if($token instanceOf PHP_Token_NAMESPACE) {
+        foreach ($tokenStream as $token) {
+            if ($token instanceof PHP_Token_NAMESPACE) {
                 $this->assertSame(8, $token->getEndLine());
             }
         }
     }
-
 }
diff --git a/vendor/phpunit/php-token-stream/tests/TokenTest.php b/vendor/phpunit/php-token-stream/tests/TokenTest.php
index 67bf79a0553e771f703d21590096443c9e7de0d7..e4bbb8015509be141e089088553f4f8410f43d66 100644
--- a/vendor/phpunit/php-token-stream/tests/TokenTest.php
+++ b/vendor/phpunit/php-token-stream/tests/TokenTest.php
@@ -1,6 +1,6 @@
 <?php
 /*
- * This file is part of the PHP_TokenStream package.
+ * This file is part of php-token-stream.
  *
  * (c) Sebastian Bergmann <sebastian@phpunit.de>
  *
@@ -8,19 +8,9 @@
  * file that was distributed with this source code.
  */
 
-/**
- * Tests for the PHP_Token class.
- *
- * @package    PHP_TokenStream
- * @subpackage Tests
- * @author     Sebastian Bergmann <sebastian@phpunit.de>
- * @copyright  Sebastian Bergmann <sebastian@phpunit.de>
- * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
- * @version    Release: @package_version@
- * @link       http://github.com/sebastianbergmann/php-token-stream/
- * @since      Class available since Release 1.0.0
- */
-class PHP_TokenTest extends PHPUnit_Framework_TestCase
+use PHPUnit\Framework\TestCase;
+
+class PHP_TokenTest extends TestCase
 {
     /**
      * @covers PHP_Token::__construct
diff --git a/vendor/phpunit/php-token-stream/tests/_fixture/class_with_method_named_empty.php b/vendor/phpunit/php-token-stream/tests/_fixture/class_with_method_named_empty.php
new file mode 100644
index 0000000000000000000000000000000000000000..1dafc18759f07ff6927ecea86e860888d40ee496
--- /dev/null
+++ b/vendor/phpunit/php-token-stream/tests/_fixture/class_with_method_named_empty.php
@@ -0,0 +1,7 @@
+<?php
+class class_with_method_named_empty
+{
+    public function empty(): void
+    {
+    }
+}
diff --git a/vendor/phpunit/php-token-stream/tests/_fixture/class_with_multiple_anonymous_classes_and_functions.php b/vendor/phpunit/php-token-stream/tests/_fixture/class_with_multiple_anonymous_classes_and_functions.php
new file mode 100644
index 0000000000000000000000000000000000000000..3267ba5617ba23e3ade5a6888e1593cda4c7b80f
--- /dev/null
+++ b/vendor/phpunit/php-token-stream/tests/_fixture/class_with_multiple_anonymous_classes_and_functions.php
@@ -0,0 +1,26 @@
+<?php
+class class_with_multiple_anonymous_classes_and_functions
+{
+    public function m()
+    {
+        $c = new class {
+            public function n() {
+                return true;
+            }
+        };
+
+        $d = new class {
+            public function o() {
+                return false;
+            }
+        };
+
+        $f = function ($a, $b) {
+            return $a + $b;
+        };
+
+        $g = function ($a, $b) {
+            return $a - $b;
+        };
+    }
+}
\ No newline at end of file
diff --git a/vendor/phpunit/php-token-stream/tests/bootstrap.php b/vendor/phpunit/php-token-stream/tests/bootstrap.php
index f92b7df049062196de6f22132054d0fb40a187c1..bcd0f64525facea046c68bf2a9bd81be2dcd56de 100644
--- a/vendor/phpunit/php-token-stream/tests/bootstrap.php
+++ b/vendor/phpunit/php-token-stream/tests/bootstrap.php
@@ -1,4 +1,12 @@
 <?php
+/*
+ * This file is part of php-token-stream.
+ *
+ * (c) Sebastian Bergmann <sebastian@phpunit.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
 require __DIR__ . '/../vendor/autoload.php';
 
 define(
diff --git a/vendor/sabre/vobject/.gitignore b/vendor/sabre/vobject/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..1c46a297abca64add0ee2d22059a280b4bf5f046
--- /dev/null
+++ b/vendor/sabre/vobject/.gitignore
@@ -0,0 +1,18 @@
+# Composer stuff
+vendor/
+composer.lock
+tests/cov/
+tests/temp
+
+#vim
+.*.swp
+
+#binaries
+bin/phpunit
+bin/phpcs
+
+# Development stuff
+testdata/
+
+# OS X
+.DS_Store
diff --git a/vendor/sabre/vobject/.travis.yml b/vendor/sabre/vobject/.travis.yml
new file mode 100644
index 0000000000000000000000000000000000000000..4e7bd9d3dc19c8a10a9b1fb487adc7b73db4da82
--- /dev/null
+++ b/vendor/sabre/vobject/.travis.yml
@@ -0,0 +1,20 @@
+language: php
+php:
+  - 5.3
+  - 5.4
+  - 5.5
+  - 5.6
+  - 7.0
+  - 7.1
+  - hhvm
+
+matrix:
+  allow_failures:
+    - php: hhvm
+
+script:
+  - phpunit --configuration tests/phpunit.xml
+  - ./bin/phpcs -p --standard=tests/phpcs/ruleset.xml lib/
+
+
+before_script: composer install
diff --git a/vendor/sabre/vobject/ChangeLog.md b/vendor/sabre/vobject/ChangeLog.md
new file mode 100644
index 0000000000000000000000000000000000000000..923d247b48a07efb853d8514e9bbd83e0ff6f75d
--- /dev/null
+++ b/vendor/sabre/vobject/ChangeLog.md
@@ -0,0 +1,624 @@
+ChangeLog
+=========
+
+3.5.3 (2016-10-06)
+------------------
+
+* #331: Fix dealing with multiple overridden instances falling on the same
+  date/time (@afedyk-sugarcrm).
+
+
+3.5.2 (2016-04-24)
+-----------------
+
+* #312: Backported a fix related to iTip processing of events with timezones,
+  without a master event.
+
+
+3.5.1 (2016-04-06)
+------------------
+
+* #309: When expanding recurring events, the first event should also have a
+  `RECURRENCE-ID` property.
+* #306: iTip REPLYs to the first instance of a recurring event was not handled
+  correctly.
+
+
+3.5.0 (2016-01-11)
+------------------
+
+* This release supports PHP 7, contrary to 3.4.x versions.
+* BC Break: `Sabre\VObject\Property\Float` has been renamed to
+  `Sabre\VObject\Property\FloatValue`.
+* BC Break: `Sabre\VObject\Property\Integer` has been renamed to
+  `Sabre\VObject\Property\IntegerValue`.
+
+
+3.4.9 (2016-01-11)
+------------------
+
+* This package now specifies in composer.json that it does not support PHP 7.
+  For PHP 7, use version 3.5.x or 4.x.
+
+
+3.4.8 (2016-01-04)
+------------------
+
+* #284: When generating `CANCEL` iTip messages, we now include `DTEND`.
+  (@kewisch).
+
+
+3.4.7 (2015-09-05)
+------------------
+
+* #253: Handle `isInTimeRange` for recurring events that have 0 valid
+  instances. (@DominikTo, @migrax).
+
+
+3.4.6 (2015-08-06)
+------------------
+
+* #250: Recurring all-day events are incorrectly included in time range
+  requests when not using UTC in the time range. (@armin-hackmann)
+
+
+3.4.5 (2015-06-02)
+------------------
+
+* #229: Converting vcards from 3.0 to 4.0 that contained a `LANG` property
+  would throw an error.
+
+
+3.4.4 (2015-05-27)
+------------------
+
+* #228: Fixed a 'party crasher' bug in the iTip broker. This would break
+  scheduling in some cases.
+
+
+3.4.3 (2015-05-19)
+------------------
+
+* #219: Corrected validation of `EXDATE` properties with more than one value.
+* #212: `BYSETPOS` with values below `-1` was broken and could cause infinite
+  loops.
+* #211: Fix `BYDAY=-5TH` in recurrence iterator. (@lindquist)
+* #216: `ENCODING` parameter is now validated for all document types.
+* #217: Initializing vCard `DATE` objects with a PHP DateTime object will now
+  work correctly. (@thomascube)
+
+
+3.4.2 (2015-02-25)
+------------------
+
+* #210: iTip: Replying to an event without a master event was broken.
+
+
+3.4.1 (2015-02-24)
+------------------
+
+* A minor change to ensure that unittests work correctly in the sabre/dav
+  test-suite.
+
+
+3.4.0 (2015-02-23)
+------------------
+
+* #196: Made parsing recurrence rules a lot faster on big calendars.
+* Updated windows timezone mappings to latest unicode version.
+* #202: Support for parsing and validating `VAVAILABILITY` components. (@Hywan)
+* #195: PHP 5.3 compatibility in 'generatevcards' script. (@rickdenhaan)
+* #205: Improving handling of multiple `EXDATE` when processing iTip changes.
+  (@armin-hackmann)
+* #187: Fixed validator rules for `LAST-MODIFIED` properties.
+* #188: Retain floating times when generating instances using
+  `Recur\EventIterator`.
+* #203: Skip tests for timezones that are not supported on older PHP versions,
+  instead of a hard fail.
+* #204: Dealing a bit better with vCard date-time values that contained
+  milliseconds. (which is normally invalid). (@armin-hackmann)
+
+
+3.3.5 (2015-01-09)
+------------------
+
+* #168: Expanding calendars now removes objects with recurrence rules that
+  don't have a valid recurrence instance.
+* #177: SCHEDULE-STATUS should not contain a reason phrase, only a status
+  code.
+* #175: Parser can now read and skip the UTF-8 BOM.
+* #179: Added `isFloating` to `DATE-TIME` properties.
+* #179: Fixed jCal serialization of floating `DATE-TIME` properties.
+* #173: vCard converter failed for `X-ABDATE` properties that had no
+  `X-ABLABEL`.
+* #180: Added `PROFILE_CALDAV` and `PROFILE_CARDDAV` to enable validation rules
+  specific for CalDAV/CardDAV servers.
+* #176: A missing `UID` is no longer an error, but a warning for the vCard
+  validator, unless `PROFILE_CARDDAV` is specified.
+
+
+3.3.4 (2014-11-19)
+------------------
+
+* #154: Converting `ANNIVERSARY` to `X-ANNIVERSARY` and `X-ABDATE` and
+  vice-versa when converting to/from vCard 4.
+* #154: It's now possible to easily select all vCard properties belonging to
+  a single group with `$vcard->{'ITEM1.'}` syntax. (@armin-hackmann)
+* #156: Simpler way to check if a string is UTF-8. (@Hywan)
+* Unittest improvements.
+* #159: The recurrence iterator, freebusy generator and iCalendar DATE and
+  DATE-TIME properties can now all accept a reference timezone when working
+  floating times or all-day events.
+* #159: Master events will no longer get a `RECURRENCE-ID` when expanding.
+* #159: `RECURRENCE-ID` for all-day events will now be correct when expanding.
+* #163: Added a `getTimeZone()` method to `VTIMEZONE` components.
+
+
+3.3.3 (2014-10-09)
+------------------
+
+* #142: `CANCEL` and `REPLY` messages now include the `DTSTART` from the
+  original event.
+* #143: `SCHEDULE-AGENT` on the `ORGANIZER` property is respected.
+* #144: `PARTSTAT=NEEDS-ACTION` is now set for new invites, if no `PARTSTAT` is
+  set to support the inbox feature of iOS.
+* #147: Bugs related to scheduling all-day events.
+* #148: Ignore events that have attendees but no organizer.
+* #149: Avoiding logging errors during timezone detection. This is a workaround
+  for a PHP bug.
+* Support for "Line Islands Standard Time" windows timezone.
+* #154: Correctly work around vCard parameters that have a value but no name.
+
+
+3.3.2 (2014-09-19)
+------------------
+
+* Changed: iTip broker now sets RSVP status to false when replies are received.
+* #118: iTip Message now has a `getScheduleStatus()` method.
+* #119: Support for detecting 'significant changes'.
+* #120: Support for `SCHEDULE-FORCE-SEND`.
+* #121: iCal demands parameters containing the + sign to be quoted.
+* #122: Don't generate REPLY messages for events that have been cancelled.
+* #123: Added `SUMMARY` to iTip messages.
+* #130: Incorrect validation rules for `RELATED` (should be `RELATED-TO`).
+* #128: `ATTACH` in iCalendar is `URI` by default, not `BINARY`.
+* #131: RRULE that doesn't provide a single valid instance now throws an
+  exception.
+* #136: Validator rejects *all* control characters. We were missing a few.
+* #133: Splitter objects will throw exceptions when receiving incompatible
+  objects.
+* #127: Attendees who delete recurring event instances events they had already
+  declined earlier will no longer generate another reply.
+* #125: Send CANCEL messages when ORGANIZER property gets deleted.
+
+
+3.3.1 (2014-08-18)
+------------------
+
+* Changed: It's now possible to pass DateTime objects when using the magic
+  setters on properties. (`$event->DTSTART = new DateTime('now')`).
+* #111: iTip Broker does not process attendee adding events to EXDATE.
+* #112: EventIterator now sets TZID on RECURRENCE-ID.
+* #113: Timezone support during creation of iTip REPLY messages.
+* #114: VTIMEZONE is retained when generating new REQUEST objects.
+* #114: Support for 'MAILTO:' style email addresses (in uppercase) in the iTip
+  broker. This improves evolution support.
+* #115: Using REQUEST-STATUS from REPLY messages and now propegating that into
+  SCHEDULE-STATUS.
+
+
+3.3.0 (2014-08-07)
+------------------
+
+* We now use PSR-4 for the directory structure. This means that everything
+  that was used to be in the `lib/Sabre/VObject` directory is now moved to
+  `lib/`. If you use composer to load this library, you shouldn't have to do
+  anything about that though.
+* VEVENT now get populated with a DTSTAMP and UID property by default.
+* BC Break: Removed the 'includes.php' file. Use composer instead.
+* #103: Added support for processing [iTip][iTip] messages. This allows a user
+  to parse incoming iTip messages and apply the result on existing calendars,
+  or automatically generate invites/replies/cancellations based on changes that
+  a user made on objects.
+* #75, #58, #18: Fixes related to overriding the first event in recurrences.
+* Added: VCalendar::getBaseComponent to find the 'master' component in a
+  calendar.
+* #51: Support for iterating RDATE properties.
+* Fixed: Issue #101: RecurrenceIterator::nextMonthly() shows events that are
+  excluded events with wrong time
+
+
+3.2.4 (2014-07-14)
+------------------
+
+* Added: Issue #98. The VCardConverter now takes `X-APPLE-OMIT-YEAR` into
+  consideration when converting between vCard 3 and 4.
+* Fixed: Issue #96. Some support for Yahoo's broken vcards.
+* Fixed: PHP 5.3 support was broken in the cli tool.
+
+
+3.2.3 (2014-06-12)
+------------------
+
+* Validator now checks if DUE and DTSTART are of the same type in VTODO, and
+  ensures that DUE is always after DTSTART.
+* Removed documentation from source repository, to http://sabre.io/vobject/
+* Expanded the vobject cli tool validation output to make it easier to find
+  issues.
+* Fixed: vobject repair. It was not working for iCalendar objects.
+
+
+3.2.2 (2014-05-07)
+------------------
+
+* Minor tweak in unittests to make it run on PHP 5.5.12. Json-prettifying
+  slightly changed which caused the test to fail.
+
+
+3.2.1 (2014-05-03)
+------------------
+
+* Minor tweak to make the unittests run with the latest hhvm on travis.
+* Updated timezone definitions.
+* Updated copyright links to point to http://sabre.io/
+
+
+3.2.0 (2014-04-02)
+------------------
+
+* Now hhvm compatible!
+* The validator can now detect a _lot_ more problems. Many rules for both
+  iCalendar and vCard were added.
+* Added: bin/generate_vcards, a utility to generate random vcards for testing
+  purposes. Patches are welcome to add more data.
+* Updated: Windows timezone mapping to latest version from unicode.org
+* Changed: The timezone maps are now loaded in from external files, in
+  lib/Sabre/VObject/timezonedata.
+* Added: Fixing badly encoded URL's from google contacts vcards.
+* Fixed: Issue #68. Couldn't decode properties ending in a colon.
+* Fixed: Issue #72. RecurrenceIterator should respect timezone in the UNTIL
+  clause.
+* Fixed: Issue #67. BYMONTH limit on DAILY recurrences.
+* Fixed: Issue #26. Return a more descriptive error when coming across broken
+  BYDAY rules.
+* Fixed: Issue #28. Incorrect timezone detection for some timezones.
+* Fixed: Issue #70. Casting a parameter with a null value to string would fail.
+* Added: Support for rfc6715 and rfc6474.
+* Added: Support for DateTime objects in the VCard DATE-AND-OR-TIME property.
+* Added: UUIDUtil, for easily creating unique identifiers.
+* Fixed: Issue #83. Creating new VALUE=DATE objects using php's DateTime.
+* Fixed: Issue #86. Don't go into an infinite loop when php errors are
+  disabled and an invalid file is read.
+
+
+3.1.4 (2014-03-30)
+------------------
+
+* Fixed: Issue #87: Several compatibility fixes related to timezone handling
+  changes in PHP 5.5.10.
+
+
+3.1.3 (2013-10-02)
+------------------
+
+* Fixed: Support from properties from draft-daboo-valarm-extensions-04. Issue
+  #56.
+* Fixed: Issue #54. Parsing a stream of multiple vcards separated by more than
+  one newline. Thanks @Vedmak for the patch.
+* Fixed: Serializing vcard 2.1 parameters with no name caused a literal '1' to
+  be inserted.
+* Added: VCardConverter removed properties that are no longer supported in vCard
+  4.0.
+* Added: vCards with a minimum number of values (such as N), but don't have that
+  many, are now automatically padded with empty components.
+* Added: The vCard validator now also checks for a minimum number of components,
+  and has the ability to repair these.
+* Added: Some support for vCard 2.1 in the VCard converter, to upgrade to vCard
+  3.0 or 4.0.
+* Fixed: Issue 60 Use Document::$componentMap when instantiating the top-level
+  VCalendar and VCard components.
+* Fixed: Issue 62: Parsing iCalendar parameters with no value.
+* Added: --forgiving option to vobject utility.
+* Fixed: Compound properties such as ADR were not correctly split up in vCard
+  2.1 quoted printable-encoded properties.
+* Fixed: Issue 64: Encoding of binary properties of converted vCards. Thanks
+  @DominikTo for the patch.
+
+
+3.1.2 (2013-08-13)
+------------------
+
+* Fixed: Setting correct property group on VCard conversion
+
+
+3.1.1 (2013-08-02)
+------------------
+
+* Fixed: Issue #53. A regression in RecurrenceIterator.
+
+
+3.1.0 (2013-07-27)
+------------------
+
+* Added: bad-ass new cli debugging utility (in bin/vobject).
+* Added: jCal and jCard parser.
+* Fixed: URI properties should not escape ; and ,.
+* Fixed: VCard 4 documents now correctly use URI as a default value-type for
+  PHOTO and others. BINARY no longer exists in vCard 4.
+* Added: Utility to convert between 2.1, 3.0 and 4.0 vCards.
+* Added: You can now add() multiple parameters to a property in one call.
+* Added: Parameter::has() for easily checking if a parameter value exists.
+* Added: VCard::preferred() to find a preferred email, phone number, etc for a
+  contact.
+* Changed: All $duration properties are now public.
+* Added: A few validators for iCalendar documents.
+* Fixed: Issue #50. RecurrenceIterator gives incorrect result when exception
+  events are out of order in the iCalendar file.
+* Fixed: Issue #48. Overridden events in the recurrence iterator that were past
+  the UNTIL date were ignored.
+* Added: getDuration for DURATION values such as TRIGGER. Thanks to
+  @SimonSimCity.
+* Fixed: Issue #52. vCard 2.1 parameters with no name may lose values if there's
+  more than 1. Thanks to @Vedmak.
+
+
+3.0.0 (2013-06-21)
+------------------
+
+* Fixed: includes.php file was still broken. Our tool to generate it had some
+  bugs.
+
+
+3.0.0-beta4 (2013-06-21)
+------------------------
+
+* Fixed: includes.php was no longer up to date.
+
+
+3.0.0-beta3 (2013-06-17)
+------------------------
+
+* Added: OPTION_FORGIVING now also allows slashes in property names.
+* Fixed: DateTimeParser no longer fails on dates with years < 1000 & > 4999
+* Fixed: Issue 36: Workaround for the recurrenceiterator and caldav events with
+  a missing base event.
+* Fixed: jCard encoding of TIME properties.
+* Fixed: jCal encoding of REQUEST-STATUS, GEO and PERIOD values.
+
+
+3.0.0-beta2 (2013-06-10)
+------------------------
+
+* Fixed: Corrected includes.php file.
+* Fixed: vCard date-time parser supported extended-format dates as well.
+* Changed: Properties have been moved to an ICalendar or VCard directory.
+* Fixed: Couldn't parse vCard 3 extended format dates and times.
+* Fixed: Couldn't export jCard DATE values correctly.
+* Fixed: Recursive loop in ICalendar\DateTime property.
+
+
+3.0.0-beta1 (2013-06-07)
+------------------------
+
+* Added: jsonSerialize() for creating jCal and jCard documents.
+* Added: helper method to parse vCard dates and times.
+* Added: Specialized classes for FLOAT, LANGUAGE-TAG, TIME, TIMESTAMP,
+  DATE-AND-OR-TIME, CAL-ADDRESS, UNKNOWN and UTC-OFFSET properties.
+* Removed: CommaSeparatedText property. Now included into Text.
+* Fixed: Multiple parameters with the same name are now correctly encoded.
+* Fixed: Parameter values containing a comma are now enclosed in double-quotes.
+* Fixed: Iterating parameter values should now fully work as expected.
+* Fixed: Support for vCard 2.1 nameless parameters.
+* Changed: $valueMap, $componentMap and $propertyMap now all use fully-qualified
+  class names, so they are actually overridable.
+* Fixed: Updating DATE-TIME to DATE values now behaves like expected.
+
+
+3.0.0-alpha4 (2013-05-31)
+-------------------------
+
+* Added: It's now possible to send parser options to the splitter classes.
+* Added: A few tweaks to improve component and property creation.
+
+
+3.0.0-alpha3 (2013-05-13)
+-------------------------
+
+* Changed: propertyMap, valueMap and componentMap are now static properties.
+* Changed: Component::remove() will throw an exception when trying to a node
+  that's not a child of said component.
+* Added: Splitter objects are now faster, line numbers are accurately reported
+  and use less memory.
+* Added: MimeDir parser can now continue parsing with the same stream buffer.
+* Fixed: vobjectvalidate.php is operational again.
+* Fixed: \r is properly stripped in text values.
+* Fixed: QUOTED-PRINTABLE is now correctly encoded as well as encoded, for
+  vCards 2.1.
+* Fixed: Parser assumes vCard 2.1, if no version was supplied.
+
+
+3.0.0-alpha2 (2013-05-22)
+-------------------------
+
+* Fixed: vCard URL properties were referencing a non-existant class.
+
+
+3.0.0-alpha1 (2013-05-21)
+-------------------------
+
+* Fixed: Now correctly dealing with escaping of properties. This solves the
+  problem with double-backslashes where they don't belong.
+* Added: Easy support for properties with more than one value, using setParts
+  and getParts.
+* Added: Support for broken 2.1 vCards produced by microsoft.
+* Added: Automatically decoding quoted-printable values.
+* Added: Automatically decoding base64 values.
+* Added: Decoding RFC6868 parameter values (uses ^ as an escape character).
+* Added: Fancy new MimeDir parser that can also parse streams.
+* Added: Automatically mapping many, many properties to a property-class with
+  specialized API's.
+* Added: remove() method for easily removing properties and sub-components
+  components.
+* Changed: Components, Properties and Parameters can no longer be created with
+  Component::create, Property::create and Parameter::create. They must instead
+  be created through the root component. (A VCalendar or VCard object).
+* Changed: API for DateTime properties has slightly changed.
+* Changed: the ->value property is now protected everywhere. Use getParts() and
+  getValue() instead.
+* BC Break: No support for mac newlines (\r). Never came across these anyway.
+* Added: add() method to the Property class.
+* Added: It's now possible to easy set multi-value properties as arrays.
+* Added: When setting date-time properties you can just pass PHP's DateTime
+  object.
+* Added: New components automatically get a bunch of default properties, such as
+  VERSION and CALSCALE.
+* Added: You can add new sub-components much quicker with the magic setters, and
+  add() method.
+
+
+2.1.7 (2015-01-21)
+------------------
+
+* Fixed: Issue #94, a workaround for bad escaping of ; and , in compound
+  properties. It's not a full solution, but it's an improvement for those
+  stuck in the 2.1 versions.
+
+
+2.1.6 (2014-12-10)
+------------------
+
+* Fixed: Minor change to make sure that unittests succeed on every PHP version.
+
+
+2.1.5 (2014-06-03)
+------------------
+
+* Fixed: #94: Better parameter escaping.
+* Changed: Documentation cleanups.
+
+
+2.1.4 (2014-03-30)
+------------------
+
+* Fixed: Issue #87: Several compatibility fixes related to timezone handling
+  changes in PHP 5.5.10.
+
+
+2.1.3 (2013-10-02)
+------------------
+
+* Fixed: Issue #55. \r must be stripped from property values.
+* Fixed: Issue #65. Putting quotes around parameter values that contain a colon.
+
+
+2.1.2 (2013-08-02)
+------------------
+
+* Fixed: Issue #53. A regression in RecurrenceIterator.
+
+
+2.1.1 (2013-07-27)
+------------------
+
+* Fixed: Issue #50. RecurrenceIterator gives incorrect result when exception
+  events are out of order in the iCalendar file.
+* Fixed: Issue #48. Overridden events in the recurrence iterator that were past
+  the UNTIL date were ignored.
+
+
+2.1.0 (2013-06-17)
+------------------
+
+* This version is fully backwards compatible with 2.0.\*. However, it contains a
+  few new API's that mimic the VObject 3 API. This allows it to be used a
+  'bridge' version. Specifically, this new version exists so SabreDAV 1.7 and
+  1.8 can run with both the 2 and 3 versions of this library.
+* Added: Property\DateTime::hasTime().
+* Added: Property\MultiDateTime::hasTime().
+* Added: Property::getValue().
+* Added: Document class.
+* Added: Document::createComponent and Document::createProperty.
+* Added: Parameter::getValue().
+
+
+2.0.7 (2013-03-05)
+------------------
+
+* Fixed: Microsoft re-uses their magic numbers for different timezones,
+  specifically id 2 for both Sarajevo and Lisbon). A workaround was added to
+  deal with this.
+
+
+2.0.6 (2013-02-17)
+------------------
+
+* Fixed: The reader now properly parses parameters without a value.
+
+
+2.0.5 (2012-11-05)
+------------------
+
+* Fixed: The FreeBusyGenerator is now properly using the factory methods for
+  creation of components and properties.
+
+
+2.0.4 (2012-11-02)
+------------------
+
+* Added: Known Lotus Notes / Domino timezone id's.
+
+
+2.0.3 (2012-10-29)
+------------------
+
+* Added: Support for 'GMT+????' format in TZID's.
+* Added: Support for formats like SystemV/EST5EDT in TZID's.
+* Fixed: RecurrenceIterator now repairs recurrence rules where UNTIL < DTSTART.
+* Added: Support for BYHOUR in FREQ=DAILY (@hollodk).
+* Added: Support for BYHOUR and BYDAY in FREQ=WEEKLY.
+
+
+2.0.2 (2012-10-06)
+------------------
+
+* Added: includes.php file, to load the entire library in one go.
+* Fixed: A problem with determining alarm triggers for TODO's.
+
+
+2.0.1 (2012-09-22)
+------------------
+
+* Removed: Element class. It wasn't used.
+* Added: Basic validation and repair methods for broken input data.
+* Fixed: RecurrenceIterator could infinitely loop when an INTERVAL of 0 was
+  specified.
+* Added: A cli script that can validate and automatically repair vcards and
+  iCalendar objects.
+* Added: A new 'Compound' property, that can automatically split up parts for
+  properties such as N, ADR, ORG and CATEGORIES.
+* Added: Splitter classes, that can split up large objects (such as exports)
+  into individual objects (thanks @DominikTO and @armin-hackmann).
+* Added: VFREEBUSY component, which allows easily checking wether timeslots are
+  available.
+* Added: The Reader class now has a 'FORGIVING' option, which allows it to parse
+  properties with incorrect characters in the name (at this time, it just allows
+  underscores).
+* Added: Also added the 'IGNORE_INVALID_LINES' option, to completely disregard
+  any invalid lines.
+* Fixed: A bug in Windows timezone-id mappings for times created in Greenlands
+  timezone (sorry Greenlanders! I do care!).
+* Fixed: DTEND was not generated correctly for VFREEBUSY reports.
+* Fixed: Parser is at least 25% faster with real-world data.
+
+
+2.0.0 (2012-08-08)
+------------------
+
+* VObject is now a separate project from SabreDAV. See the SabreDAV changelog
+  for version information before 2.0.
+* New: VObject library now uses PHP 5.3 namespaces.
+* New: It's possible to specify lists of parameters when constructing
+  properties.
+* New: made it easier to construct the FreeBusyGenerator.
+
+[iTip]: http://tools.ietf.org/html/rfc5546
diff --git a/vendor/sabre/vobject/LICENSE b/vendor/sabre/vobject/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..a99c8da1988ebcdac4242d43518d88b26c269714
--- /dev/null
+++ b/vendor/sabre/vobject/LICENSE
@@ -0,0 +1,27 @@
+Copyright (C) 2011-2016 fruux GmbH (https://fruux.com/)
+
+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 Sabre nor the names of its contributors
+      may be used to endorse or promote products derived from this software
+      without specific prior written permission.
+
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+    ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+    POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/sabre/vobject/README.md b/vendor/sabre/vobject/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..6440a69d20424c2608d38bc6ab9c86da36e36832
--- /dev/null
+++ b/vendor/sabre/vobject/README.md
@@ -0,0 +1,50 @@
+sabre/vobject
+=============
+
+The VObject library allows you to easily parse and manipulate [iCalendar](https://tools.ietf.org/html/rfc5545)
+and [vCard](https://tools.ietf.org/html/rfc6350) objects using PHP.
+
+The goal of the VObject library is to create a very complete library, with an easy to use API.
+
+Build status
+------------
+
+| branch | status |
+| ------ | ------ |
+| master | [![Build Status](https://travis-ci.org/fruux/sabre-vobject.svg?branch=master)](https://travis-ci.org/fruux/sabre-vobject) |
+| 3.4    | [![Build Status](https://travis-ci.org/fruux/sabre-vobject.svg?branch=3.4)](https://travis-ci.org/fruux/sabre-vobject) |
+| 3.1    | [![Build Status](https://travis-ci.org/fruux/sabre-vobject.svg?branch=3.1)](https://travis-ci.org/fruux/sabre-vobject) |
+| 2.1    | [![Build Status](https://travis-ci.org/fruux/sabre-vobject.svg?branch=2.1)](https://travis-ci.org/fruux/sabre-vobject) |
+| 2.0    | [![Build Status](https://travis-ci.org/fruux/sabre-vobject.svg?branch=2.0)](https://travis-ci.org/fruux/sabre-vobject) |
+
+
+Installation
+------------
+
+VObject requires PHP 5.3, and should be installed using composer.
+The general composer instructions can be found on the [composer website](http://getcomposer.org/doc/00-intro.md composer website).
+
+After that, just declare the vobject dependency as follows:
+
+    "require" : {
+        "sabre/vobject" : "~3.4"
+    }
+
+Then, run `composer.phar update` and you should be good.
+
+Usage
+-----
+
+* [3.x documentation](http://sabre.io/vobject/usage/)
+* [2.x documentation](http://sabre.io/vobject/usage_2/)
+* [Migrating from 2.x to 3.x](http://sabre.io/vobject/upgrade/)
+
+Support
+-------
+
+Head over to the [SabreDAV mailing list](http://groups.google.com/group/sabredav-discuss) for any questions.
+
+Made at fruux
+-------------
+
+This library is being developed by [fruux](https://fruux.com/). Drop us a line for commercial services or enterprise support.
diff --git a/vendor/sabre/vobject/bin/bench.php b/vendor/sabre/vobject/bin/bench.php
new file mode 100755
index 0000000000000000000000000000000000000000..b949c8ea45646ed49a3cc4cf7ecf29f65f2908b2
--- /dev/null
+++ b/vendor/sabre/vobject/bin/bench.php
@@ -0,0 +1,12 @@
+#!/usr/bin/env php
+<?php
+
+include __DIR__ . '/../vendor/autoload.php';
+
+$data = stream_get_contents(STDIN);
+
+$start = microtime(true); 
+
+$lol = Sabre\VObject\Reader::read($data);
+
+echo "time: " . (microtime(true)-$start) . "\n";
diff --git a/vendor/sabre/vobject/bin/fetch_windows_zones.php b/vendor/sabre/vobject/bin/fetch_windows_zones.php
new file mode 100755
index 0000000000000000000000000000000000000000..a577c52dc0af535f3ff92641fda726d0bcb1cad3
--- /dev/null
+++ b/vendor/sabre/vobject/bin/fetch_windows_zones.php
@@ -0,0 +1,47 @@
+#!/usr/bin/env php
+<?php
+
+$windowsZonesUrl = 'http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml';
+$outputFile = __DIR__ . '/../lib/timezonedata/windowszones.php';
+
+echo "Fetching timezone map from: " . $windowsZonesUrl, "\n";
+
+$data = file_get_contents($windowsZonesUrl);
+
+$xml = simplexml_load_string($data);
+
+$map = array();
+
+foreach($xml->xpath('//mapZone') as $mapZone) {
+
+    $from = (string)$mapZone['other'];
+    $to = (string)$mapZone['type'];
+
+    list($to) = explode(' ', $to, 2);
+
+    if (!isset($map[$from])) {
+        $map[$from] = $to;
+    }
+
+}
+
+ksort($map);
+echo "Writing to: $outputFile\n";
+
+$f = fopen($outputFile,'w');
+fwrite($f, "<?php\n\n");
+fwrite($f, "/**\n");
+fwrite($f, " * Automatically generated timezone file\n");
+fwrite($f, " *\n");
+fwrite($f, " * Last update: " . date(DATE_W3C) . "\n");
+fwrite($f, " * Source: " .$windowsZonesUrl . "\n");
+fwrite($f, " *\n");
+fwrite($f, " * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).\n");
+fwrite($f, " * @license http://sabre.io/license/ Modified BSD License\n");
+fwrite($f, " */\n");
+fwrite($f, "\n");
+fwrite($f, "return ");
+fwrite($f, var_export($map, true) . ';');
+fclose($f);
+
+echo "Done\n";
diff --git a/vendor/sabre/vobject/bin/generate_vcards b/vendor/sabre/vobject/bin/generate_vcards
new file mode 100755
index 0000000000000000000000000000000000000000..638f63b0412d5b8ec9342b57b7563b51ad9f00c5
--- /dev/null
+++ b/vendor/sabre/vobject/bin/generate_vcards
@@ -0,0 +1,241 @@
+#!/usr/bin/env php
+<?php
+
+namespace Sabre\VObject;
+
+// This sucks.. we have to try to find the composer autoloader. But chances
+// are, we can't find it this way. So we'll do our bestest
+$paths = array(
+    __DIR__ . '/../vendor/autoload.php',  // In case vobject is cloned directly
+    __DIR__ . '/../../../autoload.php',   // In case vobject is a composer dependency.
+);
+
+foreach($paths as $path) {
+    if (file_exists($path)) {
+        include $path;
+        break;
+    }
+}
+
+if (!class_exists('Sabre\\VObject\\Version')) {
+    fwrite(STDERR, "Composer autoloader could not be properly loaded.\n");
+    die(1);
+}
+
+if ($argc < 2) {
+
+    $version = Version::VERSION;
+
+    $help = <<<HI
+sabre/vobject $version
+Usage:
+    generate_vcards [count]
+
+Options:
+    count   The number of random vcards to generate
+
+Examples:
+    generate_vcards 1000 > testdata.vcf
+
+HI;
+
+    fwrite(STDERR, $help);
+    exit(2);
+}
+
+$count = (int)$argv[1];
+if ($count < 1) {
+    fwrite(STDERR, "Count must be at least 1\n");
+    exit(2);
+}
+
+fwrite(STDERR, "sabre/vobject " . Version::VERSION . "\n");
+fwrite(STDERR, "Generating " . $count . " vcards in vCard 4.0 format\n");
+
+/**
+ * The following list is just some random data we compiled from various
+ * sources online.
+ *
+ * Very little thought went into compiling this list, and certainly nothing
+ * political or ethical.
+ *
+ * We would _love_ more additions to this to add more variation to this list.
+ *
+ * Send us PR's and don't be shy adding your own first and last name for fun.
+ */
+
+$sets = array(
+    "nl" => array(
+        "country" => "Netherlands",
+        "boys" => array(
+            "Anno",
+            "Bram",
+            "Daan",
+            "Evert",
+            "Finn",
+            "Jayden",
+            "Jens",
+            "Jesse",
+            "Levi",
+            "Lucas",
+            "Luuk",
+            "Milan",
+            "René",
+            "Sem",
+            "Sibrand",
+            "Willem",
+        ),
+        "girls" => array(
+            "Celia",
+            "Emma",
+            "Fenna",
+            "Geke",
+            "Inge",
+            "Julia",
+            "Lisa",
+            "Lotte",
+            "Mila",
+            "Sara",
+            "Sophie",
+            "Tess",
+            "Zoë",
+        ),
+        "last" => array(
+            "Bakker",
+            "Bos",
+            "De Boer",
+            "De Groot",
+            "De Jong",
+            "De Vries",
+            "Jansen",
+            "Janssen",
+            "Meyer",
+            "Mulder",
+            "Peters",
+            "Smit",
+            "Van Dijk",
+            "Van den Berg",
+            "Visser",
+            "Vos",
+        ),
+    ),
+    "us" => array(
+        "country" => "United States",
+        "boys" => array(
+            "Aiden",
+            "Alexander",
+            "Charles",
+            "David",
+            "Ethan",
+            "Jacob",
+            "James",
+            "Jayden",
+            "John",
+            "Joseph",
+            "Liam",
+            "Mason",
+            "Michael",
+            "Noah",
+            "Richard",
+            "Robert",
+            "Thomas",
+            "William",
+        ),
+        "girls" => array(
+            "Ava",
+            "Barbara",
+            "Chloe",
+            "Dorothy",
+            "Elizabeth",
+            "Emily",
+            "Emma",
+            "Isabella",
+            "Jennifer",
+            "Lily",
+            "Linda",
+            "Margaret",
+            "Maria",
+            "Mary",
+            "Mia",
+            "Olivia",
+            "Patricia",
+            "Roxy",
+            "Sophia",
+            "Susan",
+            "Zoe",
+        ),
+        "last" => array(
+            "Smith",
+            "Johnson",
+            "Williams",
+            "Jones",
+            "Brown",
+            "Davis",
+            "Miller",
+            "Wilson",
+            "Moore",
+            "Taylor",
+            "Anderson",
+            "Thomas",
+            "Jackson",
+            "White",
+            "Harris",
+            "Martin",
+            "Thompson",
+            "Garcia",
+            "Martinez",
+            "Robinson",
+        ),
+    ),
+);
+
+$current = 0;
+
+$r = function($arr) {
+
+    return $arr[mt_rand(0,count($arr)-1)];
+
+};
+
+$bdayStart = strtotime('-85 years');
+$bdayEnd = strtotime('-20 years');
+
+while($current < $count) {
+
+    $current++;
+    fwrite(STDERR, "\033[100D$current/$count");
+
+    $country = array_rand($sets);
+    $gender = mt_rand(0,1)?'girls':'boys';
+
+    $vcard = new Component\VCard(array(
+        'VERSION' => '4.0',
+        'FN' => $r($sets[$country][$gender]) . ' ' . $r($sets[$country]['last']),
+        'UID' => UUIDUtil::getUUID(),
+    ));
+
+    $bdayRatio = mt_rand(0,9);
+
+    if($bdayRatio < 2) {
+        // 20% has a birthday property with a full date
+        $dt = new \DateTime('@' . mt_rand($bdayStart, $bdayEnd));
+        $vcard->add('BDAY', $dt->format('Ymd'));
+
+    } elseif ($bdayRatio < 3) {
+        // 10% we only know the month and date of
+        $dt = new \DateTime('@' . mt_rand($bdayStart, $bdayEnd));
+        $vcard->add('BDAY', '--' . $dt->format('md'));
+    }
+    if ($result = $vcard->validate()) {
+        ob_start();
+        echo "\nWe produced an invalid vcard somehow!\n";
+        foreach($result as $message) {
+            echo "  " . $message['message'] . "\n";
+        }
+        fwrite(STDERR, ob_get_clean());
+    }
+    echo $vcard->serialize();
+
+}
+
+fwrite(STDERR,"\nDone.\n");
diff --git a/vendor/sabre/vobject/bin/generateicalendardata.php b/vendor/sabre/vobject/bin/generateicalendardata.php
new file mode 100755
index 0000000000000000000000000000000000000000..92c8c106ddcab523e98336fa10755d6892b0a31f
--- /dev/null
+++ b/vendor/sabre/vobject/bin/generateicalendardata.php
@@ -0,0 +1,91 @@
+#!/usr/bin/env php
+<?php
+
+use Sabre\VObject;
+
+if ($argc<2) {
+    $cmd = $argv[0];
+    fwrite(STDERR, <<<HI
+Fruux test data generator
+
+This script generates a lot of test data. This is used for profiling and stuff.
+Currently it just generates events in a single calendar.
+
+The iCalendar output goes to stdout. Other messages to stderr.
+
+{$cmd} [events]
+
+
+HI
+    );
+    die();
+}
+
+$events = 100;
+
+if (isset($argv[1])) $events = (int)$argv[1];
+
+include __DIR__ . '/../vendor/autoload.php';
+
+fwrite(STDERR, "Generating " . $events . " events\n");
+
+$currentDate = new DateTime('-' . round($events/2) .  ' days');
+
+$calendar = VObject\Component::create('VCALENDAR');
+$calendar->version = '2.0';
+$calendar->calscale = 'GREGORIAN';
+
+$ii=0;
+
+while($ii < $events) {
+
+    $ii++;
+
+    $event = VObject\Component::create('VEVENT');
+    $event->DTSTART = 'bla';
+    $event->SUMMARY = 'Event #' . $ii;
+    $event->UID = md5(microtime(true));
+
+    $doctorRandom = mt_rand(1,1000);
+
+    switch($doctorRandom) {
+        // All-day event
+        case 1 : 
+            $event->DTEND = 'bla';
+            $dtStart = clone $currentDate;
+            $dtEnd = clone $currentDate;
+            $dtEnd->modify('+' . mt_rand(1,3) . ' days');
+            $event->DTSTART->setDateTime($dtStart, VObject\Property\DateTime::DATE);
+            $event->DTEND->setDateTime($dtEnd, VObject\Property\DateTime::DATE);
+            break;
+        case 2 :
+            $event->RRULE = 'FREQ=DAILY;COUNT=' . mt_rand(1,10);
+            // No break intentional
+        default :
+            $dtStart = clone $currentDate;
+            $dtStart->setTime(mt_rand(1,23), mt_rand(0,59), mt_rand(0,59));
+            $event->DTSTART->setDateTime($dtStart, VObject\Property\DateTime::UTC);
+            $event->DURATION = 'PT'.mt_rand(1,3).'H';
+            break;
+
+    }
+    
+    $calendar->add($event);
+    $currentDate->modify('+ ' . mt_rand(0,3) . ' days');
+
+}
+fwrite(STDERR, "Validating\n");
+
+$result = $calendar->validate();
+if ($result) {
+    fwrite(STDERR, "Errors!\n");
+    fwrite(STDERR, print_r($result,true));
+    die(-1);
+}
+
+fwrite(STDERR, "Serializing this beast\n");
+
+echo $calendar->serialize();
+
+fwrite(STDERR, "done.\n");
+
diff --git a/vendor/sabre/vobject/bin/rrulebench.php b/vendor/sabre/vobject/bin/rrulebench.php
new file mode 100644
index 0000000000000000000000000000000000000000..f151819c9909a56ed63584d15b49fc0a2787d6d7
--- /dev/null
+++ b/vendor/sabre/vobject/bin/rrulebench.php
@@ -0,0 +1,32 @@
+<?php
+
+include __DIR__ . '/../vendor/autoload.php';
+
+if ($argc < 4) {
+    echo "sabre/vobject ", Sabre\VObject\Version::VERSION, " RRULE benchmark\n";
+    echo "\n";
+    echo "This script can be used to measure the speed of the 'recurrence expansion'\n";
+    echo "system.";
+    echo "\n";
+    echo "Usage: " . $argv[0] . " inputfile.ics startdate enddate\n";
+    die();
+}
+
+list(, $inputFile, $startDate, $endDate) = $argv;
+
+$bench = new Hoa\Bench\Bench();
+$bench->parse->start();
+
+echo "Parsing.\n";
+$vobj = Sabre\VObject\Reader::read(fopen($inputFile,'r'));
+
+$bench->parse->stop();
+
+echo "Expanding.\n";
+$bench->expand->start();
+
+$vobj->expand(new DateTime($startDate), new DateTime($endDate));
+
+$bench->expand->stop();
+
+echo $bench,"\n";
diff --git a/vendor/sabre/vobject/bin/vobject b/vendor/sabre/vobject/bin/vobject
new file mode 100755
index 0000000000000000000000000000000000000000..e52b4fb574f02f635ec36862e9a5f0ba850505e7
--- /dev/null
+++ b/vendor/sabre/vobject/bin/vobject
@@ -0,0 +1,27 @@
+#!/usr/bin/env php
+<?php
+
+namespace Sabre\VObject;
+
+// This sucks.. we have to try to find the composer autoloader. But chances
+// are, we can't find it this way. So we'll do our bestest
+$paths = array(
+    __DIR__ . '/../vendor/autoload.php',  // In case vobject is cloned directly
+    __DIR__ . '/../../../autoload.php',   // In case vobject is a composer dependency.
+);
+
+foreach($paths as $path) {
+    if (file_exists($path)) {
+        include $path;
+        break;
+    }
+}
+
+if (!class_exists('Sabre\\VObject\\Version')) {
+    fwrite(STDERR, "Composer autoloader could not be loaded.\n");
+    die(1);
+}
+
+$cli = new Cli();
+exit($cli->main($argv));
+
diff --git a/vendor/sabre/vobject/composer.json b/vendor/sabre/vobject/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..309c08af9f618b5e9634188c835a080d66665821
--- /dev/null
+++ b/vendor/sabre/vobject/composer.json
@@ -0,0 +1,50 @@
+{
+    "name": "sabre/vobject",
+    "description" : "The VObject library for PHP allows you to easily parse and manipulate iCalendar and vCard objects",
+    "keywords" : [ "VObject", "iCalendar", "vCard", "jCard", "jCal" ],
+    "homepage" : "http://sabre.io/vobject/",
+    "license" : "BSD-3-Clause",
+    "require" : {
+        "php"          : ">=5.3.1",
+        "ext-mbstring" : "*"
+    },
+    "require-dev" : {
+        "phpunit/phpunit" : "*",
+        "squizlabs/php_codesniffer": "*"
+    },
+    "authors" : [
+        {
+            "name" : "Evert Pot",
+            "email" : "me@evertpot.com",
+            "homepage" : "http://evertpot.com/",
+            "role" : "Developer"
+        },
+        {
+            "name" : "Dominik Tobschall",
+            "email" : "dominik@fruux.com",
+            "homepage" : "http://tobschall.de/",
+            "role" : "Developer"
+        }
+    ],
+    "support" : {
+        "forum" : "https://groups.google.com/group/sabredav-discuss",
+        "source" : "https://github.com/fruux/sabre-vobject"
+    },
+    "autoload" : {
+        "psr-4" : {
+            "Sabre\\VObject\\" : "lib/"
+        }
+    },
+    "bin" : [
+        "bin/vobject",
+        "bin/generate_vcards"
+    ],
+    "extra" : {
+        "branch-alias" : {
+            "dev-master" : "3.2.x-dev"
+        }
+    },
+    "config" : {
+        "bin-dir" : "bin"
+    }
+}
diff --git a/vendor/sabre/vobject/lib/Cli.php b/vendor/sabre/vobject/lib/Cli.php
new file mode 100644
index 0000000000000000000000000000000000000000..4566e8e2fd4c2d8d0f65597f2a9f263b2eb1395e
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Cli.php
@@ -0,0 +1,761 @@
+<?php
+
+namespace Sabre\VObject;
+
+use
+    InvalidArgumentException;
+
+/**
+ * This is the CLI interface for sabre-vobject.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class Cli {
+
+    /**
+     * No output
+     *
+     * @var bool
+     */
+    protected $quiet = false;
+
+    /**
+     * Help display
+     *
+     * @var bool
+     */
+    protected $showHelp = false;
+
+    /**
+     * Wether to spit out 'mimedir' or 'json' format.
+     *
+     * @var string
+     */
+    protected $format;
+
+    /**
+     * JSON pretty print
+     *
+     * @var bool
+     */
+    protected $pretty;
+
+    /**
+     * Source file
+     *
+     * @var string
+     */
+    protected $inputPath;
+
+    /**
+     * Destination file
+     *
+     * @var string
+     */
+    protected $outputPath;
+
+    /**
+     * output stream
+     *
+     * @var resource
+     */
+    protected $stdout;
+
+    /**
+     * stdin
+     *
+     * @var resource
+     */
+    protected $stdin;
+
+    /**
+     * stderr
+     *
+     * @var resource
+     */
+    protected $stderr;
+
+    /**
+     * Input format (one of json or mimedir)
+     *
+     * @var string
+     */
+    protected $inputFormat;
+
+    /**
+     * Makes the parser less strict.
+     *
+     * @var bool
+     */
+    protected $forgiving = false;
+
+    /**
+     * Main function
+     *
+     * @return int
+     */
+    public function main(array $argv) {
+
+        // @codeCoverageIgnoreStart
+        // We cannot easily test this, so we'll skip it. Pretty basic anyway.
+
+        if (!$this->stderr) {
+            $this->stderr = fopen('php://stderr', 'w');
+        }
+        if (!$this->stdout) {
+            $this->stdout = fopen('php://stdout', 'w');
+        }
+        if (!$this->stdin) {
+            $this->stdin = fopen('php://stdin', 'r');
+        }
+
+        // @codeCoverageIgnoreEnd
+
+
+        try {
+
+            list($options, $positional) = $this->parseArguments($argv);
+
+            if (isset($options['q'])) {
+                $this->quiet = true;
+            }
+            $this->log($this->colorize('green', "sabre/vobject ") . $this->colorize('yellow', Version::VERSION));
+
+            foreach($options as $name=>$value) {
+
+                switch($name) {
+
+                    case 'q' :
+                        // Already handled earlier.
+                        break;
+                    case 'h' :
+                    case 'help' :
+                        $this->showHelp();
+                        return 0;
+                        break;
+                    case 'format' :
+                        switch($value) {
+
+                            // jcard/jcal documents
+                            case 'jcard' :
+                            case 'jcal' :
+
+                            // specific document versions
+                            case 'vcard21' :
+                            case 'vcard30' :
+                            case 'vcard40' :
+                            case 'icalendar20' :
+
+                            // specific formats
+                            case 'json' :
+                            case 'mimedir' :
+
+                            // icalendar/vcad
+                            case 'icalendar' :
+                            case 'vcard' :
+                                $this->format = $value;
+                                break;
+
+                            default :
+                                throw new InvalidArgumentException('Unknown format: ' . $value);
+
+                        }
+                        break;
+                    case 'pretty' :
+                        if (version_compare(PHP_VERSION, '5.4.0') >= 0) {
+                            $this->pretty = true;
+                        }
+                        break;
+                    case 'forgiving' :
+                        $this->forgiving = true;
+                        break;
+                    case 'inputformat' :
+                        switch($value) {
+                            // json formats
+                            case 'jcard' :
+                            case 'jcal' :
+                            case 'json' :
+                                $this->inputFormat = 'json';
+                                break;
+
+                            // mimedir formats
+                            case 'mimedir' :
+                            case 'icalendar' :
+                            case 'vcard' :
+                            case 'vcard21' :
+                            case 'vcard30' :
+                            case 'vcard40' :
+                            case 'icalendar20' :
+
+                                $this->inputFormat = 'mimedir';
+                                break;
+
+                            default :
+                                throw new InvalidArgumentException('Unknown format: ' . $value);
+
+                        }
+                        break;
+                    default :
+                        throw new InvalidArgumentException('Unknown option: ' . $name);
+
+                }
+
+            }
+
+            if (count($positional) === 0) {
+                $this->showHelp();
+                return 1;
+            }
+
+            if (count($positional) === 1) {
+                throw new InvalidArgumentException('Inputfile is a required argument');
+            }
+
+            if (count($positional) > 3) {
+                throw new InvalidArgumentException('Too many arguments');
+            }
+
+            if (!in_array($positional[0], array('validate','repair','convert','color'))) {
+                throw new InvalidArgumentException('Uknown command: ' . $positional[0]);
+            }
+
+        } catch (InvalidArgumentException $e) {
+            $this->showHelp();
+            $this->log('Error: ' . $e->getMessage(), 'red');
+            return 1;
+        }
+
+        $command = $positional[0];
+
+        $this->inputPath = $positional[1];
+        $this->outputPath = isset($positional[2])?$positional[2]:'-';
+
+        if ($this->outputPath !== '-') {
+            $this->stdout = fopen($this->outputPath, 'w');
+        }
+
+        if (!$this->inputFormat) {
+            if (substr($this->inputPath, -5)==='.json') {
+                $this->inputFormat = 'json';
+            } else {
+                $this->inputFormat = 'mimedir';
+            }
+        }
+        if (!$this->format) {
+            if (substr($this->outputPath,-5)==='.json') {
+                $this->format = 'json';
+            } else {
+                $this->format = 'mimedir';
+            }
+        }
+
+
+        $realCode = 0;
+
+        try {
+
+            while($input = $this->readInput()) {
+
+                $returnCode = $this->$command($input);
+                if ($returnCode!==0) $realCode = $returnCode;
+
+            }
+
+        } catch (EofException $e) {
+            // end of file
+        } catch (\Exception $e) {
+            $this->log('Error: ' . $e->getMessage(),'red');
+            return 2;
+        }
+
+        return $realCode;
+
+    }
+
+    /**
+     * Shows the help message.
+     *
+     * @return void
+     */
+    protected function showHelp() {
+
+        $this->log('Usage:', 'yellow');
+        $this->log("  vobject [options] command [arguments]");
+        $this->log('');
+        $this->log('Options:', 'yellow');
+        $this->log($this->colorize('green', '  -q            ') . "Don't output anything.");
+        $this->log($this->colorize('green', '  -help -h      ') . "Display this help message.");
+        $this->log($this->colorize('green', '  --format      ') . "Convert to a specific format. Must be one of: vcard, vcard21,");
+        $this->log($this->colorize('green', '  --forgiving   ') . "Makes the parser less strict.");
+        $this->log("                vcard30, vcard40, icalendar20, jcal, jcard, json, mimedir.");
+        $this->log($this->colorize('green', '  --inputformat ') . "If the input format cannot be guessed from the extension, it");
+        $this->log("                must be specified here.");
+        // Only PHP 5.4 and up
+        if (version_compare(PHP_VERSION, '5.4.0') >= 0) {
+            $this->log($this->colorize('green', '  --pretty      ') . "json pretty-print.");
+        }
+        $this->log('');
+        $this->log('Commands:', 'yellow');
+        $this->log($this->colorize('green', '  validate') . ' source_file              Validates a file for correctness.');
+        $this->log($this->colorize('green', '  repair') . ' source_file [output_file]  Repairs a file.');
+        $this->log($this->colorize('green', '  convert') . ' source_file [output_file] Converts a file.');
+        $this->log($this->colorize('green', '  color') . ' source_file                 Colorize a file, useful for debbugging.');
+        $this->log(
+        <<<HELP
+
+If source_file is set as '-', STDIN will be used.
+If output_file is omitted, STDOUT will be used.
+All other output is sent to STDERR.
+
+HELP
+        );
+
+        $this->log('Examples:', 'yellow');
+        $this->log('   vobject convert contact.vcf contact.json');
+        $this->log('   vobject convert --format=vcard40 old.vcf new.vcf');
+        $this->log('   vobject convert --inputformat=json --format=mimedir - -');
+        $this->log('   vobject color calendar.ics');
+        $this->log('');
+        $this->log('https://github.com/fruux/sabre-vobject','purple');
+
+    }
+
+    /**
+     * Validates a VObject file
+     *
+     * @param Component $vObj
+     * @return int
+     */
+    protected function validate($vObj) {
+
+        $returnCode = 0;
+
+        switch($vObj->name) {
+            case 'VCALENDAR' :
+                $this->log("iCalendar: " . (string)$vObj->VERSION);
+                break;
+            case 'VCARD' :
+                $this->log("vCard: " . (string)$vObj->VERSION);
+                break;
+        }
+
+        $warnings = $vObj->validate();
+        if (!count($warnings)) {
+            $this->log("  No warnings!");
+        } else {
+
+            $levels = array(
+                1 => 'REPAIRED',
+                2 => 'WARNING',
+                3 => 'ERROR',
+            );
+            $returnCode = 2;
+            foreach($warnings as $warn) {
+
+                $extra = '';
+                if ($warn['node'] instanceof Property) {
+                    $extra = ' (property: "' . $warn['node']->name . '")';
+                }
+                $this->log("  [" . $levels[$warn['level']] . '] ' . $warn['message'] . $extra);
+
+            }
+
+        }
+
+        return $returnCode;
+
+    }
+
+    /**
+     * Repairs a VObject file
+     *
+     * @param Component $vObj
+     * @return int
+     */
+    protected function repair($vObj) {
+
+        $returnCode = 0;
+
+        switch($vObj->name) {
+            case 'VCALENDAR' :
+                $this->log("iCalendar: " . (string)$vObj->VERSION);
+                break;
+            case 'VCARD' :
+                $this->log("vCard: " . (string)$vObj->VERSION);
+                break;
+        }
+
+        $warnings = $vObj->validate(Node::REPAIR);
+        if (!count($warnings)) {
+            $this->log("  No warnings!");
+        } else {
+
+            $levels = array(
+                1 => 'REPAIRED',
+                2 => 'WARNING',
+                3 => 'ERROR',
+            );
+            $returnCode = 2;
+            foreach($warnings as $warn) {
+
+                $extra = '';
+                if ($warn['node'] instanceof Property) {
+                    $extra = ' (property: "' . $warn['node']->name . '")';
+                }
+                $this->log("  [" . $levels[$warn['level']] . '] ' . $warn['message'] . $extra);
+
+            }
+
+        }
+        fwrite($this->stdout, $vObj->serialize());
+
+        return $returnCode;
+
+    }
+
+    /**
+     * Converts a vObject file to a new format.
+     *
+     * @param Component $vObj
+     * @return int
+     */
+    protected function convert($vObj) {
+
+        $json = false;
+        $convertVersion = null;
+        $forceInput = null;
+
+        switch($this->format) {
+            case 'json' :
+                $json = true;
+                if ($vObj->name === 'VCARD') {
+                    $convertVersion = Document::VCARD40;
+                }
+                break;
+            case 'jcard' :
+                $json = true;
+                $forceInput = 'VCARD';
+                $convertVersion = Document::VCARD40;
+                break;
+            case 'jcal' :
+                $json = true;
+                $forceInput = 'VCALENDAR';
+                break;
+            case 'mimedir' :
+            case 'icalendar' :
+            case 'icalendar20' :
+            case 'vcard' :
+                break;
+            case 'vcard21' :
+                $convertVersion = Document::VCARD21;
+                break;
+            case 'vcard30' :
+                $convertVersion = Document::VCARD30;
+                break;
+            case 'vcard40' :
+                $convertVersion = Document::VCARD40;
+                break;
+
+        }
+
+        if ($forceInput && $vObj->name !== $forceInput) {
+            throw new \Exception('You cannot convert a ' . strtolower($vObj->name) . ' to ' . $this->format);
+        }
+        if ($convertVersion) {
+            $vObj = $vObj->convert($convertVersion);
+        }
+        if ($json) {
+            $jsonOptions = 0;
+            if ($this->pretty) {
+                $jsonOptions = JSON_PRETTY_PRINT;
+            }
+            fwrite($this->stdout, json_encode($vObj->jsonSerialize(), $jsonOptions));
+        } else {
+            fwrite($this->stdout, $vObj->serialize());
+        }
+
+        return 0;
+
+    }
+
+    /**
+     * Colorizes a file
+     *
+     * @param Component $vObj
+     * @return int
+     */
+    protected function color($vObj) {
+
+        fwrite($this->stdout, $this->serializeComponent($vObj));
+
+    }
+
+    /**
+     * Returns an ansi color string for a color name.
+     *
+     * @param string $color
+     * @return string
+     */
+    protected function colorize($color, $str, $resetTo = 'default') {
+
+        $colors = array(
+            'cyan'    => '1;36',
+            'red'     => '1;31',
+            'yellow'  => '1;33',
+            'blue'    => '0;34',
+            'green'   => '0;32',
+            'default' => '0',
+            'purple'  => '0;35',
+        );
+        return "\033[" . $colors[$color] . 'm' . $str . "\033[".$colors[$resetTo]."m";
+
+    }
+
+    /**
+     * Writes out a string in specific color.
+     *
+     * @param string $color
+     * @param string $str
+     * @return void
+     */
+    protected function cWrite($color, $str) {
+
+        fwrite($this->stdout, $this->colorize($color, $str));
+
+    }
+
+    protected function serializeComponent(Component $vObj) {
+
+        $this->cWrite('cyan', 'BEGIN');
+        $this->cWrite('red', ':');
+        $this->cWrite('yellow', $vObj->name . "\n");
+
+        /**
+         * Gives a component a 'score' for sorting purposes.
+         *
+         * This is solely used by the childrenSort method.
+         *
+         * A higher score means the item will be lower in the list.
+         * To avoid score collisions, each "score category" has a reasonable
+         * space to accomodate elements. The $key is added to the $score to
+         * preserve the original relative order of elements.
+         *
+         * @param int $key
+         * @param array $array
+         * @return int
+         */
+        $sortScore = function($key, $array) {
+
+            if ($array[$key] instanceof Component) {
+
+                // We want to encode VTIMEZONE first, this is a personal
+                // preference.
+                if ($array[$key]->name === 'VTIMEZONE') {
+                    $score=300000000;
+                    return $score+$key;
+                } else {
+                    $score=400000000;
+                    return $score+$key;
+                }
+            } else {
+                // Properties get encoded first
+                // VCARD version 4.0 wants the VERSION property to appear first
+                if ($array[$key] instanceof Property) {
+                    if ($array[$key]->name === 'VERSION') {
+                        $score=100000000;
+                        return $score+$key;
+                    } else {
+                        // All other properties
+                        $score=200000000;
+                        return $score+$key;
+                    }
+                }
+            }
+
+        };
+
+        $tmp = $vObj->children;
+        uksort(
+            $vObj->children,
+            function($a, $b) use ($sortScore, $tmp) {
+
+                $sA = $sortScore($a, $tmp);
+                $sB = $sortScore($b, $tmp);
+
+                return $sA - $sB;
+
+            }
+        );
+
+        foreach($vObj->children as $child) {
+            if ($child instanceof Component) {
+                $this->serializeComponent($child);
+            } else {
+                $this->serializeProperty($child);
+            }
+        }
+
+        $this->cWrite('cyan', 'END');
+        $this->cWrite('red', ':');
+        $this->cWrite('yellow', $vObj->name . "\n");
+
+    }
+
+    /**
+     * Colorizes a property.
+     *
+     * @param Property $property
+     * @return void
+     */
+    protected function serializeProperty(Property $property) {
+
+        if ($property->group) {
+            $this->cWrite('default', $property->group);
+            $this->cWrite('red', '.');
+        }
+
+        $str = '';
+        $this->cWrite('yellow', $property->name);
+
+        foreach($property->parameters as $param) {
+
+            $this->cWrite('red',';');
+            $this->cWrite('blue', $param->serialize());
+
+        }
+        $this->cWrite('red',':');
+
+        if ($property instanceof Property\Binary) {
+
+            $this->cWrite('default', 'embedded binary stripped. (' . strlen($property->getValue()) . ' bytes)');
+
+        } else {
+
+            $parts = $property->getParts();
+            $first1 = true;
+            // Looping through property values
+            foreach($parts as $part) {
+                if ($first1) {
+                    $first1 = false;
+                } else {
+                    $this->cWrite('red', $property->delimiter);
+                }
+                $first2 = true;
+                // Looping through property sub-values
+                foreach((array)$part as $subPart) {
+                    if ($first2) {
+                        $first2 = false;
+                    } else {
+                        // The sub-value delimiter is always comma
+                        $this->cWrite('red', ',');
+                    }
+
+                    $subPart = strtr(
+                        $subPart,
+                        array(
+                            '\\' => $this->colorize('purple', '\\\\', 'green'),
+                            ';'  => $this->colorize('purple', '\;', 'green'),
+                            ','  => $this->colorize('purple', '\,', 'green'),
+                            "\n" => $this->colorize('purple', "\\n\n\t", 'green'),
+                            "\r" => "",
+                        )
+                    );
+
+                    $this->cWrite('green', $subPart);
+                }
+            }
+
+        }
+        $this->cWrite("default", "\n");
+
+    }
+
+    /**
+     * Parses the list of arguments.
+     *
+     * @param array $argv
+     * @return void
+     */
+    protected function parseArguments(array $argv) {
+
+        $positional = array();
+        $options = array();
+
+        for($ii=0; $ii < count($argv); $ii++) {
+
+            // Skipping the first argument.
+            if ($ii===0) continue;
+
+            $v = $argv[$ii];
+
+            if (substr($v,0,2)==='--') {
+                // This is a long-form option.
+                $optionName = substr($v,2);
+                $optionValue = true;
+                if (strpos($optionName,'=')) {
+                    list($optionName, $optionValue) = explode('=', $optionName);
+                }
+                $options[$optionName] = $optionValue;
+            } elseif (substr($v,0,1) === '-' && strlen($v)>1) {
+                // This is a short-form option.
+                foreach(str_split(substr($v,1)) as $option) {
+                    $options[$option] = true;
+                }
+
+            } else {
+
+                $positional[] = $v;
+
+            }
+
+        }
+
+        return array($options, $positional);
+
+    }
+
+    protected $parser;
+
+    /**
+     * Reads the input file
+     *
+     * @return Component
+     */
+    protected function readInput() {
+
+        if (!$this->parser) {
+            if ($this->inputPath!=='-') {
+                $this->stdin = fopen($this->inputPath,'r');
+            }
+
+            if ($this->inputFormat === 'mimedir') {
+                $this->parser = new Parser\MimeDir($this->stdin, ($this->forgiving?Reader::OPTION_FORGIVING:0));
+            } else {
+                $this->parser = new Parser\Json($this->stdin, ($this->forgiving?Reader::OPTION_FORGIVING:0));
+            }
+        }
+
+        return $this->parser->parse();
+
+    }
+
+    /**
+     * Sends a message to STDERR.
+     *
+     * @param string $msg
+     * @return void
+     */
+    protected function log($msg, $color = 'default') {
+
+        if (!$this->quiet) {
+            if ($color!=='default') {
+                $msg = $this->colorize($color, $msg);
+            }
+            fwrite($this->stderr, $msg . "\n");
+        }
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/Component.php b/vendor/sabre/vobject/lib/Component.php
new file mode 100644
index 0000000000000000000000000000000000000000..e5ce3f400b5558c79d46ad2ae3d4e507b8fc5a40
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Component.php
@@ -0,0 +1,595 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * Component
+ *
+ * A component represents a group of properties, such as VCALENDAR, VEVENT, or
+ * VCARD.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class Component extends Node {
+
+    /**
+     * Component name.
+     *
+     * This will contain a string such as VEVENT, VTODO, VCALENDAR, VCARD.
+     *
+     * @var string
+     */
+    public $name;
+
+    /**
+     * A list of properties and/or sub-components.
+     *
+     * @var array
+     */
+    public $children = array();
+
+    /**
+     * Creates a new component.
+     *
+     * You can specify the children either in key=>value syntax, in which case
+     * properties will automatically be created, or you can just pass a list of
+     * Component and Property object.
+     *
+     * By default, a set of sensible values will be added to the component. For
+     * an iCalendar object, this may be something like CALSCALE:GREGORIAN. To
+     * ensure that this does not happen, set $defaults to false.
+     *
+     * @param Document $root
+     * @param string $name such as VCALENDAR, VEVENT.
+     * @param array $children
+     * @param bool $defaults
+     * @return void
+     */
+    function __construct(Document $root, $name, array $children = array(), $defaults = true) {
+
+        $this->name = strtoupper($name);
+        $this->root = $root;
+
+        if ($defaults) {
+            // This is a terribly convoluted way to do this, but this ensures
+            // that the order of properties as they are specified in both
+            // defaults and the childrens list, are inserted in the object in a
+            // natural way.
+            $list = $this->getDefaults();
+            $nodes = array();
+            foreach($children as $key=>$value) {
+                if ($value instanceof Node) {
+                    if (isset($list[$value->name])) {
+                        unset($list[$value->name]);
+                    }
+                    $nodes[] = $value;
+                } else {
+                    $list[$key] = $value;
+                }
+            }
+            foreach($list as $key=>$value) {
+                $this->add($key, $value);
+            }
+            foreach($nodes as $node) {
+                $this->add($node);
+            }
+        } else {
+            foreach($children as $k=>$child) {
+                if ($child instanceof Node) {
+
+                    // Component or Property
+                    $this->add($child);
+                } else {
+
+                    // Property key=>value
+                    $this->add($k, $child);
+                }
+            }
+        }
+
+    }
+
+    /**
+     * Adds a new property or component, and returns the new item.
+     *
+     * This method has 3 possible signatures:
+     *
+     * add(Component $comp) // Adds a new component
+     * add(Property $prop)  // Adds a new property
+     * add($name, $value, array $parameters = array()) // Adds a new property
+     * add($name, array $children = array()) // Adds a new component
+     * by name.
+     *
+     * @return Node
+     */
+    function add($a1, $a2 = null, $a3 = null) {
+
+        if ($a1 instanceof Node) {
+            if (!is_null($a2)) {
+                throw new \InvalidArgumentException('The second argument must not be specified, when passing a VObject Node');
+            }
+            $a1->parent = $this;
+            $this->children[] = $a1;
+
+            return $a1;
+
+        } elseif(is_string($a1)) {
+
+            $item = $this->root->create($a1, $a2, $a3);
+            $item->parent = $this;
+            $this->children[] = $item;
+
+            return $item;
+
+        } else {
+
+            throw new \InvalidArgumentException('The first argument must either be a \\Sabre\\VObject\\Node or a string');
+
+        }
+
+    }
+
+    /**
+     * This method removes a component or property from this component.
+     *
+     * You can either specify the item by name (like DTSTART), in which case
+     * all properties/components with that name will be removed, or you can
+     * pass an instance of a property or component, in which case only that
+     * exact item will be removed.
+     *
+     * The removed item will be returned. In case there were more than 1 items
+     * removed, only the last one will be returned.
+     *
+     * @param mixed $item
+     * @return void
+     */
+    function remove($item) {
+
+        if (is_string($item)) {
+            $children = $this->select($item);
+            foreach($children as $k=>$child) {
+                unset($this->children[$k]);
+            }
+            return $child;
+        } else {
+            foreach($this->children as $k => $child) {
+                if ($child===$item) {
+                    unset($this->children[$k]);
+                    return $child;
+                }
+            }
+
+            throw new \InvalidArgumentException('The item you passed to remove() was not a child of this component');
+
+        }
+
+    }
+
+    /**
+     * Returns an iterable list of children
+     *
+     * @return array
+     */
+    function children() {
+
+        return $this->children;
+
+    }
+
+    /**
+     * This method only returns a list of sub-components. Properties are
+     * ignored.
+     *
+     * @return array
+     */
+    function getComponents() {
+
+        $result = array();
+        foreach($this->children as $child) {
+            if ($child instanceof Component) {
+                $result[] = $child;
+            }
+        }
+
+        return $result;
+
+    }
+
+    /**
+     * Returns an array with elements that match the specified name.
+     *
+     * This function is also aware of MIME-Directory groups (as they appear in
+     * vcards). This means that if a property is grouped as "HOME.EMAIL", it
+     * will also be returned when searching for just "EMAIL". If you want to
+     * search for a property in a specific group, you can select on the entire
+     * string ("HOME.EMAIL"). If you want to search on a specific property that
+     * has not been assigned a group, specify ".EMAIL".
+     *
+     * Keys are retained from the 'children' array, which may be confusing in
+     * certain cases.
+     *
+     * @param string $name
+     * @return array
+     */
+    function select($name) {
+
+        $group = null;
+        $name = strtoupper($name);
+        if (strpos($name,'.')!==false) {
+            list($group,$name) = explode('.', $name, 2);
+        }
+
+        $result = array();
+        foreach($this->children as $key=>$child) {
+
+            if (
+                (
+                    strtoupper($child->name) === $name
+                    && (is_null($group) || ( $child instanceof Property && strtoupper($child->group) === $group))
+                )
+                ||
+                (
+                    $name === '' && $child instanceof Property && strtoupper($child->group) === $group
+                )
+            ) {
+
+                $result[$key] = $child;
+
+            }
+        }
+
+        reset($result);
+        return $result;
+
+    }
+
+    /**
+     * Turns the object back into a serialized blob.
+     *
+     * @return string
+     */
+    function serialize() {
+
+        $str = "BEGIN:" . $this->name . "\r\n";
+
+        /**
+         * Gives a component a 'score' for sorting purposes.
+         *
+         * This is solely used by the childrenSort method.
+         *
+         * A higher score means the item will be lower in the list.
+         * To avoid score collisions, each "score category" has a reasonable
+         * space to accomodate elements. The $key is added to the $score to
+         * preserve the original relative order of elements.
+         *
+         * @param int $key
+         * @param array $array
+         * @return int
+         */
+        $sortScore = function($key, $array) {
+
+            if ($array[$key] instanceof Component) {
+
+                // We want to encode VTIMEZONE first, this is a personal
+                // preference.
+                if ($array[$key]->name === 'VTIMEZONE') {
+                    $score=300000000;
+                    return $score+$key;
+                } else {
+                    $score=400000000;
+                    return $score+$key;
+                }
+            } else {
+                // Properties get encoded first
+                // VCARD version 4.0 wants the VERSION property to appear first
+                if ($array[$key] instanceof Property) {
+                    if ($array[$key]->name === 'VERSION') {
+                        $score=100000000;
+                        return $score+$key;
+                    } else {
+                        // All other properties
+                        $score=200000000;
+                        return $score+$key;
+                    }
+                }
+            }
+
+        };
+
+        $tmp = $this->children;
+        uksort(
+            $this->children,
+            function($a, $b) use ($sortScore, $tmp) {
+
+                $sA = $sortScore($a, $tmp);
+                $sB = $sortScore($b, $tmp);
+
+                return $sA - $sB;
+
+            }
+        );
+
+        foreach($this->children as $child) $str.=$child->serialize();
+        $str.= "END:" . $this->name . "\r\n";
+
+        return $str;
+
+    }
+
+    /**
+     * This method returns an array, with the representation as it should be
+     * encoded in json. This is used to create jCard or jCal documents.
+     *
+     * @return array
+     */
+    function jsonSerialize() {
+
+        $components = array();
+        $properties = array();
+
+        foreach($this->children as $child) {
+            if ($child instanceof Component) {
+                $components[] = $child->jsonSerialize();
+            } else {
+                $properties[] = $child->jsonSerialize();
+            }
+        }
+
+        return array(
+            strtolower($this->name),
+            $properties,
+            $components
+        );
+
+    }
+
+    /**
+     * This method should return a list of default property values.
+     *
+     * @return array
+     */
+    protected function getDefaults() {
+
+        return array();
+
+    }
+
+    /* Magic property accessors {{{ */
+
+    /**
+     * Using 'get' you will either get a property or component.
+     *
+     * If there were no child-elements found with the specified name,
+     * null is returned.
+     *
+     * To use this, this may look something like this:
+     *
+     * $event = $calendar->VEVENT;
+     *
+     * @param string $name
+     * @return Property
+     */
+    function __get($name) {
+
+        $matches = $this->select($name);
+        if (count($matches)===0) {
+            return null;
+        } else {
+            $firstMatch = current($matches);
+            /** @var $firstMatch Property */
+            $firstMatch->setIterator(new ElementList(array_values($matches)));
+            return $firstMatch;
+        }
+
+    }
+
+    /**
+     * This method checks if a sub-element with the specified name exists.
+     *
+     * @param string $name
+     * @return bool
+     */
+    function __isset($name) {
+
+        $matches = $this->select($name);
+        return count($matches)>0;
+
+    }
+
+    /**
+     * Using the setter method you can add properties or subcomponents
+     *
+     * You can either pass a Component, Property
+     * object, or a string to automatically create a Property.
+     *
+     * If the item already exists, it will be removed. If you want to add
+     * a new item with the same name, always use the add() method.
+     *
+     * @param string $name
+     * @param mixed $value
+     * @return void
+     */
+    function __set($name, $value) {
+
+        $matches = $this->select($name);
+        $overWrite = count($matches)?key($matches):null;
+
+        if ($value instanceof Component || $value instanceof Property) {
+            $value->parent = $this;
+            if (!is_null($overWrite)) {
+                $this->children[$overWrite] = $value;
+            } else {
+                $this->children[] = $value;
+            }
+        } else {
+            $property = $this->root->create($name,$value);
+            $property->parent = $this;
+            if (!is_null($overWrite)) {
+                $this->children[$overWrite] = $property;
+            } else {
+                $this->children[] = $property;
+            }
+        }
+    }
+
+    /**
+     * Removes all properties and components within this component with the
+     * specified name.
+     *
+     * @param string $name
+     * @return void
+     */
+    function __unset($name) {
+
+        $matches = $this->select($name);
+        foreach($matches as $k=>$child) {
+
+            unset($this->children[$k]);
+            $child->parent = null;
+
+        }
+
+    }
+
+    /* }}} */
+
+    /**
+     * This method is automatically called when the object is cloned.
+     * Specifically, this will ensure all child elements are also cloned.
+     *
+     * @return void
+     */
+    function __clone() {
+
+        foreach($this->children as $key=>$child) {
+            $this->children[$key] = clone $child;
+            $this->children[$key]->parent = $this;
+        }
+
+    }
+
+    /**
+     * A simple list of validation rules.
+     *
+     * This is simply a list of properties, and how many times they either
+     * must or must not appear.
+     *
+     * Possible values per property:
+     *   * 0 - Must not appear.
+     *   * 1 - Must appear exactly once.
+     *   * + - Must appear at least once.
+     *   * * - Can appear any number of times.
+     *   * ? - May appear, but not more than once.
+     *
+     * It is also possible to specify defaults and severity levels for
+     * violating the rule.
+     *
+     * See the VEVENT implementation for getValidationRules for a more complex
+     * example.
+     *
+     * @var array
+     */
+    function getValidationRules() {
+
+        return array();
+
+    }
+
+    /**
+     * Validates the node for correctness.
+     *
+     * The following options are supported:
+     *   Node::REPAIR - May attempt to automatically repair the problem.
+     *   Node::PROFILE_CARDDAV - Validate the vCard for CardDAV purposes.
+     *   Node::PROFILE_CALDAV - Validate the iCalendar for CalDAV purposes.
+     *
+     * This method returns an array with detected problems.
+     * Every element has the following properties:
+     *
+     *  * level - problem level.
+     *  * message - A human-readable string describing the issue.
+     *  * node - A reference to the problematic node.
+     *
+     * The level means:
+     *   1 - The issue was repaired (only happens if REPAIR was turned on).
+     *   2 - A warning.
+     *   3 - An error.
+     *
+     * @param int $options
+     * @return array
+     */
+    function validate($options = 0) {
+
+        $rules = $this->getValidationRules();
+        $defaults = $this->getDefaults();
+
+        $propertyCounters = array();
+
+        $messages = array();
+
+        foreach($this->children as $child) {
+            $name = strtoupper($child->name);
+            if (!isset($propertyCounters[$name])) {
+                $propertyCounters[$name] = 1;
+            } else {
+                $propertyCounters[$name]++;
+            }
+            $messages = array_merge($messages, $child->validate($options));
+        }
+
+        foreach($rules as $propName => $rule) {
+
+            switch($rule) {
+                case '0' :
+                    if (isset($propertyCounters[$propName])) {
+                        $messages[] = array(
+                            'level' => 3,
+                            'message' => $propName . ' MUST NOT appear in a ' . $this->name . ' component',
+                            'node' => $this,
+                        );
+                    }
+                    break;
+                case '1' :
+                    if (!isset($propertyCounters[$propName]) || $propertyCounters[$propName]!==1) {
+                        $repaired = false;
+                        if ($options & self::REPAIR && isset($defaults[$propName])) {
+                            $this->add($propName, $defaults[$propName]);
+                        }
+                        $messages[] = array(
+                            'level' => $repaired?1:3,
+                            'message' => $propName . ' MUST appear exactly once in a ' . $this->name . ' component',
+                            'node' => $this,
+                        );
+                    }
+                    break;
+                case '+' :
+                    if (!isset($propertyCounters[$propName]) || $propertyCounters[$propName] < 1) {
+                        $messages[] = array(
+                            'level' => 3,
+                            'message' => $propName . ' MUST appear at least once in a ' . $this->name . ' component',
+                            'node' => $this,
+                        );
+                    }
+                    break;
+                case '*' :
+                    break;
+                case '?' :
+                    if (isset($propertyCounters[$propName]) && $propertyCounters[$propName] > 1) {
+                        $messages[] = array(
+                            'level' => 3,
+                            'message' => $propName . ' MUST NOT appear more than once in a ' . $this->name . ' component',
+                            'node' => $this,
+                        );
+                    }
+                    break;
+
+            }
+
+        }
+        return $messages;
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/Component/Available.php b/vendor/sabre/vobject/lib/Component/Available.php
new file mode 100644
index 0000000000000000000000000000000000000000..2460fe3b1e8acd4a51450c07ed91acd687350877
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Component/Available.php
@@ -0,0 +1,108 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject;
+
+/**
+ * The Available sub-component
+ *
+ * This component adds functionality to a component, specific for AVAILABLE
+ * components.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Ivan Enderlin
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class Available extends VObject\Component {
+
+    /**
+     * A simple list of validation rules.
+     *
+     * This is simply a list of properties, and how many times they either
+     * must or must not appear.
+     *
+     * Possible values per property:
+     *   * 0 - Must not appear.
+     *   * 1 - Must appear exactly once.
+     *   * + - Must appear at least once.
+     *   * * - Can appear any number of times.
+     *   * ? - May appear, but not more than once.
+     *
+     * @var array
+     */
+    function getValidationRules() {
+
+        return array(
+            'UID' => 1,
+            'DTSTART' => 1,
+            'DTSTAMP' => 1,
+
+            'DTEND' => '?',
+            'DURATION' => '?',
+
+            'CREATED' => '?',
+            'DESCRIPTION' => '?',
+            'LAST-MODIFIED' => '?',
+            'RECURRENCE-ID' => '?',
+            'RRULE' => '?',
+            'SUMMARY' => '?',
+
+            'CATEGORIES' => '*',
+            'COMMENT' => '*',
+            'CONTACT' => '*',
+            'EXDATE' => '*',
+            'RDATE' => '*',
+
+            'AVAILABLE' => '*',
+        );
+
+    }
+
+    /**
+     * Validates the node for correctness.
+     *
+     * The following options are supported:
+     *   Node::REPAIR - May attempt to automatically repair the problem.
+     *   Node::PROFILE_CARDDAV - Validate the vCard for CardDAV purposes.
+     *   Node::PROFILE_CALDAV - Validate the iCalendar for CalDAV purposes.
+     *
+     * This method returns an array with detected problems.
+     * Every element has the following properties:
+     *
+     *  * level - problem level.
+     *  * message - A human-readable string describing the issue.
+     *  * node - A reference to the problematic node.
+     *
+     * The level means:
+     *   1 - The issue was repaired (only happens if REPAIR was turned on).
+     *   2 - A warning.
+     *   3 - An error.
+     *
+     * @param int $options
+     * @return array
+     */
+    function validate($options = 0) {
+
+        $result = parent::validate($options);
+
+        if (isset($this->DTEND) && isset($this->DURATION)) {
+            $result[] = array(
+                'level' => 3,
+                'message' => 'DTEND and DURATION cannot both be present',
+                'node' => $this
+            );
+        }
+
+        if (isset($this->DURATION) && !isset($this->DTSTART)) {
+            $result[] = array(
+                'level' => 3,
+                'message' => 'DURATION must be declared with a DTSTART.',
+                'node' => $this
+            );
+        }
+
+        return $result;
+
+    }
+}
diff --git a/vendor/sabre/vobject/lib/Component/VAlarm.php b/vendor/sabre/vobject/lib/Component/VAlarm.php
new file mode 100644
index 0000000000000000000000000000000000000000..1013e6e9b68205a0eb1c1dd348aed9df7ef6aed1
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Component/VAlarm.php
@@ -0,0 +1,137 @@
+<?php
+
+namespace Sabre\VObject\Component;
+use Sabre\VObject;
+
+/**
+ * VAlarm component
+ *
+ * This component contains some additional functionality specific for VALARMs.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class VAlarm extends VObject\Component {
+
+    /**
+     * Returns a DateTime object when this alarm is going to trigger.
+     *
+     * This ignores repeated alarm, only the first trigger is returned.
+     *
+     * @return DateTime
+     */
+    public function getEffectiveTriggerTime() {
+
+        $trigger = $this->TRIGGER;
+        if(!isset($trigger['VALUE']) || strtoupper($trigger['VALUE']) === 'DURATION') {
+            $triggerDuration = VObject\DateTimeParser::parseDuration($this->TRIGGER);
+            $related = (isset($trigger['RELATED']) && strtoupper($trigger['RELATED']) == 'END') ? 'END' : 'START';
+
+            $parentComponent = $this->parent;
+            if ($related === 'START') {
+
+                if ($parentComponent->name === 'VTODO') {
+                    $propName = 'DUE';
+                } else {
+                    $propName = 'DTSTART';
+                }
+
+                $effectiveTrigger = clone $parentComponent->$propName->getDateTime();
+                $effectiveTrigger->add($triggerDuration);
+            } else {
+                if ($parentComponent->name === 'VTODO') {
+                    $endProp = 'DUE';
+                } elseif ($parentComponent->name === 'VEVENT') {
+                    $endProp = 'DTEND';
+                } else {
+                    throw new \LogicException('time-range filters on VALARM components are only supported when they are a child of VTODO or VEVENT');
+                }
+
+                if (isset($parentComponent->$endProp)) {
+                    $effectiveTrigger = clone $parentComponent->$endProp->getDateTime();
+                    $effectiveTrigger->add($triggerDuration);
+                } elseif (isset($parentComponent->DURATION)) {
+                    $effectiveTrigger = clone $parentComponent->DTSTART->getDateTime();
+                    $duration = VObject\DateTimeParser::parseDuration($parentComponent->DURATION);
+                    $effectiveTrigger->add($duration);
+                    $effectiveTrigger->add($triggerDuration);
+                } else {
+                    $effectiveTrigger = clone $parentComponent->DTSTART->getDateTime();
+                    $effectiveTrigger->add($triggerDuration);
+                }
+            }
+        } else {
+            $effectiveTrigger = $trigger->getDateTime();
+        }
+        return $effectiveTrigger;
+
+    }
+
+    /**
+     * Returns true or false depending on if the event falls in the specified
+     * time-range. This is used for filtering purposes.
+     *
+     * The rules used to determine if an event falls within the specified
+     * time-range is based on the CalDAV specification.
+     *
+     * @param \DateTime $start
+     * @param \DateTime $end
+     * @return bool
+     */
+    public function isInTimeRange(\DateTime $start, \DateTime $end) {
+
+        $effectiveTrigger = $this->getEffectiveTriggerTime();
+
+        if (isset($this->DURATION)) {
+            $duration = VObject\DateTimeParser::parseDuration($this->DURATION);
+            $repeat = (string)$this->repeat;
+            if (!$repeat) {
+                $repeat = 1;
+            }
+
+            $period = new \DatePeriod($effectiveTrigger, $duration, (int)$repeat);
+
+            foreach($period as $occurrence) {
+
+                if ($start <= $occurrence && $end > $occurrence) {
+                    return true;
+                }
+            }
+            return false;
+        } else {
+            return ($start <= $effectiveTrigger && $end > $effectiveTrigger);
+        }
+
+    }
+
+    /**
+     * A simple list of validation rules.
+     *
+     * This is simply a list of properties, and how many times they either
+     * must or must not appear.
+     *
+     * Possible values per property:
+     *   * 0 - Must not appear.
+     *   * 1 - Must appear exactly once.
+     *   * + - Must appear at least once.
+     *   * * - Can appear any number of times.
+     *   * ? - May appear, but not more than once.
+     *
+     * @var array
+     */
+    public function getValidationRules() {
+
+        return array(
+            'ACTION' => 1,
+            'TRIGGER' => 1,
+
+            'DURATION' => '?',
+            'REPEAT' => '?',
+
+            'ATTACH' => '?',
+        );
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/Component/VAvailability.php b/vendor/sabre/vobject/lib/Component/VAvailability.php
new file mode 100644
index 0000000000000000000000000000000000000000..144126081c0a8e91f6b9f1b1369299e376537743
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Component/VAvailability.php
@@ -0,0 +1,99 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject;
+
+/**
+ * The VAvailability component
+ *
+ * This component adds functionality to a component, specific for VAVAILABILITY
+ * components.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Ivan Enderlin
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class VAvailability extends VObject\Component {
+
+    /**
+     * A simple list of validation rules.
+     *
+     * This is simply a list of properties, and how many times they either
+     * must or must not appear.
+     *
+     * Possible values per property:
+     *   * 0 - Must not appear.
+     *   * 1 - Must appear exactly once.
+     *   * + - Must appear at least once.
+     *   * * - Can appear any number of times.
+     *   * ? - May appear, but not more than once.
+     *
+     * @var array
+     */
+    function getValidationRules() {
+
+        return array(
+            'UID' => 1,
+            'DTSTAMP' => 1,
+
+            'BUSYTYPE' => '?',
+            'CLASS' => '?',
+            'CREATED' => '?',
+            'DESCRIPTION' => '?',
+            'DTSTART' => '?',
+            'LAST-MODIFIED' => '?',
+            'ORGANIZER' => '?',
+            'PRIORITY' => '?',
+            'SEQUENCE' => '?',
+            'SUMMARY' => '?',
+            'URL' => '?',
+            'DTEND' => '?',
+            'DURATION' => '?',
+
+            'CATEGORIES' => '*',
+            'COMMENT' => '*',
+            'CONTACT' => '*',
+        );
+
+    }
+
+    /**
+     * Validates the node for correctness.
+     *
+     * The following options are supported:
+     *   Node::REPAIR - May attempt to automatically repair the problem.
+     *   Node::PROFILE_CARDDAV - Validate the vCard for CardDAV purposes.
+     *   Node::PROFILE_CALDAV - Validate the iCalendar for CalDAV purposes.
+     *
+     * This method returns an array with detected problems.
+     * Every element has the following properties:
+     *
+     *  * level - problem level.
+     *  * message - A human-readable string describing the issue.
+     *  * node - A reference to the problematic node.
+     *
+     * The level means:
+     *   1 - The issue was repaired (only happens if REPAIR was turned on).
+     *   2 - A warning.
+     *   3 - An error.
+     *
+     * @param int $options
+     * @return array
+     */
+    function validate($options = 0) {
+
+        $result = parent::validate($options);
+
+        if (isset($this->DTEND) && isset($this->DURATION)) {
+            $result[] = array(
+                'level' => 3,
+                'message' => 'DTEND and DURATION cannot both be present',
+                'node' => $this
+            );
+        }
+
+        return $result;
+
+    }
+}
diff --git a/vendor/sabre/vobject/lib/Component/VCalendar.php b/vendor/sabre/vobject/lib/Component/VCalendar.php
new file mode 100644
index 0000000000000000000000000000000000000000..39224f0d3de5796ccbb2acd99c4728ecae158eed
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Component/VCalendar.php
@@ -0,0 +1,526 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use DateTime;
+use DateTimeZone;
+use Sabre\VObject;
+use Sabre\VObject\Component;
+use Sabre\VObject\Recur\EventIterator;
+use Sabre\VObject\Recur\NoInstancesException;
+
+/**
+ * The VCalendar component
+ *
+ * This component adds functionality to a component, specific for a VCALENDAR.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class VCalendar extends VObject\Document {
+
+    /**
+     * The default name for this component.
+     *
+     * This should be 'VCALENDAR' or 'VCARD'.
+     *
+     * @var string
+     */
+    static $defaultName = 'VCALENDAR';
+
+    /**
+     * This is a list of components, and which classes they should map to.
+     *
+     * @var array
+     */
+    static $componentMap = array(
+        'VALARM'        => 'Sabre\\VObject\\Component\\VAlarm',
+        'VEVENT'        => 'Sabre\\VObject\\Component\\VEvent',
+        'VFREEBUSY'     => 'Sabre\\VObject\\Component\\VFreeBusy',
+        'VAVAILABILITY' => 'Sabre\\VObject\\Component\\VAvailability',
+        'AVAILABLE'     => 'Sabre\\VObject\\Component\\Available',
+        'VJOURNAL'      => 'Sabre\\VObject\\Component\\VJournal',
+        'VTIMEZONE'     => 'Sabre\\VObject\\Component\\VTimeZone',
+        'VTODO'         => 'Sabre\\VObject\\Component\\VTodo',
+    );
+
+    /**
+     * List of value-types, and which classes they map to.
+     *
+     * @var array
+     */
+    static $valueMap = array(
+        'BINARY'           => 'Sabre\\VObject\\Property\\Binary',
+        'BOOLEAN'          => 'Sabre\\VObject\\Property\\Boolean',
+        'CAL-ADDRESS'      => 'Sabre\\VObject\\Property\\ICalendar\\CalAddress',
+        'DATE'             => 'Sabre\\VObject\\Property\\ICalendar\\Date',
+        'DATE-TIME'        => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
+        'DURATION'         => 'Sabre\\VObject\\Property\\ICalendar\\Duration',
+        'FLOAT'            => 'Sabre\\VObject\\Property\\FloatValue',
+        'INTEGER'          => 'Sabre\\VObject\\Property\\IntegerValue',
+        'PERIOD'           => 'Sabre\\VObject\\Property\\ICalendar\\Period',
+        'RECUR'            => 'Sabre\\VObject\\Property\\ICalendar\\Recur',
+        'TEXT'             => 'Sabre\\VObject\\Property\\Text',
+        'TIME'             => 'Sabre\\VObject\\Property\\Time',
+        'UNKNOWN'          => 'Sabre\\VObject\\Property\\Unknown', // jCard / jCal-only.
+        'URI'              => 'Sabre\\VObject\\Property\\Uri',
+        'UTC-OFFSET'       => 'Sabre\\VObject\\Property\\UtcOffset',
+    );
+
+    /**
+     * List of properties, and which classes they map to.
+     *
+     * @var array
+     */
+    static $propertyMap = array(
+        // Calendar properties
+        'CALSCALE'      => 'Sabre\\VObject\\Property\\FlatText',
+        'METHOD'        => 'Sabre\\VObject\\Property\\FlatText',
+        'PRODID'        => 'Sabre\\VObject\\Property\\FlatText',
+        'VERSION'       => 'Sabre\\VObject\\Property\\FlatText',
+
+        // Component properties
+        'ATTACH'            => 'Sabre\\VObject\\Property\\Uri',
+        'CATEGORIES'        => 'Sabre\\VObject\\Property\\Text',
+        'CLASS'             => 'Sabre\\VObject\\Property\\FlatText',
+        'COMMENT'           => 'Sabre\\VObject\\Property\\FlatText',
+        'DESCRIPTION'       => 'Sabre\\VObject\\Property\\FlatText',
+        'GEO'               => 'Sabre\\VObject\\Property\\FloatValue',
+        'LOCATION'          => 'Sabre\\VObject\\Property\\FlatText',
+        'PERCENT-COMPLETE'  => 'Sabre\\VObject\\Property\\IntegerValue',
+        'PRIORITY'          => 'Sabre\\VObject\\Property\\IntegerValue',
+        'RESOURCES'         => 'Sabre\\VObject\\Property\\Text',
+        'STATUS'            => 'Sabre\\VObject\\Property\\FlatText',
+        'SUMMARY'           => 'Sabre\\VObject\\Property\\FlatText',
+
+        // Date and Time Component Properties
+        'COMPLETED'     => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
+        'DTEND'         => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
+        'DUE'           => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
+        'DTSTART'       => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
+        'DURATION'      => 'Sabre\\VObject\\Property\\ICalendar\\Duration',
+        'FREEBUSY'      => 'Sabre\\VObject\\Property\\ICalendar\\Period',
+        'TRANSP'        => 'Sabre\\VObject\\Property\\FlatText',
+
+        // Time Zone Component Properties
+        'TZID'          => 'Sabre\\VObject\\Property\\FlatText',
+        'TZNAME'        => 'Sabre\\VObject\\Property\\FlatText',
+        'TZOFFSETFROM'  => 'Sabre\\VObject\\Property\\UtcOffset',
+        'TZOFFSETTO'    => 'Sabre\\VObject\\Property\\UtcOffset',
+        'TZURL'         => 'Sabre\\VObject\\Property\\Uri',
+
+        // Relationship Component Properties
+        'ATTENDEE'      => 'Sabre\\VObject\\Property\\ICalendar\\CalAddress',
+        'CONTACT'       => 'Sabre\\VObject\\Property\\FlatText',
+        'ORGANIZER'     => 'Sabre\\VObject\\Property\\ICalendar\\CalAddress',
+        'RECURRENCE-ID' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
+        'RELATED-TO'    => 'Sabre\\VObject\\Property\\FlatText',
+        'URL'           => 'Sabre\\VObject\\Property\\Uri',
+        'UID'           => 'Sabre\\VObject\\Property\\FlatText',
+
+        // Recurrence Component Properties
+        'EXDATE'        => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
+        'RDATE'         => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
+        'RRULE'         => 'Sabre\\VObject\\Property\\ICalendar\\Recur',
+        'EXRULE'        => 'Sabre\\VObject\\Property\\ICalendar\\Recur', // Deprecated since rfc5545
+
+        // Alarm Component Properties
+        'ACTION'        => 'Sabre\\VObject\\Property\\FlatText',
+        'REPEAT'        => 'Sabre\\VObject\\Property\\IntegerValue',
+        'TRIGGER'       => 'Sabre\\VObject\\Property\\ICalendar\\Duration',
+
+        // Change Management Component Properties
+        'CREATED'       => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
+        'DTSTAMP'       => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
+        'LAST-MODIFIED' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
+        'SEQUENCE'      => 'Sabre\\VObject\\Property\\IntegerValue',
+
+        // Request Status
+        'REQUEST-STATUS' => 'Sabre\\VObject\\Property\\Text',
+
+        // Additions from draft-daboo-valarm-extensions-04
+        'ALARM-AGENT'    => 'Sabre\\VObject\\Property\\Text',
+        'ACKNOWLEDGED'   => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
+        'PROXIMITY'      => 'Sabre\\VObject\\Property\\Text',
+        'DEFAULT-ALARM'  => 'Sabre\\VObject\\Property\\Boolean',
+
+        // Additions from draft-daboo-calendar-availability-05
+        'BUSYTYPE'       => 'Sabre\\VObject\\Property\\Text',
+
+    );
+
+    /**
+     * Returns the current document type.
+     *
+     * @return void
+     */
+    function getDocumentType() {
+
+        return self::ICALENDAR20;
+
+    }
+
+    /**
+     * Returns a list of all 'base components'. For instance, if an Event has
+     * a recurrence rule, and one instance is overridden, the overridden event
+     * will have the same UID, but will be excluded from this list.
+     *
+     * VTIMEZONE components will always be excluded.
+     *
+     * @param string $componentName filter by component name
+     * @return VObject\Component[]
+     */
+    function getBaseComponents($componentName = null) {
+
+        $components = array();
+        foreach($this->children as $component) {
+
+            if (!$component instanceof VObject\Component)
+                continue;
+
+            if (isset($component->{'RECURRENCE-ID'}))
+                continue;
+
+            if ($componentName && $component->name !== strtoupper($componentName))
+                continue;
+
+            if ($component->name === 'VTIMEZONE')
+                continue;
+
+            $components[] = $component;
+
+        }
+
+        return $components;
+
+    }
+
+    /**
+     * Returns the first component that is not a VTIMEZONE, and does not have
+     * an RECURRENCE-ID.
+     *
+     * If there is no such component, null will be returned.
+     *
+     * @param string $componentName filter by component name
+     * @return VObject\Component|null
+     */
+    function getBaseComponent($componentName = null) {
+
+        foreach($this->children as $component) {
+
+            if (!$component instanceof VObject\Component)
+                continue;
+
+            if (isset($component->{'RECURRENCE-ID'}))
+                continue;
+
+            if ($componentName && $component->name !== strtoupper($componentName))
+                continue;
+
+            if ($component->name === 'VTIMEZONE')
+                continue;
+
+            return $component;
+
+        }
+
+    }
+
+    /**
+     * If this calendar object, has events with recurrence rules, this method
+     * can be used to expand the event into multiple sub-events.
+     *
+     * Each event will be stripped from it's recurrence information, and only
+     * the instances of the event in the specified timerange will be left
+     * alone.
+     *
+     * In addition, this method will cause timezone information to be stripped,
+     * and normalized to UTC.
+     *
+     * This method will alter the VCalendar. This cannot be reversed.
+     *
+     * This functionality is specifically used by the CalDAV standard. It is
+     * possible for clients to request expand events, if they are rather simple
+     * clients and do not have the possibility to calculate recurrences.
+     *
+     * @param DateTime $start
+     * @param DateTime $end
+     * @param DateTimeZone $timeZone reference timezone for floating dates and
+     *                     times.
+     * @return void
+     */
+    function expand(DateTime $start, DateTime $end, DateTimeZone $timeZone = null) {
+
+        $newEvents = array();
+
+        if (!$timeZone) {
+            $timeZone = new DateTimeZone('UTC');
+        }
+
+        // An array of events. Events are indexed by UID. Each item in this
+        // array is a list of one or more events that match the UID.
+        $recurringEvents = array();
+
+        foreach($this->select('VEVENT') as $key=>$vevent) {
+
+            $uid = (string)$vevent->UID;
+            if (!$uid) {
+                throw new \LogicException('Event did not have a UID!');
+            }
+
+            if (isset($vevent->{'RECURRENCE-ID'}) || isset($vevent->RRULE)) {
+                if (isset($recurringEvents[$uid])) {
+                    $recurringEvents[$uid][] = $vevent;
+                } else {
+                    $recurringEvents[$uid] = array($vevent);
+                }
+                continue;
+            }
+
+            if (!isset($vevent->RRULE)) {
+                if ($vevent->isInTimeRange($start, $end)) {
+                    $newEvents[] = $vevent;
+                }
+                continue;
+            }
+
+        }
+
+        foreach($recurringEvents as $events) {
+
+            try {
+                $it = new EventIterator($events, $timeZone);
+
+            } catch (NoInstancesException $e) {
+                // This event is recurring, but it doesn't have a single
+                // instance. We are skipping this event from the output
+                // entirely.
+                continue;
+            }
+            $it->fastForward($start);
+
+            while($it->valid() && $it->getDTStart() < $end) {
+
+                if ($it->getDTEnd() > $start) {
+
+                    $newEvents[] = $it->getEventObject();
+
+                }
+                $it->next();
+
+            }
+
+        }
+
+        // Wiping out all old VEVENT objects
+        unset($this->VEVENT);
+
+        // Setting all properties to UTC time.
+        foreach($newEvents as $newEvent) {
+
+            foreach($newEvent->children as $child) {
+                if ($child instanceof VObject\Property\ICalendar\DateTime && $child->hasTime()) {
+                    $dt = $child->getDateTimes($timeZone);
+                    // We only need to update the first timezone, because
+                    // setDateTimes will match all other timezones to the
+                    // first.
+                    $dt[0]->setTimeZone(new DateTimeZone('UTC'));
+                    $child->setDateTimes($dt);
+                }
+
+            }
+            $this->add($newEvent);
+
+        }
+
+        // Removing all VTIMEZONE components
+        unset($this->VTIMEZONE);
+
+    }
+
+    /**
+     * This method should return a list of default property values.
+     *
+     * @return array
+     */
+    protected function getDefaults() {
+
+        return array(
+            'VERSION' => '2.0',
+            'PRODID' => '-//Sabre//Sabre VObject ' . VObject\Version::VERSION . '//EN',
+            'CALSCALE' => 'GREGORIAN',
+        );
+
+    }
+
+    /**
+     * A simple list of validation rules.
+     *
+     * This is simply a list of properties, and how many times they either
+     * must or must not appear.
+     *
+     * Possible values per property:
+     *   * 0 - Must not appear.
+     *   * 1 - Must appear exactly once.
+     *   * + - Must appear at least once.
+     *   * * - Can appear any number of times.
+     *   * ? - May appear, but not more than once.
+     *
+     * @var array
+     */
+    function getValidationRules() {
+
+        return array(
+            'PRODID' => 1,
+            'VERSION' => 1,
+
+            'CALSCALE' => '?',
+            'METHOD' => '?',
+        );
+
+    }
+
+    /**
+     * Validates the node for correctness.
+     *
+     * The following options are supported:
+     *   Node::REPAIR - May attempt to automatically repair the problem.
+     *   Node::PROFILE_CARDDAV - Validate the vCard for CardDAV purposes.
+     *   Node::PROFILE_CALDAV - Validate the iCalendar for CalDAV purposes.
+     *
+     * This method returns an array with detected problems.
+     * Every element has the following properties:
+     *
+     *  * level - problem level.
+     *  * message - A human-readable string describing the issue.
+     *  * node - A reference to the problematic node.
+     *
+     * The level means:
+     *   1 - The issue was repaired (only happens if REPAIR was turned on).
+     *   2 - A warning.
+     *   3 - An error.
+     *
+     * @param int $options
+     * @return array
+     */
+    function validate($options = 0) {
+
+        $warnings = parent::validate($options);
+
+        if ($ver = $this->VERSION) {
+            if ((string)$ver !== '2.0') {
+                $warnings[] = array(
+                    'level' => 3,
+                    'message' => 'Only iCalendar version 2.0 as defined in rfc5545 is supported.',
+                    'node' => $this,
+                );
+            }
+
+        }
+
+        $uidList = array();
+
+        $componentsFound = 0;
+
+        $componentTypes = array();
+
+        foreach($this->children as $child) {
+            if($child instanceof Component) {
+                $componentsFound++;
+
+                if (!in_array($child->name, array('VEVENT', 'VTODO', 'VJOURNAL'))) {
+                    continue;
+                }
+                $componentTypes[] = $child->name;
+
+                $uid = (string)$child->UID;
+                $isMaster = isset($child->{'RECURRENCE-ID'})?0:1;
+                if (isset($uidList[$uid])) {
+                    $uidList[$uid]['count']++;
+                    if ($isMaster && $uidList[$uid]['hasMaster']) {
+                        $warnings[] = array(
+                            'level' => 3,
+                            'message' => 'More than one master object was found for the object with UID ' . $uid,
+                            'node' => $this,
+                        );
+                    }
+                    $uidList[$uid]['hasMaster']+=$isMaster;
+                } else {
+                    $uidList[$uid] = array(
+                        'count' => 1,
+                        'hasMaster' => $isMaster,
+                    );
+                }
+
+            }
+        }
+
+        if ($componentsFound===0) {
+            $warnings[] = array(
+                'level' => 3,
+                'message' => 'An iCalendar object must have at least 1 component.',
+                'node' => $this,
+            );
+        }
+
+        if ($options & self::PROFILE_CALDAV) {
+            if (count($uidList)>1) {
+                $warnings[] = array(
+                    'level' => 3,
+                    'message' => 'A calendar object on a CalDAV server may only have components with the same UID.',
+                    'node' => $this,
+                );
+            }
+            if (count(array_unique($componentTypes))===0) {
+                $warnings[] = array(
+                    'level' => 3,
+                    'message' => 'A calendar object on a CalDAV server must have at least 1 component (VTODO, VEVENT, VJOURNAL).',
+                    'node' => $this,
+                );
+            }
+            if (count(array_unique($componentTypes))>1) {
+                $warnings[] = array(
+                    'level' => 3,
+                    'message' => 'A calendar object on a CalDAV server may only have 1 type of component (VEVENT, VTODO or VJOURNAL).',
+                    'node' => $this,
+                );
+            }
+
+            if (isset($this->METHOD)) {
+                $warnings[] = array(
+                    'level' => 3,
+                    'message' => 'A calendar object on a CalDAV server MUST NOT have a METHOD property.',
+                    'node' => $this,
+                );
+            }
+        }
+
+        return $warnings;
+
+    }
+
+    /**
+     * Returns all components with a specific UID value.
+     *
+     * @return array
+     */
+    function getByUID($uid) {
+
+        return array_filter($this->children, function($item) use ($uid) {
+
+            if (!$item instanceof Component) {
+                return false;
+            }
+            if (!$itemUid = $item->select('UID')) {
+                return false;
+            }
+            $itemUid = current($itemUid)->getValue();
+            return $uid === $itemUid;
+
+        });
+
+    }
+
+
+}
diff --git a/vendor/sabre/vobject/lib/Component/VCard.php b/vendor/sabre/vobject/lib/Component/VCard.php
new file mode 100644
index 0000000000000000000000000000000000000000..7d98f8ab5972afa010b5bdcf6f3d46b297424385
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Component/VCard.php
@@ -0,0 +1,452 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use
+    Sabre\VObject;
+
+/**
+ * The VCard component
+ *
+ * This component represents the BEGIN:VCARD and END:VCARD found in every
+ * vcard.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class VCard extends VObject\Document {
+
+    /**
+     * The default name for this component.
+     *
+     * This should be 'VCALENDAR' or 'VCARD'.
+     *
+     * @var string
+     */
+    static $defaultName = 'VCARD';
+
+    /**
+     * Caching the version number
+     *
+     * @var int
+     */
+    private $version = null;
+
+    /**
+     * List of value-types, and which classes they map to.
+     *
+     * @var array
+     */
+    static $valueMap = array(
+        'BINARY'           => 'Sabre\\VObject\\Property\\Binary',
+        'BOOLEAN'          => 'Sabre\\VObject\\Property\\Boolean',
+        'CONTENT-ID'       => 'Sabre\\VObject\\Property\\FlatText',   // vCard 2.1 only
+        'DATE'             => 'Sabre\\VObject\\Property\\VCard\\Date',
+        'DATE-TIME'        => 'Sabre\\VObject\\Property\\VCard\\DateTime',
+        'DATE-AND-OR-TIME' => 'Sabre\\VObject\\Property\\VCard\\DateAndOrTime', // vCard only
+        'FLOAT'            => 'Sabre\\VObject\\Property\\FloatValue',
+        'INTEGER'          => 'Sabre\\VObject\\Property\\IntegerValue',
+        'LANGUAGE-TAG'     => 'Sabre\\VObject\\Property\\VCard\\LanguageTag',
+        'TIMESTAMP'        => 'Sabre\\VObject\\Property\\VCard\\TimeStamp',
+        'TEXT'             => 'Sabre\\VObject\\Property\\Text',
+        'TIME'             => 'Sabre\\VObject\\Property\\Time',
+        'UNKNOWN'          => 'Sabre\\VObject\\Property\\Unknown', // jCard / jCal-only.
+        'URI'              => 'Sabre\\VObject\\Property\\Uri',
+        'URL'              => 'Sabre\\VObject\\Property\\Uri', // vCard 2.1 only
+        'UTC-OFFSET'       => 'Sabre\\VObject\\Property\\UtcOffset',
+    );
+
+    /**
+     * List of properties, and which classes they map to.
+     *
+     * @var array
+     */
+    static $propertyMap = array(
+
+        // vCard 2.1 properties and up
+        'N'       => 'Sabre\\VObject\\Property\\Text',
+        'FN'      => 'Sabre\\VObject\\Property\\FlatText',
+        'PHOTO'   => 'Sabre\\VObject\\Property\\Binary', // Todo: we should add a class for Binary values.
+        'BDAY'    => 'Sabre\\VObject\\Property\\VCard\\DateAndOrTime',
+        'ADR'     => 'Sabre\\VObject\\Property\\Text',
+        'LABEL'   => 'Sabre\\VObject\\Property\\FlatText', // Removed in vCard 4.0
+        'TEL'     => 'Sabre\\VObject\\Property\\FlatText',
+        'EMAIL'   => 'Sabre\\VObject\\Property\\FlatText',
+        'MAILER'  => 'Sabre\\VObject\\Property\\FlatText', // Removed in vCard 4.0
+        'GEO'     => 'Sabre\\VObject\\Property\\FlatText',
+        'TITLE'   => 'Sabre\\VObject\\Property\\FlatText',
+        'ROLE'    => 'Sabre\\VObject\\Property\\FlatText',
+        'LOGO'    => 'Sabre\\VObject\\Property\\Binary',
+        // 'AGENT'   => 'Sabre\\VObject\\Property\\',      // Todo: is an embedded vCard. Probably rare, so
+                                 // not supported at the moment
+        'ORG'     => 'Sabre\\VObject\\Property\\Text',
+        'NOTE'    => 'Sabre\\VObject\\Property\\FlatText',
+        'REV'     => 'Sabre\\VObject\\Property\\VCard\\TimeStamp',
+        'SOUND'   => 'Sabre\\VObject\\Property\\FlatText',
+        'URL'     => 'Sabre\\VObject\\Property\\Uri',
+        'UID'     => 'Sabre\\VObject\\Property\\FlatText',
+        'VERSION' => 'Sabre\\VObject\\Property\\FlatText',
+        'KEY'     => 'Sabre\\VObject\\Property\\FlatText',
+        'TZ'      => 'Sabre\\VObject\\Property\\Text',
+
+        // vCard 3.0 properties
+        'CATEGORIES'  => 'Sabre\\VObject\\Property\\Text',
+        'SORT-STRING' => 'Sabre\\VObject\\Property\\FlatText',
+        'PRODID'      => 'Sabre\\VObject\\Property\\FlatText',
+        'NICKNAME'    => 'Sabre\\VObject\\Property\\Text',
+        'CLASS'       => 'Sabre\\VObject\\Property\\FlatText', // Removed in vCard 4.0
+
+        // rfc2739 properties
+        'FBURL'        => 'Sabre\\VObject\\Property\\Uri',
+        'CAPURI'       => 'Sabre\\VObject\\Property\\Uri',
+        'CALURI'       => 'Sabre\\VObject\\Property\\Uri',
+
+        // rfc4770 properties
+        'IMPP'         => 'Sabre\\VObject\\Property\\Uri',
+
+        // vCard 4.0 properties
+        'XML'          => 'Sabre\\VObject\\Property\\FlatText',
+        'ANNIVERSARY'  => 'Sabre\\VObject\\Property\\VCard\\DateAndOrTime',
+        'CLIENTPIDMAP' => 'Sabre\\VObject\\Property\\Text',
+        'LANG'         => 'Sabre\\VObject\\Property\\VCard\\LanguageTag',
+        'GENDER'       => 'Sabre\\VObject\\Property\\Text',
+        'KIND'         => 'Sabre\\VObject\\Property\\FlatText',
+
+        // rfc6474 properties
+        'BIRTHPLACE'    => 'Sabre\\VObject\\Property\\FlatText',
+        'DEATHPLACE'    => 'Sabre\\VObject\\Property\\FlatText',
+        'DEATHDATE'     => 'Sabre\\VObject\\Property\\VCard\\DateAndOrTime',
+
+        // rfc6715 properties
+        'EXPERTISE'     => 'Sabre\\VObject\\Property\\FlatText',
+        'HOBBY'         => 'Sabre\\VObject\\Property\\FlatText',
+        'INTEREST'      => 'Sabre\\VObject\\Property\\FlatText',
+        'ORG-DIRECTORY' => 'Sabre\\VObject\\Property\\FlatText',
+
+    );
+
+    /**
+     * Returns the current document type.
+     *
+     * @return void
+     */
+    function getDocumentType() {
+
+        if (!$this->version) {
+            $version = (string)$this->VERSION;
+            switch($version) {
+                case '2.1' :
+                    $this->version = self::VCARD21;
+                    break;
+                case '3.0' :
+                    $this->version = self::VCARD30;
+                    break;
+                case '4.0' :
+                    $this->version = self::VCARD40;
+                    break;
+                default :
+                    $this->version = self::UNKNOWN;
+                    break;
+
+            }
+        }
+
+        return $this->version;
+
+    }
+
+    /**
+     * Converts the document to a different vcard version.
+     *
+     * Use one of the VCARD constants for the target. This method will return
+     * a copy of the vcard in the new version.
+     *
+     * At the moment the only supported conversion is from 3.0 to 4.0.
+     *
+     * If input and output version are identical, a clone is returned.
+     *
+     * @param int $target
+     * @return VCard
+     */
+    function convert($target) {
+
+        $converter = new VObject\VCardConverter();
+        return $converter->convert($this, $target);
+
+    }
+
+    /**
+     * VCards with version 2.1, 3.0 and 4.0 are found.
+     *
+     * If the VCARD doesn't know its version, 2.1 is assumed.
+     */
+    const DEFAULT_VERSION = self::VCARD21;
+
+    /**
+     * Validates the node for correctness.
+     *
+     * The following options are supported:
+     *   Node::REPAIR - May attempt to automatically repair the problem.
+     *
+     * This method returns an array with detected problems.
+     * Every element has the following properties:
+     *
+     *  * level - problem level.
+     *  * message - A human-readable string describing the issue.
+     *  * node - A reference to the problematic node.
+     *
+     * The level means:
+     *   1 - The issue was repaired (only happens if REPAIR was turned on)
+     *   2 - An inconsequential issue
+     *   3 - A severe issue.
+     *
+     * @param int $options
+     * @return array
+     */
+    function validate($options = 0) {
+
+        $warnings = array();
+
+        $versionMap = array(
+            self::VCARD21 => '2.1',
+            self::VCARD30 => '3.0',
+            self::VCARD40 => '4.0',
+        );
+
+        $version = $this->select('VERSION');
+        if (count($version)===1) {
+            $version = (string)$this->VERSION;
+            if ($version!=='2.1' && $version!=='3.0' && $version!=='4.0') {
+                $warnings[] = array(
+                    'level' => 3,
+                    'message' => 'Only vcard version 4.0 (RFC6350), version 3.0 (RFC2426) or version 2.1 (icm-vcard-2.1) are supported.',
+                    'node' => $this,
+                );
+                if ($options & self::REPAIR) {
+                    $this->VERSION = $versionMap[self::DEFAULT_VERSION];
+                }
+            }
+            if ($version === '2.1' && ($options & self::PROFILE_CARDDAV)) {
+                $warnings[] = array(
+                    'level' => 3,
+                    'message' => 'CardDAV servers are not allowed to accept vCard 2.1.',
+                    'node' => $this,
+                );
+            }
+
+        }
+        $uid = $this->select('UID');
+        if (count($uid) === 0) {
+            if ($options & self::PROFILE_CARDDAV) {
+                // Required for CardDAV
+                $warningLevel = 3;
+                $message = 'vCards on CardDAV servers MUST have a UID property.';
+            } else {
+                // Not required for regular vcards
+                $warningLevel = 2;
+                $message = 'Adding a UID to a vCard property is recommended.';
+            }
+            if ($options & self::REPAIR) {
+                $this->UID = VObject\UUIDUtil::getUUID();
+                $warningLevel = 1;
+            }
+            $warnings[] = array(
+                'level' => $warningLevel,
+                'message' => $message,
+                'node' => $this,
+            );
+        }
+
+        $fn = $this->select('FN');
+        if (count($fn)!==1) {
+
+            $repaired = false;
+            if (($options & self::REPAIR) && count($fn) === 0) {
+                // We're going to try to see if we can use the contents of the
+                // N property.
+                if (isset($this->N)) {
+                    $value = explode(';', (string)$this->N);
+                    if (isset($value[1]) && $value[1]) {
+                        $this->FN = $value[1] . ' ' . $value[0];
+                    } else {
+                        $this->FN = $value[0];
+                    }
+                    $repaired = true;
+
+                // Otherwise, the ORG property may work
+                } elseif (isset($this->ORG)) {
+                    $this->FN = (string)$this->ORG;
+                    $repaired = true;
+                }
+
+            }
+            $warnings[] = array(
+                'level' => $repaired?1:3,
+                'message' => 'The FN property must appear in the VCARD component exactly 1 time',
+                'node' => $this,
+            );
+        }
+
+        return array_merge(
+            parent::validate($options),
+            $warnings
+        );
+
+    }
+
+    /**
+     * A simple list of validation rules.
+     *
+     * This is simply a list of properties, and how many times they either
+     * must or must not appear.
+     *
+     * Possible values per property:
+     *   * 0 - Must not appear.
+     *   * 1 - Must appear exactly once.
+     *   * + - Must appear at least once.
+     *   * * - Can appear any number of times.
+     *   * ? - May appear, but not more than once.
+     *
+     * @var array
+     */
+    function getValidationRules() {
+
+        return array(
+            'ADR'          => '*',
+            'ANNIVERSARY'  => '?',
+            'BDAY'         => '?',
+            'CALADRURI'    => '*',
+            'CALURI'       => '*',
+            'CATEGORIES'   => '*',
+            'CLIENTPIDMAP' => '*',
+            'EMAIL'        => '*',
+            'FBURL'        => '*',
+            'IMPP'         => '*',
+            'GENDER'       => '?',
+            'GEO'          => '*',
+            'KEY'          => '*',
+            'KIND'         => '?',
+            'LANG'         => '*',
+            'LOGO'         => '*',
+            'MEMBER'       => '*',
+            'N'            => '?',
+            'NICKNAME'     => '*',
+            'NOTE'         => '*',
+            'ORG'          => '*',
+            'PHOTO'        => '*',
+            'PRODID'       => '?',
+            'RELATED'      => '*',
+            'REV'          => '?',
+            'ROLE'         => '*',
+            'SOUND'        => '*',
+            'SOURCE'       => '*',
+            'TEL'          => '*',
+            'TITLE'        => '*',
+            'TZ'           => '*',
+            'URL'          => '*',
+            'VERSION'      => '1',
+            'XML'          => '*',
+
+            // FN is commented out, because it's already handled by the
+            // validate function, which may also try to repair it.
+            // 'FN'           => '+',
+
+            'UID'          => '?',
+        );
+
+    }
+
+    /**
+     * Returns a preferred field.
+     *
+     * VCards can indicate wether a field such as ADR, TEL or EMAIL is
+     * preferred by specifying TYPE=PREF (vcard 2.1, 3) or PREF=x (vcard 4, x
+     * being a number between 1 and 100).
+     *
+     * If neither of those parameters are specified, the first is returned, if
+     * a field with that name does not exist, null is returned.
+     *
+     * @param string $fieldName
+     * @return VObject\Property|null
+     */
+    function preferred($propertyName) {
+
+        $preferred = null;
+        $lastPref = 101;
+        foreach($this->select($propertyName) as $field) {
+
+            $pref = 101;
+            if (isset($field['TYPE']) && $field['TYPE']->has('PREF')) {
+                $pref = 1;
+            } elseif (isset($field['PREF'])) {
+                $pref = $field['PREF']->getValue();
+            }
+
+            if ($pref < $lastPref || is_null($preferred)) {
+                $preferred = $field;
+                $lastPref = $pref;
+            }
+
+        }
+        return $preferred;
+
+    }
+
+    /**
+     * This method should return a list of default property values.
+     *
+     * @return array
+     */
+    protected function getDefaults() {
+
+        return array(
+            'VERSION' => '3.0',
+            'PRODID' => '-//Sabre//Sabre VObject ' . VObject\Version::VERSION . '//EN',
+        );
+
+    }
+
+    /**
+     * This method returns an array, with the representation as it should be
+     * encoded in json. This is used to create jCard or jCal documents.
+     *
+     * @return array
+     */
+    function jsonSerialize() {
+
+        // A vcard does not have sub-components, so we're overriding this
+        // method to remove that array element.
+        $properties = array();
+
+        foreach($this->children as $child) {
+            $properties[] = $child->jsonSerialize();
+        }
+
+        return array(
+            strtolower($this->name),
+            $properties,
+        );
+
+    }
+
+    /**
+     * Returns the default class for a property name.
+     *
+     * @param string $propertyName
+     * @return string
+     */
+    function getClassNameForPropertyName($propertyName) {
+
+        $className = parent::getClassNameForPropertyName($propertyName);
+        // In vCard 4, BINARY no longer exists, and we need URI instead.
+
+        if ($className == 'Sabre\\VObject\\Property\\Binary' && $this->getDocumentType()===self::VCARD40) {
+            return 'Sabre\\VObject\\Property\\Uri';
+        }
+        return $className;
+
+    }
+
+}
+
diff --git a/vendor/sabre/vobject/lib/Component/VEvent.php b/vendor/sabre/vobject/lib/Component/VEvent.php
new file mode 100644
index 0000000000000000000000000000000000000000..9302503576eeb1324b9a851df6b94cdf055ecb0f
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Component/VEvent.php
@@ -0,0 +1,153 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject;
+use Sabre\VObject\Recur\EventIterator;
+use Sabre\VObject\Recur\NoInstancesException;
+
+/**
+ * VEvent component
+ *
+ * This component contains some additional functionality specific for VEVENT's.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class VEvent extends VObject\Component {
+
+    /**
+     * Returns true or false depending on if the event falls in the specified
+     * time-range. This is used for filtering purposes.
+     *
+     * The rules used to determine if an event falls within the specified
+     * time-range is based on the CalDAV specification.
+     *
+     * @param \DateTime $start
+     * @param \DateTime $end
+     * @return bool
+     */
+    public function isInTimeRange(\DateTime $start, \DateTime $end) {
+
+        if ($this->RRULE) {
+
+            try {
+
+                $it = new EventIterator($this, null, $start->getTimezone());
+
+            } catch (NoInstancesException $e) {
+
+                // If we've catched this exception, there are no instances
+                // for the event that fall into the specified time-range.
+                return false;
+
+            }
+
+            $it->fastForward($start);
+
+            // We fast-forwarded to a spot where the end-time of the
+            // recurrence instance exceeded the start of the requested
+            // time-range.
+            //
+            // If the starttime of the recurrence did not exceed the
+            // end of the time range as well, we have a match.
+            return ($it->getDTStart() < $end && $it->getDTEnd() > $start);
+
+        }
+
+        $effectiveStart = $this->DTSTART->getDateTime($start->getTimezone());
+        if (isset($this->DTEND)) {
+
+            // The DTEND property is considered non inclusive. So for a 3 day
+            // event in july, dtstart and dtend would have to be July 1st and
+            // July 4th respectively.
+            //
+            // See:
+            // http://tools.ietf.org/html/rfc5545#page-54
+            $effectiveEnd = $this->DTEND->getDateTime($end->getTimezone());
+
+        } elseif (isset($this->DURATION)) {
+            $effectiveEnd = clone $effectiveStart;
+            $effectiveEnd->add(VObject\DateTimeParser::parseDuration($this->DURATION));
+        } elseif (!$this->DTSTART->hasTime()) {
+            $effectiveEnd = clone $effectiveStart;
+            $effectiveEnd->modify('+1 day');
+        } else {
+            $effectiveEnd = clone $effectiveStart;
+        }
+        return (
+            ($start < $effectiveEnd) && ($end > $effectiveStart)
+        );
+
+    }
+
+    /**
+     * This method should return a list of default property values.
+     *
+     * @return array
+     */
+    protected function getDefaults() {
+
+        return array(
+            'UID'     => 'sabre-vobject-' . VObject\UUIDUtil::getUUID(),
+            'DTSTAMP' => date('Ymd\\THis\\Z'),
+        );
+
+    }
+
+    /**
+     * A simple list of validation rules.
+     *
+     * This is simply a list of properties, and how many times they either
+     * must or must not appear.
+     *
+     * Possible values per property:
+     *   * 0 - Must not appear.
+     *   * 1 - Must appear exactly once.
+     *   * + - Must appear at least once.
+     *   * * - Can appear any number of times.
+     *   * ? - May appear, but not more than once.
+     *
+     * @var array
+     */
+    public function getValidationRules() {
+
+        $hasMethod = isset($this->parent->METHOD);
+        return array(
+            'UID' => 1,
+            'DTSTAMP' => 1,
+            'DTSTART' => $hasMethod?'?':'1',
+            'CLASS' => '?',
+            'CREATED' => '?',
+            'DESCRIPTION' => '?',
+            'GEO' => '?',
+            'LAST-MODIFIED' => '?',
+            'LOCATION' => '?',
+            'ORGANIZER' => '?',
+            'PRIORITY' => '?',
+            'SEQUENCE' => '?',
+            'STATUS' => '?',
+            'SUMMARY' => '?',
+            'TRANSP' => '?',
+            'URL' => '?',
+            'RECURRENCE-ID' => '?',
+            'RRULE' => '?',
+            'DTEND' => '?',
+            'DURATION' => '?',
+
+            'ATTACH' => '*',
+            'ATTENDEE' => '*',
+            'CATEGORIES' => '*',
+            'COMMENT' => '*',
+            'CONTACT' => '*',
+            'EXDATE' => '*',
+            'REQUEST-STATUS' => '*',
+            'RELATED-TO' => '*',
+            'RESOURCES' => '*',
+            'RDATE' => '*',
+        );
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/Component/VFreeBusy.php b/vendor/sabre/vobject/lib/Component/VFreeBusy.php
new file mode 100644
index 0000000000000000000000000000000000000000..f1b0b2566e97e8e05fe7211d4a6969fc9dd5061c
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Component/VFreeBusy.php
@@ -0,0 +1,103 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject;
+
+/**
+ * The VFreeBusy component
+ *
+ * This component adds functionality to a component, specific for VFREEBUSY
+ * components.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class VFreeBusy extends VObject\Component {
+
+    /**
+     * Checks based on the contained FREEBUSY information, if a timeslot is
+     * available.
+     *
+     * @param DateTime $start
+     * @param Datetime $end
+     * @return bool
+     */
+    public function isFree(\DateTime $start, \Datetime $end) {
+
+        foreach($this->select('FREEBUSY') as $freebusy) {
+
+            // We are only interested in FBTYPE=BUSY (the default),
+            // FBTYPE=BUSY-TENTATIVE or FBTYPE=BUSY-UNAVAILABLE.
+            if (isset($freebusy['FBTYPE']) && strtoupper(substr((string)$freebusy['FBTYPE'],0,4))!=='BUSY') {
+                continue;
+            }
+
+            // The freebusy component can hold more than 1 value, separated by
+            // commas.
+            $periods = explode(',', (string)$freebusy);
+
+            foreach($periods as $period) {
+                // Every period is formatted as [start]/[end]. The start is an
+                // absolute UTC time, the end may be an absolute UTC time, or
+                // duration (relative) value.
+                list($busyStart, $busyEnd) = explode('/', $period);
+
+                $busyStart = VObject\DateTimeParser::parse($busyStart);
+                $busyEnd = VObject\DateTimeParser::parse($busyEnd);
+                if ($busyEnd instanceof \DateInterval) {
+                    $tmp = clone $busyStart;
+                    $tmp->add($busyEnd);
+                    $busyEnd = $tmp;
+                }
+
+                if($start < $busyEnd && $end > $busyStart) {
+                    return false;
+                }
+
+            }
+
+        }
+
+        return true;
+
+    }
+
+    /**
+     * A simple list of validation rules.
+     *
+     * This is simply a list of properties, and how many times they either
+     * must or must not appear.
+     *
+     * Possible values per property:
+     *   * 0 - Must not appear.
+     *   * 1 - Must appear exactly once.
+     *   * + - Must appear at least once.
+     *   * * - Can appear any number of times.
+     *   * ? - May appear, but not more than once.
+     *
+     * @var array
+     */
+    public function getValidationRules() {
+
+        return array(
+            'UID' => 1,
+            'DTSTAMP' => 1,
+
+            'CONTACT' => '?',
+            'DTSTART' => '?',
+            'DTEND' => '?',
+            'ORGANIZER' => '?',
+            'URL' => '?',
+
+            'ATTENDEE' => '*',
+            'COMMENT' => '*',
+            'FREEBUSY' => '*',
+            'REQUEST-STATUS' => '*',
+        );
+
+    }
+
+}
+
diff --git a/vendor/sabre/vobject/lib/Component/VJournal.php b/vendor/sabre/vobject/lib/Component/VJournal.php
new file mode 100644
index 0000000000000000000000000000000000000000..783efd61ddff1451fc701d4ad75a85b48f78b28c
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Component/VJournal.php
@@ -0,0 +1,91 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject;
+
+/**
+ * VJournal component
+ *
+ * This component contains some additional functionality specific for VJOURNALs.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class VJournal extends VObject\Component {
+
+    /**
+     * Returns true or false depending on if the event falls in the specified
+     * time-range. This is used for filtering purposes.
+     *
+     * The rules used to determine if an event falls within the specified
+     * time-range is based on the CalDAV specification.
+     *
+     * @param DateTime $start
+     * @param DateTime $end
+     * @return bool
+     */
+    public function isInTimeRange(\DateTime $start, \DateTime $end) {
+
+        $dtstart = isset($this->DTSTART)?$this->DTSTART->getDateTime():null;
+        if ($dtstart) {
+            $effectiveEnd = clone $dtstart;
+            if (!$this->DTSTART->hasTime()) {
+                $effectiveEnd->modify('+1 day');
+            }
+
+            return ($start <= $effectiveEnd && $end > $dtstart);
+
+        }
+        return false;
+
+    }
+
+    /**
+     * A simple list of validation rules.
+     *
+     * This is simply a list of properties, and how many times they either
+     * must or must not appear.
+     *
+     * Possible values per property:
+     *   * 0 - Must not appear.
+     *   * 1 - Must appear exactly once.
+     *   * + - Must appear at least once.
+     *   * * - Can appear any number of times.
+     *   * ? - May appear, but not more than once.
+     *
+     * @var array
+     */
+    public function getValidationRules() {
+
+        return array(
+            'UID' => 1,
+            'DTSTAMP' => 1,
+
+            'CLASS' => '?',
+            'CREATED' => '?',
+            'DTSTART' => '?',
+            'LAST-MODIFIED' => '?',
+            'ORGANIZER' => '?',
+            'RECURRENCE-ID' => '?',
+            'SEQUENCE' => '?',
+            'STATUS' => '?',
+            'SUMMARY' => '?',
+            'URL' => '?',
+
+            'RRULE' => '?',
+
+            'ATTACH' => '*',
+            'ATTENDEE' => '*',
+            'CATEGORIES' => '*',
+            'COMMENT' => '*',
+            'CONTACT' => '*',
+            'DESCRIPTION' => '*',
+            'EXDATE' => '*',
+            'RELATED-TO' => '*',
+            'RDATE' => '*',
+        );
+
+    }
+}
diff --git a/vendor/sabre/vobject/lib/Component/VTimeZone.php b/vendor/sabre/vobject/lib/Component/VTimeZone.php
new file mode 100644
index 0000000000000000000000000000000000000000..a1369dcd2c02f4b209a35d21fb3c51f0670d7444
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Component/VTimeZone.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject;
+
+/**
+ * The VTimeZone component
+ *
+ * This component adds functionality to a component, specific for VTIMEZONE
+ * components.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class VTimeZone extends VObject\Component {
+
+    /**
+     * Returns the PHP DateTimeZone for this VTIMEZONE component.
+     *
+     * If we can't accurately determine the timezone, this method will return
+     * UTC.
+     *
+     * @return \DateTimeZone
+     */
+    function getTimeZone() {
+
+        return VObject\TimeZoneUtil::getTimeZone((string)$this->TZID, $this->root);
+
+    }
+
+    /**
+     * A simple list of validation rules.
+     *
+     * This is simply a list of properties, and how many times they either
+     * must or must not appear.
+     *
+     * Possible values per property:
+     *   * 0 - Must not appear.
+     *   * 1 - Must appear exactly once.
+     *   * + - Must appear at least once.
+     *   * * - Can appear any number of times.
+     *   * ? - May appear, but not more than once.
+     *
+     * @var array
+     */
+    function getValidationRules() {
+
+        return array(
+            'TZID' => 1,
+
+            'LAST-MODIFIED' => '?',
+            'TZURL' => '?',
+
+            // At least 1 STANDARD or DAYLIGHT must appear, or more. But both
+            // cannot appear in the same VTIMEZONE.
+            //
+            // The validator is not specific yet to pick this up, so these
+            // rules are too loose.
+            'STANDARD' => '*',
+            'DAYLIGHT' => '*',
+        );
+
+    }
+
+}
+
diff --git a/vendor/sabre/vobject/lib/Component/VTodo.php b/vendor/sabre/vobject/lib/Component/VTodo.php
new file mode 100644
index 0000000000000000000000000000000000000000..ac2770e1dd547d59f99187f95d973d96adc62cd1
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Component/VTodo.php
@@ -0,0 +1,177 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject;
+
+/**
+ * VTodo component
+ *
+ * This component contains some additional functionality specific for VTODOs.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class VTodo extends VObject\Component {
+
+    /**
+     * Returns true or false depending on if the event falls in the specified
+     * time-range. This is used for filtering purposes.
+     *
+     * The rules used to determine if an event falls within the specified
+     * time-range is based on the CalDAV specification.
+     *
+     * @param DateTime $start
+     * @param DateTime $end
+     * @return bool
+     */
+    public function isInTimeRange(\DateTime $start, \DateTime $end) {
+
+        $dtstart = isset($this->DTSTART)?$this->DTSTART->getDateTime():null;
+        $duration = isset($this->DURATION)?VObject\DateTimeParser::parseDuration($this->DURATION):null;
+        $due = isset($this->DUE)?$this->DUE->getDateTime():null;
+        $completed = isset($this->COMPLETED)?$this->COMPLETED->getDateTime():null;
+        $created = isset($this->CREATED)?$this->CREATED->getDateTime():null;
+
+        if ($dtstart) {
+            if ($duration) {
+                $effectiveEnd = clone $dtstart;
+                $effectiveEnd->add($duration);
+                return $start <= $effectiveEnd && $end > $dtstart;
+            } elseif ($due) {
+                return
+                    ($start < $due || $start <= $dtstart) &&
+                    ($end > $dtstart || $end >= $due);
+            } else {
+                return $start <= $dtstart && $end > $dtstart;
+            }
+        }
+        if ($due) {
+            return ($start < $due && $end >= $due);
+        }
+        if ($completed && $created) {
+            return
+                ($start <= $created || $start <= $completed) &&
+                ($end >= $created || $end >= $completed);
+        }
+        if ($completed) {
+            return ($start <= $completed && $end >= $completed);
+        }
+        if ($created) {
+            return ($end > $created);
+        }
+        return true;
+
+    }
+
+    /**
+     * A simple list of validation rules.
+     *
+     * This is simply a list of properties, and how many times they either
+     * must or must not appear.
+     *
+     * Possible values per property:
+     *   * 0 - Must not appear.
+     *   * 1 - Must appear exactly once.
+     *   * + - Must appear at least once.
+     *   * * - Can appear any number of times.
+     *   * ? - May appear, but not more than once.
+     *
+     * @var array
+     */
+    public function getValidationRules() {
+
+        return array(
+            'UID' => 1,
+            'DTSTAMP' => 1,
+
+            'CLASS' => '?',
+            'COMPLETED' => '?',
+            'CREATED' => '?',
+            'DESCRIPTION' => '?',
+            'DTSTART' => '?',
+            'GEO' => '?',
+            'LAST-MODIFIED' => '?',
+            'LOCATION' => '?',
+            'ORGANIZER' => '?',
+            'PERCENT' => '?',
+            'PRIORITY' => '?',
+            'RECURRENCE-ID' => '?',
+            'SEQUENCE' => '?',
+            'STATUS' => '?',
+            'SUMMARY' => '?',
+            'URL' => '?',
+
+            'RRULE' => '?',
+            'DUE' => '?',
+            'DURATION' => '?',
+
+            'ATTACH' => '*',
+            'ATTENDEE' => '*',
+            'CATEGORIES' => '*',
+            'COMMENT' => '*',
+            'CONTACT' => '*',
+            'EXDATE' => '*',
+            'REQUEST-STATUS' => '*',
+            'RELATED-TO' => '*',
+            'RESOURCES' => '*',
+            'RDATE' => '*',
+        );
+
+    }
+
+    /**
+     * Validates the node for correctness.
+     *
+     * The following options are supported:
+     *   Node::REPAIR - May attempt to automatically repair the problem.
+     *
+     * This method returns an array with detected problems.
+     * Every element has the following properties:
+     *
+     *  * level - problem level.
+     *  * message - A human-readable string describing the issue.
+     *  * node - A reference to the problematic node.
+     *
+     * The level means:
+     *   1 - The issue was repaired (only happens if REPAIR was turned on)
+     *   2 - An inconsequential issue
+     *   3 - A severe issue.
+     *
+     * @param int $options
+     * @return array
+     */
+    public function validate($options = 0) {
+
+        $result = parent::validate($options);
+        if (isset($this->DUE) && isset($this->DTSTART)) {
+
+            $due = $this->DUE;
+            $dtStart = $this->DTSTART;
+
+            if ($due->getValueType() !== $dtStart->getValueType()) {
+
+                $result[] = array(
+                    'level'   => 3,
+                    'message' => 'The value type (DATE or DATE-TIME) must be identical for DUE and DTSTART',
+                    'node' => $due,
+                );
+
+            } elseif ($due->getDateTime() < $dtStart->getDateTime()) {
+
+                $result[] = array(
+                    'level'   => 3,
+                    'message' => 'DUE must occur after DTSTART',
+                    'node' => $due,
+                );
+
+            }
+
+        }
+
+        return $result;
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/DateTimeParser.php b/vendor/sabre/vobject/lib/DateTimeParser.php
new file mode 100644
index 0000000000000000000000000000000000000000..e79328146792ac3d5913186e03e6a8c6507c94b2
--- /dev/null
+++ b/vendor/sabre/vobject/lib/DateTimeParser.php
@@ -0,0 +1,431 @@
+<?php
+
+namespace Sabre\VObject;
+
+use DateTime;
+use DateTimeZone;
+use DateInterval;
+use InvalidArgumentException;
+use LogicException;
+
+/**
+ * DateTimeParser
+ *
+ * This class is responsible for parsing the several different date and time
+ * formats iCalendar and vCards have.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class DateTimeParser {
+
+    /**
+     * Parses an iCalendar (rfc5545) formatted datetime and returns a DateTime object
+     *
+     * Specifying a reference timezone is optional. It will only be used
+     * if the non-UTC format is used. The argument is used as a reference, the
+     * returned DateTime object will still be in the UTC timezone.
+     *
+     * @param string $dt
+     * @param DateTimeZone $tz
+     * @return DateTime
+     */
+    static public function parseDateTime($dt, DateTimeZone $tz = null) {
+
+        // Format is YYYYMMDD + "T" + hhmmss
+        $result = preg_match('/^([0-9]{4})([0-1][0-9])([0-3][0-9])T([0-2][0-9])([0-5][0-9])([0-5][0-9])([Z]?)$/',$dt,$matches);
+
+        if (!$result) {
+            throw new LogicException('The supplied iCalendar datetime value is incorrect: ' . $dt);
+        }
+
+        if ($matches[7]==='Z' || is_null($tz)) {
+            $tz = new DateTimeZone('UTC');
+        }
+        $date = new DateTime($matches[1] . '-' . $matches[2] . '-' . $matches[3] . ' ' . $matches[4] . ':' . $matches[5] .':' . $matches[6], $tz);
+
+        // Still resetting the timezone, to normalize everything to UTC
+        // $date->setTimeZone(new \DateTimeZone('UTC'));
+        return $date;
+
+    }
+
+    /**
+     * Parses an iCalendar (rfc5545) formatted date and returns a DateTime object.
+     *
+     * @param string $date
+     * @param DateTimeZone $tz
+     * @return DateTime
+     */
+    static public function parseDate($date, DateTimeZone $tz = null) {
+
+        // Format is YYYYMMDD
+        $result = preg_match('/^([0-9]{4})([0-1][0-9])([0-3][0-9])$/',$date,$matches);
+
+        if (!$result) {
+            throw new LogicException('The supplied iCalendar date value is incorrect: ' . $date);
+        }
+
+        if (is_null($tz)) {
+            $tz = new DateTimeZone('UTC');
+        }
+
+        $date = new DateTime($matches[1] . '-' . $matches[2] . '-' . $matches[3], $tz);
+        return $date;
+
+    }
+
+    /**
+     * Parses an iCalendar (RFC5545) formatted duration value.
+     *
+     * This method will either return a DateTimeInterval object, or a string
+     * suitable for strtotime or DateTime::modify.
+     *
+     * @param string $duration
+     * @param bool $asString
+     * @return DateInterval|string
+     */
+    static public function parseDuration($duration, $asString = false) {
+
+        $result = preg_match('/^(?P<plusminus>\+|-)?P((?P<week>\d+)W)?((?P<day>\d+)D)?(T((?P<hour>\d+)H)?((?P<minute>\d+)M)?((?P<second>\d+)S)?)?$/', $duration, $matches);
+        if (!$result) {
+            throw new LogicException('The supplied iCalendar duration value is incorrect: ' . $duration);
+        }
+
+        if (!$asString) {
+            $invert = false;
+            if ($matches['plusminus']==='-') {
+                $invert = true;
+            }
+
+
+            $parts = array(
+                'week',
+                'day',
+                'hour',
+                'minute',
+                'second',
+            );
+            foreach($parts as $part) {
+                $matches[$part] = isset($matches[$part])&&$matches[$part]?(int)$matches[$part]:0;
+            }
+
+
+            // We need to re-construct the $duration string, because weeks and
+            // days are not supported by DateInterval in the same string.
+            $duration = 'P';
+            $days = $matches['day'];
+            if ($matches['week']) {
+                $days+=$matches['week']*7;
+            }
+            if ($days)
+                $duration.=$days . 'D';
+
+            if ($matches['minute'] || $matches['second'] || $matches['hour']) {
+                $duration.='T';
+
+                if ($matches['hour'])
+                    $duration.=$matches['hour'].'H';
+
+                if ($matches['minute'])
+                    $duration.=$matches['minute'].'M';
+
+                if ($matches['second'])
+                    $duration.=$matches['second'].'S';
+
+            }
+
+            if ($duration==='P') {
+                $duration = 'PT0S';
+            }
+            $iv = new DateInterval($duration);
+            if ($invert) $iv->invert = true;
+
+            return $iv;
+
+        }
+
+
+
+        $parts = array(
+            'week',
+            'day',
+            'hour',
+            'minute',
+            'second',
+        );
+
+        $newDur = '';
+        foreach($parts as $part) {
+            if (isset($matches[$part]) && $matches[$part]) {
+                $newDur.=' '.$matches[$part] . ' ' . $part . 's';
+            }
+        }
+
+        $newDur = ($matches['plusminus']==='-'?'-':'+') . trim($newDur);
+        if ($newDur === '+') {
+            $newDur = '+0 seconds';
+        };
+        return $newDur;
+
+    }
+
+    /**
+     * Parses either a Date or DateTime, or Duration value.
+     *
+     * @param string $date
+     * @param DateTimeZone|string $referenceTz
+     * @return DateTime|DateInterval
+     */
+    static public function parse($date, $referenceTz = null) {
+
+        if ($date[0]==='P' || ($date[0]==='-' && $date[1]==='P')) {
+            return self::parseDuration($date);
+        } elseif (strlen($date)===8) {
+            return self::parseDate($date, $referenceTz);
+        } else {
+            return self::parseDateTime($date, $referenceTz);
+        }
+
+    }
+
+    /**
+     * This method parses a vCard date and or time value.
+     *
+     * This can be used for the DATE, DATE-TIME, TIMESTAMP and
+     * DATE-AND-OR-TIME value.
+     *
+     * This method returns an array, not a DateTime value.
+     *
+     * The elements in the array are in the following order:
+     * year, month, date, hour, minute, second, timezone
+     *
+     * Almost any part of the string may be omitted. It's for example legal to
+     * just specify seconds, leave out the year, etc.
+     *
+     * Timezone is either returned as 'Z' or as '+08:00'
+     *
+     * For any non-specified values null is returned.
+     *
+     * List of date formats that are supported:
+     * YYYY
+     * YYYY-MM
+     * YYYYMMDD
+     * --MMDD
+     * ---DD
+     *
+     * YYYY-MM-DD
+     * --MM-DD
+     * ---DD
+     *
+     * List of supported time formats:
+     *
+     * HH
+     * HHMM
+     * HHMMSS
+     * -MMSS
+     * --SS
+     *
+     * HH
+     * HH:MM
+     * HH:MM:SS
+     * -MM:SS
+     * --SS
+     *
+     * A full basic-format date-time string looks like :
+     * 20130603T133901
+     *
+     * A full extended-format date-time string looks like :
+     * 2013-06-03T13:39:01
+     *
+     * Times may be postfixed by a timezone offset. This can be either 'Z' for
+     * UTC, or a string like -0500 or +1100.
+     *
+     * @param string $date
+     * @return array
+     */
+    static public function parseVCardDateTime($date) {
+
+        $regex = '/^
+            (?:  # date part
+                (?:
+                    (?: (?P<year> [0-9]{4}) (?: -)?| --)
+                    (?P<month> [0-9]{2})?
+                |---)
+                (?P<date> [0-9]{2})?
+            )?
+            (?:T  # time part
+                (?P<hour> [0-9]{2} | -)
+                (?P<minute> [0-9]{2} | -)?
+                (?P<second> [0-9]{2})?
+
+                (?: \.[0-9]{3})? # milliseconds
+                (?P<timezone> # timezone offset
+
+                    Z | (?: \+|-)(?: [0-9]{4})
+
+                )?
+
+            )?
+            $/x';
+
+        if (!preg_match($regex, $date, $matches)) {
+
+            // Attempting to parse the extended format.
+            $regex = '/^
+                (?: # date part
+                    (?: (?P<year> [0-9]{4}) - | -- )
+                    (?P<month> [0-9]{2}) -
+                    (?P<date> [0-9]{2})
+                )?
+                (?:T # time part
+
+                    (?: (?P<hour> [0-9]{2}) : | -)
+                    (?: (?P<minute> [0-9]{2}) : | -)?
+                    (?P<second> [0-9]{2})?
+
+                    (?: \.[0-9]{3})? # milliseconds
+                    (?P<timezone> # timezone offset
+
+                        Z | (?: \+|-)(?: [0-9]{2}:[0-9]{2})
+
+                    )?
+
+                )?
+                $/x';
+
+            if (!preg_match($regex, $date, $matches)) {
+                throw new InvalidArgumentException('Invalid vCard date-time string: ' . $date);
+            }
+
+        }
+        $parts = array(
+            'year',
+            'month',
+            'date',
+            'hour',
+            'minute',
+            'second',
+            'timezone'
+        );
+
+        $result = array();
+        foreach($parts as $part) {
+
+            if (empty($matches[$part])) {
+                $result[$part] = null;
+            } elseif ($matches[$part] === '-' || $matches[$part] === '--') {
+                $result[$part] = null;
+            } else {
+                $result[$part] = $matches[$part];
+            }
+
+        }
+
+        return $result;
+
+    }
+
+    /**
+     * This method parses a vCard TIME value.
+     *
+     * This method returns an array, not a DateTime value.
+     *
+     * The elements in the array are in the following order:
+     * hour, minute, second, timezone
+     *
+     * Almost any part of the string may be omitted. It's for example legal to
+     * just specify seconds, leave out the hour etc.
+     *
+     * Timezone is either returned as 'Z' or as '+08:00'
+     *
+     * For any non-specified values null is returned.
+     *
+     * List of supported time formats:
+     *
+     * HH
+     * HHMM
+     * HHMMSS
+     * -MMSS
+     * --SS
+     *
+     * HH
+     * HH:MM
+     * HH:MM:SS
+     * -MM:SS
+     * --SS
+     *
+     * A full basic-format time string looks like :
+     * 133901
+     *
+     * A full extended-format time string looks like :
+     * 13:39:01
+     *
+     * Times may be postfixed by a timezone offset. This can be either 'Z' for
+     * UTC, or a string like -0500 or +11:00.
+     *
+     * @param string $date
+     * @return array
+     */
+    static public function parseVCardTime($date) {
+
+        $regex = '/^
+            (?P<hour> [0-9]{2} | -)
+            (?P<minute> [0-9]{2} | -)?
+            (?P<second> [0-9]{2})?
+
+            (?: \.[0-9]{3})? # milliseconds
+            (?P<timezone> # timezone offset
+
+                Z | (?: \+|-)(?: [0-9]{4})
+
+            )?
+            $/x';
+
+
+        if (!preg_match($regex, $date, $matches)) {
+
+            // Attempting to parse the extended format.
+            $regex = '/^
+                (?: (?P<hour> [0-9]{2}) : | -)
+                (?: (?P<minute> [0-9]{2}) : | -)?
+                (?P<second> [0-9]{2})?
+
+                (?: \.[0-9]{3})? # milliseconds
+                (?P<timezone> # timezone offset
+
+                    Z | (?: \+|-)(?: [0-9]{2}:[0-9]{2})
+
+                )?
+                $/x';
+
+            if (!preg_match($regex, $date, $matches)) {
+                throw new InvalidArgumentException('Invalid vCard time string: ' . $date);
+            }
+
+        }
+        $parts = array(
+            'hour',
+            'minute',
+            'second',
+            'timezone'
+        );
+
+        $result = array();
+        foreach($parts as $part) {
+
+            if (empty($matches[$part])) {
+                $result[$part] = null;
+            } elseif ($matches[$part] === '-') {
+                $result[$part] = null;
+            } else {
+                $result[$part] = $matches[$part];
+            }
+
+        }
+
+        return $result;
+
+    }
+}
diff --git a/vendor/sabre/vobject/lib/Document.php b/vendor/sabre/vobject/lib/Document.php
new file mode 100644
index 0000000000000000000000000000000000000000..63806ee9f25cda2cfd1879ead23083f0b37468dc
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Document.php
@@ -0,0 +1,261 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * Document
+ *
+ * A document is just like a component, except that it's also the top level
+ * element.
+ *
+ * Both a VCALENDAR and a VCARD are considered documents.
+ *
+ * This class also provides a registry for document types.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+abstract class Document extends Component {
+
+    /**
+     * Unknown document type
+     */
+    const UNKNOWN = 1;
+
+    /**
+     * vCalendar 1.0
+     */
+    const VCALENDAR10 = 2;
+
+    /**
+     * iCalendar 2.0
+     */
+    const ICALENDAR20 = 3;
+
+    /**
+     * vCard 2.1
+     */
+    const VCARD21 = 4;
+
+    /**
+     * vCard 3.0
+     */
+    const VCARD30 = 5;
+
+    /**
+     * vCard 4.0
+     */
+    const VCARD40 = 6;
+
+    /**
+     * The default name for this component.
+     *
+     * This should be 'VCALENDAR' or 'VCARD'.
+     *
+     * @var string
+     */
+    static public $defaultName;
+
+    /**
+     * List of properties, and which classes they map to.
+     *
+     * @var array
+     */
+    static public $propertyMap = array();
+
+    /**
+     * List of components, along with which classes they map to.
+     *
+     * @var array
+     */
+    static public $componentMap = array();
+
+    /**
+     * List of value-types, and which classes they map to.
+     *
+     * @var array
+     */
+    static public $valueMap = array();
+
+    /**
+     * Creates a new document.
+     *
+     * We're changing the default behavior slightly here. First, we don't want
+     * to have to specify a name (we already know it), and we want to allow
+     * children to be specified in the first argument.
+     *
+     * But, the default behavior also works.
+     *
+     * So the two sigs:
+     *
+     * new Document(array $children = array(), $defaults = true);
+     * new Document(string $name, array $children = array(), $defaults = true)
+     *
+     * @return void
+     */
+    public function __construct() {
+
+        $args = func_get_args();
+        if (count($args)===0 || is_array($args[0])) {
+            array_unshift($args, $this, static::$defaultName);
+            call_user_func_array(array('parent', '__construct'), $args);
+        } else {
+            array_unshift($args, $this);
+            call_user_func_array(array('parent', '__construct'), $args);
+        }
+
+    }
+
+    /**
+     * Returns the current document type.
+     *
+     * @return void
+     */
+    public function getDocumentType() {
+
+        return self::UNKNOWN;
+
+    }
+
+    /**
+     * Creates a new component or property.
+     *
+     * If it's a known component, we will automatically call createComponent.
+     * otherwise, we'll assume it's a property and call createProperty instead.
+     *
+     * @param string $name
+     * @param string $arg1,... Unlimited number of args
+     * @return mixed
+     */
+    public function create($name) {
+
+        if (isset(static::$componentMap[strtoupper($name)])) {
+
+            return call_user_func_array(array($this,'createComponent'), func_get_args());
+
+        } else {
+
+            return call_user_func_array(array($this,'createProperty'), func_get_args());
+
+        }
+
+    }
+
+    /**
+     * Creates a new component
+     *
+     * This method automatically searches for the correct component class, based
+     * on its name.
+     *
+     * You can specify the children either in key=>value syntax, in which case
+     * properties will automatically be created, or you can just pass a list of
+     * Component and Property object.
+     *
+     * By default, a set of sensible values will be added to the component. For
+     * an iCalendar object, this may be something like CALSCALE:GREGORIAN. To
+     * ensure that this does not happen, set $defaults to false.
+     *
+     * @param string $name
+     * @param array $children
+     * @param bool $defaults
+     * @return Component
+     */
+    public function createComponent($name, array $children = null, $defaults = true) {
+
+        $name = strtoupper($name);
+        $class = 'Sabre\\VObject\\Component';
+
+        if (isset(static::$componentMap[$name])) {
+            $class=static::$componentMap[$name];
+        }
+        if (is_null($children)) $children = array();
+        return new $class($this, $name, $children, $defaults);
+
+    }
+
+    /**
+     * Factory method for creating new properties
+     *
+     * This method automatically searches for the correct property class, based
+     * on its name.
+     *
+     * You can specify the parameters either in key=>value syntax, in which case
+     * parameters will automatically be created, or you can just pass a list of
+     * Parameter objects.
+     *
+     * @param string $name
+     * @param mixed $value
+     * @param array $parameters
+     * @param string $valueType Force a specific valuetype, such as URI or TEXT
+     * @return Property
+     */
+    public function createProperty($name, $value = null, array $parameters = null, $valueType = null) {
+
+        // If there's a . in the name, it means it's prefixed by a groupname.
+        if (($i=strpos($name,'.'))!==false) {
+            $group = substr($name, 0, $i);
+            $name = strtoupper(substr($name, $i+1));
+        } else {
+            $name = strtoupper($name);
+            $group = null;
+        }
+
+        $class = null;
+
+        if ($valueType) {
+            // The valueType argument comes first to figure out the correct
+            // class.
+            $class = $this->getClassNameForPropertyValue($valueType);
+        }
+
+        if (is_null($class) && isset($parameters['VALUE'])) {
+            // If a VALUE parameter is supplied, we should use that.
+            $class = $this->getClassNameForPropertyValue($parameters['VALUE']);
+        }
+        if (is_null($class)) {
+            $class = $this->getClassNameForPropertyName($name);
+        }
+        if (is_null($parameters)) $parameters = array();
+
+        return new $class($this, $name, $value, $parameters, $group);
+
+    }
+
+    /**
+     * This method returns a full class-name for a value parameter.
+     *
+     * For instance, DTSTART may have VALUE=DATE. In that case we will look in
+     * our valueMap table and return the appropriate class name.
+     *
+     * This method returns null if we don't have a specialized class.
+     *
+     * @param string $valueParam
+     * @return void
+     */
+    public function getClassNameForPropertyValue($valueParam) {
+
+        $valueParam = strtoupper($valueParam);
+        if (isset(static::$valueMap[$valueParam])) {
+            return static::$valueMap[$valueParam];
+        }
+
+    }
+
+    /**
+     * Returns the default class for a property name.
+     *
+     * @param string $propertyName
+     * @return string
+     */
+    public function getClassNameForPropertyName($propertyName) {
+
+        if (isset(static::$propertyMap[$propertyName])) {
+            return static::$propertyMap[$propertyName];
+        } else {
+            return 'Sabre\\VObject\\Property\\Unknown';
+        }
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/ElementList.php b/vendor/sabre/vobject/lib/ElementList.php
new file mode 100644
index 0000000000000000000000000000000000000000..dbfead0a7ff2978267a3e2f0bd2c85f08baaaaac
--- /dev/null
+++ b/vendor/sabre/vobject/lib/ElementList.php
@@ -0,0 +1,172 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * VObject ElementList
+ *
+ * This class represents a list of elements. Lists are the result of queries,
+ * such as doing $vcalendar->vevent where there's multiple VEVENT objects.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class ElementList implements \Iterator, \Countable, \ArrayAccess {
+
+    /**
+     * Inner elements
+     *
+     * @var array
+     */
+    protected $elements = array();
+
+    /**
+     * Creates the element list.
+     *
+     * @param array $elements
+     */
+    public function __construct(array $elements) {
+
+        $this->elements = $elements;
+
+    }
+
+    /* {{{ Iterator interface */
+
+    /**
+     * Current position
+     *
+     * @var int
+     */
+    private $key = 0;
+
+    /**
+     * Returns current item in iteration
+     *
+     * @return Element
+     */
+    public function current() {
+
+        return $this->elements[$this->key];
+
+    }
+
+    /**
+     * To the next item in the iterator
+     *
+     * @return void
+     */
+    public function next() {
+
+        $this->key++;
+
+    }
+
+    /**
+     * Returns the current iterator key
+     *
+     * @return int
+     */
+    public function key() {
+
+        return $this->key;
+
+    }
+
+    /**
+     * Returns true if the current position in the iterator is a valid one
+     *
+     * @return bool
+     */
+    public function valid() {
+
+        return isset($this->elements[$this->key]);
+
+    }
+
+    /**
+     * Rewinds the iterator
+     *
+     * @return void
+     */
+    public function rewind() {
+
+        $this->key = 0;
+
+    }
+
+    /* }}} */
+
+    /* {{{ Countable interface */
+
+    /**
+     * Returns the number of elements
+     *
+     * @return int
+     */
+    public function count() {
+
+        return count($this->elements);
+
+    }
+
+    /* }}} */
+
+    /* {{{ ArrayAccess Interface */
+
+
+    /**
+     * Checks if an item exists through ArrayAccess.
+     *
+     * @param int $offset
+     * @return bool
+     */
+    public function offsetExists($offset) {
+
+        return isset($this->elements[$offset]);
+
+    }
+
+    /**
+     * Gets an item through ArrayAccess.
+     *
+     * @param int $offset
+     * @return mixed
+     */
+    public function offsetGet($offset) {
+
+        return $this->elements[$offset];
+
+    }
+
+    /**
+     * Sets an item through ArrayAccess.
+     *
+     * @param int $offset
+     * @param mixed $value
+     * @return void
+     */
+    public function offsetSet($offset, $value) {
+
+        throw new \LogicException('You can not add new objects to an ElementList');
+
+    }
+
+    /**
+     * Sets an item through ArrayAccess.
+     *
+     * This method just forwards the request to the inner iterator
+     *
+     * @param int $offset
+     * @return void
+     */
+    public function offsetUnset($offset) {
+
+        throw new \LogicException('You can not remove objects from an ElementList');
+
+    }
+
+    /* }}} */
+
+}
diff --git a/vendor/sabre/vobject/lib/EofException.php b/vendor/sabre/vobject/lib/EofException.php
new file mode 100644
index 0000000000000000000000000000000000000000..e9bd55878357468c48b2bc757872767ce63b1afc
--- /dev/null
+++ b/vendor/sabre/vobject/lib/EofException.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * Exception thrown by parser when the end of the stream has been reached,
+ * before this was expected.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class EofException extends ParseException {
+
+}
diff --git a/vendor/sabre/vobject/lib/FreeBusyGenerator.php b/vendor/sabre/vobject/lib/FreeBusyGenerator.php
new file mode 100644
index 0000000000000000000000000000000000000000..e79983a2051785e0448addeaa972de9f0ee53e80
--- /dev/null
+++ b/vendor/sabre/vobject/lib/FreeBusyGenerator.php
@@ -0,0 +1,363 @@
+<?php
+
+namespace Sabre\VObject;
+
+use DateTimeZone;
+use Sabre\VObject\Component\VCalendar;
+use Sabre\VObject\Recur\EventIterator;
+use Sabre\VObject\Recur\NoInstancesException;
+
+/**
+ * This class helps with generating FREEBUSY reports based on existing sets of
+ * objects.
+ *
+ * It only looks at VEVENT and VFREEBUSY objects from the sourcedata, and
+ * generates a single VFREEBUSY object.
+ *
+ * VFREEBUSY components are described in RFC5545, The rules for what should
+ * go in a single freebusy report is taken from RFC4791, section 7.10.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class FreeBusyGenerator {
+
+    /**
+     * Input objects
+     *
+     * @var array
+     */
+    protected $objects;
+
+    /**
+     * Start of range
+     *
+     * @var DateTime|null
+     */
+    protected $start;
+
+    /**
+     * End of range
+     *
+     * @var DateTime|null
+     */
+    protected $end;
+
+    /**
+     * VCALENDAR object
+     *
+     * @var Component
+     */
+    protected $baseObject;
+
+    /**
+     * Reference timezone.
+     *
+     * When we are calculating busy times, and we come across so-called
+     * floating times (times without a timezone), we use the reference timezone
+     * instead.
+     *
+     * This is also used for all-day events.
+     *
+     * This defaults to UTC.
+     *
+     * @var DateTimeZone
+     */
+    protected $timeZone;
+
+    /**
+     * Creates the generator.
+     *
+     * Check the setTimeRange and setObjects methods for details about the
+     * arguments.
+     *
+     * @param DateTime $start
+     * @param DateTime $end
+     * @param mixed $objects
+     * @param DateTimeZone $timeZone
+     * @return void
+     */
+    public function __construct(\DateTime $start = null, \DateTime $end = null, $objects = null, DateTimeZone $timeZone = null) {
+
+        if ($start && $end) {
+            $this->setTimeRange($start, $end);
+        }
+
+        if ($objects) {
+            $this->setObjects($objects);
+        }
+        if (is_null($timeZone)) {
+            $timeZone = new DateTimeZone('UTC');
+        }
+        $this->setTimeZone($timeZone);
+
+    }
+
+    /**
+     * Sets the VCALENDAR object.
+     *
+     * If this is set, it will not be generated for you. You are responsible
+     * for setting things like the METHOD, CALSCALE, VERSION, etc..
+     *
+     * The VFREEBUSY object will be automatically added though.
+     *
+     * @param Component $vcalendar
+     * @return void
+     */
+    public function setBaseObject(Component $vcalendar) {
+
+        $this->baseObject = $vcalendar;
+
+    }
+
+    /**
+     * Sets the input objects
+     *
+     * You must either specify a valendar object as a strong, or as the parse
+     * Component.
+     * It's also possible to specify multiple objects as an array.
+     *
+     * @param mixed $objects
+     * @return void
+     */
+    public function setObjects($objects) {
+
+        if (!is_array($objects)) {
+            $objects = array($objects);
+        }
+
+        $this->objects = array();
+        foreach($objects as $object) {
+
+            if (is_string($object)) {
+                $this->objects[] = Reader::read($object);
+            } elseif ($object instanceof Component) {
+                $this->objects[] = $object;
+            } else {
+                throw new \InvalidArgumentException('You can only pass strings or \\Sabre\\VObject\\Component arguments to setObjects');
+            }
+
+        }
+
+    }
+
+    /**
+     * Sets the time range
+     *
+     * Any freebusy object falling outside of this time range will be ignored.
+     *
+     * @param DateTime $start
+     * @param DateTime $end
+     * @return void
+     */
+    public function setTimeRange(\DateTime $start = null, \DateTime $end = null) {
+
+        $this->start = $start;
+        $this->end = $end;
+
+    }
+
+    /**
+     * Sets the reference timezone for floating times.
+     *
+     * @param DateTimeZone $timeZone
+     * @return void
+     */
+    public function setTimeZone(DateTimeZone $timeZone) {
+
+        $this->timeZone = $timeZone;
+
+    }
+
+    /**
+     * Parses the input data and returns a correct VFREEBUSY object, wrapped in
+     * a VCALENDAR.
+     *
+     * @return Component
+     */
+    public function getResult() {
+
+        $busyTimes = array();
+
+        foreach($this->objects as $key=>$object) {
+
+            foreach($object->getBaseComponents() as $component) {
+
+                switch($component->name) {
+
+                    case 'VEVENT' :
+
+                        $FBTYPE = 'BUSY';
+                        if (isset($component->TRANSP) && (strtoupper($component->TRANSP) === 'TRANSPARENT')) {
+                            break;
+                        }
+                        if (isset($component->STATUS)) {
+                            $status = strtoupper($component->STATUS);
+                            if ($status==='CANCELLED') {
+                                break;
+                            }
+                            if ($status==='TENTATIVE') {
+                                $FBTYPE = 'BUSY-TENTATIVE';
+                            }
+                        }
+
+                        $times = array();
+
+                        if ($component->RRULE) {
+                            try {
+                                $iterator = new EventIterator($object, (string)$component->uid, $this->timeZone);
+                            } catch (NoInstancesException $e) {
+                                // This event is recurring, but it doesn't have a single
+                                // instance. We are skipping this event from the output
+                                // entirely.
+                                unset($this->objects[$key]);
+                                continue;
+                            }
+
+                            if ($this->start) {
+                                $iterator->fastForward($this->start);
+                            }
+
+                            $maxRecurrences = 200;
+
+                            while($iterator->valid() && --$maxRecurrences) {
+
+                                $startTime = $iterator->getDTStart();
+                                if ($this->end && $startTime > $this->end) {
+                                    break;
+                                }
+                                $times[] = array(
+                                    $iterator->getDTStart(),
+                                    $iterator->getDTEnd(),
+                                );
+
+                                $iterator->next();
+
+                            }
+
+                        } else {
+
+                            $startTime = $component->DTSTART->getDateTime($this->timeZone);
+                            if ($this->end && $startTime > $this->end) {
+                                break;
+                            }
+                            $endTime = null;
+                            if (isset($component->DTEND)) {
+                                $endTime = $component->DTEND->getDateTime($this->timeZone);
+                            } elseif (isset($component->DURATION)) {
+                                $duration = DateTimeParser::parseDuration((string)$component->DURATION);
+                                $endTime = clone $startTime;
+                                $endTime->add($duration);
+                            } elseif (!$component->DTSTART->hasTime()) {
+                                $endTime = clone $startTime;
+                                $endTime->modify('+1 day');
+                            } else {
+                                // The event had no duration (0 seconds)
+                                break;
+                            }
+
+                            $times[] = array($startTime, $endTime);
+
+                        }
+
+                        foreach($times as $time) {
+
+                            if ($this->end && $time[0] > $this->end) break;
+                            if ($this->start && $time[1] < $this->start) break;
+
+                            $busyTimes[] = array(
+                                $time[0],
+                                $time[1],
+                                $FBTYPE,
+                            );
+                        }
+                        break;
+
+                    case 'VFREEBUSY' :
+                        foreach($component->FREEBUSY as $freebusy) {
+
+                            $fbType = isset($freebusy['FBTYPE'])?strtoupper($freebusy['FBTYPE']):'BUSY';
+
+                            // Skipping intervals marked as 'free'
+                            if ($fbType==='FREE')
+                                continue;
+
+                            $values = explode(',', $freebusy);
+                            foreach($values as $value) {
+                                list($startTime, $endTime) = explode('/', $value);
+                                $startTime = DateTimeParser::parseDateTime($startTime);
+
+                                if (substr($endTime,0,1)==='P' || substr($endTime,0,2)==='-P') {
+                                    $duration = DateTimeParser::parseDuration($endTime);
+                                    $endTime = clone $startTime;
+                                    $endTime->add($duration);
+                                } else {
+                                    $endTime = DateTimeParser::parseDateTime($endTime);
+                                }
+
+                                if($this->start && $this->start > $endTime) continue;
+                                if($this->end && $this->end < $startTime) continue;
+                                $busyTimes[] = array(
+                                    $startTime,
+                                    $endTime,
+                                    $fbType
+                                );
+
+                            }
+
+
+                        }
+                        break;
+
+
+
+                }
+
+
+            }
+
+        }
+
+        if ($this->baseObject) {
+            $calendar = $this->baseObject;
+        } else {
+            $calendar = new VCalendar();
+        }
+
+        $vfreebusy = $calendar->createComponent('VFREEBUSY');
+        $calendar->add($vfreebusy);
+
+        if ($this->start) {
+            $dtstart = $calendar->createProperty('DTSTART');
+            $dtstart->setDateTime($this->start);
+            $vfreebusy->add($dtstart);
+        }
+        if ($this->end) {
+            $dtend = $calendar->createProperty('DTEND');
+            $dtend->setDateTime($this->end);
+            $vfreebusy->add($dtend);
+        }
+        $dtstamp = $calendar->createProperty('DTSTAMP');
+        $dtstamp->setDateTime(new \DateTime('now', new \DateTimeZone('UTC')));
+        $vfreebusy->add($dtstamp);
+
+        foreach($busyTimes as $busyTime) {
+
+            $busyTime[0]->setTimeZone(new \DateTimeZone('UTC'));
+            $busyTime[1]->setTimeZone(new \DateTimeZone('UTC'));
+
+            $prop = $calendar->createProperty(
+                'FREEBUSY',
+                $busyTime[0]->format('Ymd\\THis\\Z') . '/' . $busyTime[1]->format('Ymd\\THis\\Z')
+            );
+            $prop['FBTYPE'] = $busyTime[2];
+            $vfreebusy->add($prop);
+
+        }
+
+        return $calendar;
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/ITip/Broker.php b/vendor/sabre/vobject/lib/ITip/Broker.php
new file mode 100644
index 0000000000000000000000000000000000000000..a72de4f1c660d070d053b01625e60e43ce8e84b0
--- /dev/null
+++ b/vendor/sabre/vobject/lib/ITip/Broker.php
@@ -0,0 +1,981 @@
+<?php
+
+namespace Sabre\VObject\ITip;
+
+use Sabre\VObject\Component\VCalendar;
+use Sabre\VObject\DateTimeParser;
+use Sabre\VObject\Reader;
+use Sabre\VObject\Recur\EventIterator;
+
+/**
+ * The ITip\Broker class is a utility class that helps with processing
+ * so-called iTip messages.
+ *
+ * iTip is defined in rfc5546, stands for iCalendar Transport-Independent
+ * Interoperability Protocol, and describes the underlying mechanism for
+ * using iCalendar for scheduling for for example through email (also known as
+ * IMip) and CalDAV Scheduling.
+ *
+ * This class helps by:
+ *
+ * 1. Creating individual invites based on an iCalendar event for each
+ *    attendee.
+ * 2. Generating invite updates based on an iCalendar update. This may result
+ *    in new invites, updates and cancellations for attendees, if that list
+ *    changed.
+ * 3. On the receiving end, it can create a local iCalendar event based on
+ *    a received invite.
+ * 4. It can also process an invite update on a local event, ensuring that any
+ *    overridden properties from attendees are retained.
+ * 5. It can create a accepted or declined iTip reply based on an invite.
+ * 6. It can process a reply from an invite and update an events attendee
+ *     status based on a reply.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class Broker {
+
+    /**
+     * This setting determines whether the rules for the SCHEDULE-AGENT
+     * parameter should be followed.
+     *
+     * This is a parameter defined on ATTENDEE properties, introduced by RFC
+     * 6638. This parameter allows a caldav client to tell the server 'Don't do
+     * any scheduling operations'.
+     *
+     * If this setting is turned on, any attendees with SCHEDULE-AGENT set to
+     * CLIENT will be ignored. This is the desired behavior for a CalDAV
+     * server, but if you're writing an iTip application that doesn't deal with
+     * CalDAV, you may want to ignore this parameter.
+     *
+     * @var bool
+     */
+    public $scheduleAgentServerRules = true;
+
+    /**
+     * The broker will try during 'parseEvent' figure out whether the change
+     * was significant.
+     *
+     * It uses a few different ways to do this. One of these ways is seeing if
+     * certain properties changed values. This list of specified here.
+     *
+     * This list is taken from:
+     * * http://tools.ietf.org/html/rfc5546#section-2.1.4
+     *
+     * @var string[]
+     */
+    public $significantChangeProperties = array(
+        'DTSTART',
+        'DTEND',
+        'DURATION',
+        'DUE',
+        'RRULE',
+        'RDATE',
+        'EXDATE',
+        'STATUS',
+    );
+
+    /**
+     * This method is used to process an incoming itip message.
+     *
+     * Examples:
+     *
+     * 1. A user is an attendee to an event. The organizer sends an updated
+     * meeting using a new iTip message with METHOD:REQUEST. This function
+     * will process the message and update the attendee's event accordingly.
+     *
+     * 2. The organizer cancelled the event using METHOD:CANCEL. We will update
+     * the users event to state STATUS:CANCELLED.
+     *
+     * 3. An attendee sent a reply to an invite using METHOD:REPLY. We can
+     * update the organizers event to update the ATTENDEE with its correct
+     * PARTSTAT.
+     *
+     * The $existingObject is updated in-place. If there is no existing object
+     * (because it's a new invite for example) a new object will be created.
+     *
+     * If an existing object does not exist, and the method was CANCEL or
+     * REPLY, the message effectively gets ignored, and no 'existingObject'
+     * will be created.
+     *
+     * The updated $existingObject is also returned from this function.
+     *
+     * If the iTip message was not supported, we will always return false.
+     *
+     * @param Message $itipMessage
+     * @param VCalendar $existingObject
+     * @return VCalendar|null
+     */
+    public function processMessage(Message $itipMessage, VCalendar $existingObject = null) {
+
+        // We only support events at the moment.
+        if ($itipMessage->component !== 'VEVENT') {
+            return false;
+        }
+
+        switch($itipMessage->method) {
+
+            case 'REQUEST' :
+                return $this->processMessageRequest($itipMessage, $existingObject);
+
+            case 'CANCEL' :
+                return $this->processMessageCancel($itipMessage, $existingObject);
+
+            case 'REPLY' :
+                return $this->processMessageReply($itipMessage, $existingObject);
+
+            default :
+                // Unsupported iTip message
+                return null;
+
+        }
+
+        return $existingObject;
+
+    }
+
+    /**
+     * This function parses a VCALENDAR object and figure out if any messages
+     * need to be sent.
+     *
+     * A VCALENDAR object will be created from the perspective of either an
+     * attendee, or an organizer. You must pass a string identifying the
+     * current user, so we can figure out who in the list of attendees or the
+     * organizer we are sending this message on behalf of.
+     *
+     * It's possible to specify the current user as an array, in case the user
+     * has more than one identifying href (such as multiple emails).
+     *
+     * It $oldCalendar is specified, it is assumed that the operation is
+     * updating an existing event, which means that we need to look at the
+     * differences between events, and potentially send old attendees
+     * cancellations, and current attendees updates.
+     *
+     * If $calendar is null, but $oldCalendar is specified, we treat the
+     * operation as if the user has deleted an event. If the user was an
+     * organizer, this means that we need to send cancellation notices to
+     * people. If the user was an attendee, we need to make sure that the
+     * organizer gets the 'declined' message.
+     *
+     * @param VCalendar|string $calendar
+     * @param string|array $userHref
+     * @param VCalendar|string $oldCalendar
+     * @return array
+     */
+    public function parseEvent($calendar = null, $userHref, $oldCalendar = null) {
+
+        if ($oldCalendar) {
+            if (is_string($oldCalendar)) {
+                $oldCalendar = Reader::read($oldCalendar);
+            }
+            if (!isset($oldCalendar->VEVENT)) {
+                // We only support events at the moment
+                return array();
+            }
+
+            $oldEventInfo = $this->parseEventInfo($oldCalendar);
+        } else {
+            $oldEventInfo = array(
+                'organizer' => null,
+                'significantChangeHash' => '',
+                'attendees' => array(),
+            );
+        }
+
+        $userHref = (array)$userHref;
+
+        if (!is_null($calendar)) {
+
+            if (is_string($calendar)) {
+                $calendar = Reader::read($calendar);
+            }
+            if (!isset($calendar->VEVENT)) {
+                // We only support events at the moment
+                return array();
+            }
+            $eventInfo = $this->parseEventInfo($calendar);
+            if (!$eventInfo['attendees'] && !$oldEventInfo['attendees']) {
+                // If there were no attendees on either side of the equation,
+                // we don't need to do anything.
+                return array();
+            }
+            if (!$eventInfo['organizer'] && !$oldEventInfo['organizer']) {
+                // There was no organizer before or after the change.
+                return array();
+            }
+
+            $baseCalendar = $calendar;
+
+            // If the new object didn't have an organizer, the organizer
+            // changed the object from a scheduling object to a non-scheduling
+            // object. We just copy the info from the old object.
+            if (!$eventInfo['organizer'] && $oldEventInfo['organizer']) {
+                $eventInfo['organizer'] = $oldEventInfo['organizer'];
+                $eventInfo['organizerName'] = $oldEventInfo['organizerName'];
+            }
+
+        } else {
+            // The calendar object got deleted, we need to process this as a
+            // cancellation / decline.
+            if (!$oldCalendar) {
+                // No old and no new calendar, there's no thing to do.
+                return array();
+            }
+
+            $eventInfo = $oldEventInfo;
+
+            if (in_array($eventInfo['organizer'], $userHref)) {
+                // This is an organizer deleting the event.
+                $eventInfo['attendees'] = array();
+                // Increasing the sequence, but only if the organizer deleted
+                // the event.
+                $eventInfo['sequence']++;
+            } else {
+                // This is an attendee deleting the event.
+                foreach($eventInfo['attendees'] as $key=>$attendee) {
+                    if (in_array($attendee['href'], $userHref)) {
+                        $eventInfo['attendees'][$key]['instances'] = array('master' =>
+                            array('id'=>'master', 'partstat' => 'DECLINED')
+                        );
+                    }
+                }
+            }
+            $baseCalendar = $oldCalendar;
+
+        }
+
+        if (in_array($eventInfo['organizer'], $userHref)) {
+            return $this->parseEventForOrganizer($baseCalendar, $eventInfo, $oldEventInfo);
+        } elseif ($oldCalendar) {
+            // We need to figure out if the user is an attendee, but we're only
+            // doing so if there's an oldCalendar, because we only want to
+            // process updates, not creation of new events.
+            foreach($eventInfo['attendees'] as $attendee) {
+                if (in_array($attendee['href'], $userHref)) {
+                    return $this->parseEventForAttendee($baseCalendar, $eventInfo, $oldEventInfo, $attendee['href']);
+                }
+            }
+        }
+        return array();
+
+    }
+
+    /**
+     * Processes incoming REQUEST messages.
+     *
+     * This is message from an organizer, and is either a new event
+     * invite, or an update to an existing one.
+     *
+     *
+     * @param Message $itipMessage
+     * @param VCalendar $existingObject
+     * @return VCalendar|null
+     */
+    protected function processMessageRequest(Message $itipMessage, VCalendar $existingObject = null) {
+
+        if (!$existingObject) {
+            // This is a new invite, and we're just going to copy over
+            // all the components from the invite.
+            $existingObject = new VCalendar();
+            foreach($itipMessage->message->getComponents() as $component) {
+                $existingObject->add(clone $component);
+            }
+        } else {
+            // We need to update an existing object with all the new
+            // information. We can just remove all existing components
+            // and create new ones.
+            foreach($existingObject->getComponents() as $component) {
+                $existingObject->remove($component);
+            }
+            foreach($itipMessage->message->getComponents() as $component) {
+                $existingObject->add(clone $component);
+            }
+        }
+        return $existingObject;
+
+    }
+
+    /**
+     * Processes incoming CANCEL messages.
+     *
+     * This is a message from an organizer, and means that either an
+     * attendee got removed from an event, or an event got cancelled
+     * altogether.
+     *
+     * @param Message $itipMessage
+     * @param VCalendar $existingObject
+     * @return VCalendar|null
+     */
+    protected function processMessageCancel(Message $itipMessage, VCalendar $existingObject = null) {
+
+        if (!$existingObject) {
+            // The event didn't exist in the first place, so we're just
+            // ignoring this message.
+        } else {
+            foreach($existingObject->VEVENT as $vevent) {
+                $vevent->STATUS = 'CANCELLED';
+                $vevent->SEQUENCE = $itipMessage->sequence;
+            }
+        }
+        return $existingObject;
+
+    }
+
+    /**
+     * Processes incoming REPLY messages.
+     *
+     * The message is a reply. This is for example an attendee telling
+     * an organizer he accepted the invite, or declined it.
+     *
+     * @param Message $itipMessage
+     * @param VCalendar $existingObject
+     * @return VCalendar|null
+     */
+    protected function processMessageReply(Message $itipMessage, VCalendar $existingObject = null) {
+
+        // A reply can only be processed based on an existing object.
+        // If the object is not available, the reply is ignored.
+        if (!$existingObject) {
+            return null;
+        }
+        $instances = array();
+        $requestStatus = '2.0';
+
+        // Finding all the instances the attendee replied to.
+        foreach($itipMessage->message->VEVENT as $vevent) {
+            $recurId = isset($vevent->{'RECURRENCE-ID'})?$vevent->{'RECURRENCE-ID'}->getValue():'master';
+            $attendee = $vevent->ATTENDEE;
+            $instances[$recurId] = $attendee['PARTSTAT']->getValue();
+            if (isset($vevent->{'REQUEST-STATUS'})) {
+                $requestStatus = $vevent->{'REQUEST-STATUS'}->getValue();
+                list($requestStatus) = explode(';', $requestStatus);
+            }
+        }
+
+        // Now we need to loop through the original organizer event, to find
+        // all the instances where we have a reply for.
+        $masterObject = null;
+        foreach($existingObject->VEVENT as $vevent) {
+            $recurId = isset($vevent->{'RECURRENCE-ID'})?$vevent->{'RECURRENCE-ID'}->getValue():'master';
+            if ($recurId==='master') {
+                $masterObject = $vevent;
+            }
+            if (isset($instances[$recurId])) {
+                $attendeeFound = false;
+                if (isset($vevent->ATTENDEE)) {
+                    foreach($vevent->ATTENDEE as $attendee) {
+                        if ($attendee->getValue() === $itipMessage->sender) {
+                            $attendeeFound = true;
+                            $attendee['PARTSTAT'] = $instances[$recurId];
+                            $attendee['SCHEDULE-STATUS'] = $requestStatus;
+                            // Un-setting the RSVP status, because we now know
+                            // that the attende already replied.
+                            unset($attendee['RSVP']);
+                            break;
+                        }
+                    }
+                }
+                if (!$attendeeFound) {
+                    // Adding a new attendee. The iTip documentation calls this
+                    // a party crasher.
+                    $attendee = $vevent->add('ATTENDEE', $itipMessage->sender, array(
+                        'PARTSTAT' => $instances[$recurId]
+                    ));
+                    if ($itipMessage->senderName) $attendee['CN'] = $itipMessage->senderName;
+                }
+                unset($instances[$recurId]);
+            }
+        }
+
+        if(!$masterObject) {
+            // No master object, we can't add new instances.
+            return null;
+        }
+        // If we got replies to instances that did not exist in the
+        // original list, it means that new exceptions must be created.
+        foreach($instances as $recurId=>$partstat) {
+
+            $recurrenceIterator = new EventIterator($existingObject, $itipMessage->uid);
+            $found = false;
+            $iterations = 1000;
+            do {
+
+                $newObject = $recurrenceIterator->getEventObject();
+                $recurrenceIterator->next();
+
+                if (isset($newObject->{'RECURRENCE-ID'}) && $newObject->{'RECURRENCE-ID'}->getValue()===$recurId) {
+                    $found = true;
+                }
+                $iterations--;
+
+            } while($recurrenceIterator->valid() && !$found && $iterations);
+
+            // Invalid recurrence id. Skipping this object.
+            if (!$found) continue;
+
+            unset(
+                $newObject->RRULE,
+                $newObject->EXDATE,
+                $newObject->RDATE
+            );
+            $attendeeFound = false;
+            if (isset($newObject->ATTENDEE)) {
+                foreach($newObject->ATTENDEE as $attendee) {
+                    if ($attendee->getValue() === $itipMessage->sender) {
+                        $attendeeFound = true;
+                        $attendee['PARTSTAT'] = $partstat;
+                        break;
+                    }
+                }
+            }
+            if (!$attendeeFound) {
+                // Adding a new attendee
+                $attendee = $newObject->add('ATTENDEE', $itipMessage->sender, array(
+                    'PARTSTAT' => $partstat
+                ));
+                if ($itipMessage->senderName) {
+                    $attendee['CN'] = $itipMessage->senderName;
+                }
+            }
+            $existingObject->add($newObject);
+
+        }
+        return $existingObject;
+
+    }
+
+    /**
+     * This method is used in cases where an event got updated, and we
+     * potentially need to send emails to attendees to let them know of updates
+     * in the events.
+     *
+     * We will detect which attendees got added, which got removed and create
+     * specific messages for these situations.
+     *
+     * @param VCalendar $calendar
+     * @param array $eventInfo
+     * @param array $oldEventInfo
+     * @return array
+     */
+    protected function parseEventForOrganizer(VCalendar $calendar, array $eventInfo, array $oldEventInfo) {
+
+        // Merging attendee lists.
+        $attendees = array();
+        foreach($oldEventInfo['attendees'] as $attendee) {
+            $attendees[$attendee['href']] = array(
+                'href' => $attendee['href'],
+                'oldInstances' => $attendee['instances'],
+                'newInstances' => array(),
+                'name' => $attendee['name'],
+                'forceSend' => null,
+            );
+        }
+        foreach($eventInfo['attendees'] as $attendee) {
+            if (isset($attendees[$attendee['href']])) {
+                $attendees[$attendee['href']]['name'] = $attendee['name'];
+                $attendees[$attendee['href']]['newInstances'] = $attendee['instances'];
+                $attendees[$attendee['href']]['forceSend'] = $attendee['forceSend'];
+            } else {
+                $attendees[$attendee['href']] = array(
+                    'href' => $attendee['href'],
+                    'oldInstances' => array(),
+                    'newInstances' => $attendee['instances'],
+                    'name' => $attendee['name'],
+                    'forceSend' => $attendee['forceSend'],
+                );
+            }
+        }
+
+        $messages = array();
+
+        foreach($attendees as $attendee) {
+
+            // An organizer can also be an attendee. We should not generate any
+            // messages for those.
+            if ($attendee['href']===$eventInfo['organizer']) {
+                continue;
+            }
+
+            $message = new Message();
+            $message->uid = $eventInfo['uid'];
+            $message->component = 'VEVENT';
+            $message->sequence = $eventInfo['sequence'];
+            $message->sender = $eventInfo['organizer'];
+            $message->senderName = $eventInfo['organizerName'];
+            $message->recipient = $attendee['href'];
+            $message->recipientName = $attendee['name'];
+
+            if (!$attendee['newInstances']) {
+
+                // If there are no instances the attendee is a part of, it
+                // means the attendee was removed and we need to send him a
+                // CANCEL.
+                $message->method = 'CANCEL';
+
+                // Creating the new iCalendar body.
+                $icalMsg = new VCalendar();
+                $icalMsg->METHOD = $message->method;
+                $event = $icalMsg->add('VEVENT', array(
+                    'UID' => $message->uid,
+                    'SEQUENCE' => $message->sequence,
+                ));
+                if (isset($calendar->VEVENT->SUMMARY)) {
+                    $event->add('SUMMARY', $calendar->VEVENT->SUMMARY->getValue());
+                }
+                $event->add(clone $calendar->VEVENT->DTSTART);
+                if (isset($calendar->VEVENT->DTEND)) {
+                    $event->add(clone $calendar->VEVENT->DTEND);
+                } elseif (isset($calendar->VEVENT->DURATION)) {
+                    $event->add(clone $calendar->VEVENT->DURATION);
+                }
+                $org = $event->add('ORGANIZER', $eventInfo['organizer']);
+                if ($eventInfo['organizerName']) $org['CN'] = $eventInfo['organizerName'];
+                $event->add('ATTENDEE', $attendee['href'], array(
+                    'CN' => $attendee['name'],
+                ));
+                $message->significantChange = true;
+
+            } else {
+
+                // The attendee gets the updated event body
+                $message->method = 'REQUEST';
+
+                // Creating the new iCalendar body.
+                $icalMsg = new VCalendar();
+                $icalMsg->METHOD = $message->method;
+
+                foreach($calendar->select('VTIMEZONE') as $timezone) {
+                    $icalMsg->add(clone $timezone);
+                }
+
+                // We need to find out that this change is significant. If it's
+                // not, systems may opt to not send messages.
+                //
+                // We do this based on the 'significantChangeHash' which is
+                // some value that changes if there's a certain set of
+                // properties changed in the event, or simply if there's a
+                // difference in instances that the attendee is invited to.
+
+                $message->significantChange =
+                    $attendee['forceSend'] === 'REQUEST' ||
+                    array_keys($attendee['oldInstances']) != array_keys($attendee['newInstances']) ||
+                    $oldEventInfo['significantChangeHash']!==$eventInfo['significantChangeHash'];
+
+                foreach($attendee['newInstances'] as $instanceId => $instanceInfo) {
+
+                    $currentEvent = clone $eventInfo['instances'][$instanceId];
+                    if ($instanceId === 'master') {
+
+                        // We need to find a list of events that the attendee
+                        // is not a part of to add to the list of exceptions.
+                        $exceptions = array();
+                        foreach($eventInfo['instances'] as $instanceId=>$vevent) {
+                            if (!isset($attendee['newInstances'][$instanceId])) {
+                                $exceptions[] = $instanceId;
+                            }
+                        }
+
+                        // If there were exceptions, we need to add it to an
+                        // existing EXDATE property, if it exists.
+                        if ($exceptions) {
+                            if (isset($currentEvent->EXDATE)) {
+                                $currentEvent->EXDATE->setParts(array_merge(
+                                    $currentEvent->EXDATE->getParts(),
+                                    $exceptions
+                                ));
+                            } else {
+                                $currentEvent->EXDATE = $exceptions;
+                            }
+                        }
+
+                        // Cleaning up any scheduling information that
+                        // shouldn't be sent along.
+                        unset($currentEvent->ORGANIZER['SCHEDULE-FORCE-SEND']);
+                        unset($currentEvent->ORGANIZER['SCHEDULE-STATUS']);
+
+                        foreach($currentEvent->ATTENDEE as $attendee) {
+                            unset($attendee['SCHEDULE-FORCE-SEND']);
+                            unset($attendee['SCHEDULE-STATUS']);
+
+                            // We're adding PARTSTAT=NEEDS-ACTION to ensure that
+                            // iOS shows an "Inbox Item"
+                            if (!isset($attendee['PARTSTAT'])) {
+                                $attendee['PARTSTAT'] = 'NEEDS-ACTION';
+                            }
+
+                        }
+
+                    }
+
+                    $icalMsg->add($currentEvent);
+
+                }
+
+            }
+
+            $message->message = $icalMsg;
+            $messages[] = $message;
+
+        }
+
+        return $messages;
+
+    }
+
+    /**
+     * Parse an event update for an attendee.
+     *
+     * This function figures out if we need to send a reply to an organizer.
+     *
+     * @param VCalendar $calendar
+     * @param array $eventInfo
+     * @param array $oldEventInfo
+     * @param string $attendee
+     * @return Message[]
+     */
+    protected function parseEventForAttendee(VCalendar $calendar, array $eventInfo, array $oldEventInfo, $attendee) {
+
+        if ($this->scheduleAgentServerRules && $eventInfo['organizerScheduleAgent']==='CLIENT') {
+            return array();
+        }
+
+        // Don't bother generating messages for events that have already been
+        // cancelled.
+        if ($eventInfo['status']==='CANCELLED') {
+            return array();
+        }
+
+        $oldInstances = !empty($oldEventInfo['attendees'][$attendee]['instances']) ?
+            $oldEventInfo['attendees'][$attendee]['instances'] :
+            array();
+
+        $instances = array();
+        foreach($oldInstances as $instance) {
+
+            $instances[$instance['id']] = array(
+                'id' => $instance['id'],
+                'oldstatus' => $instance['partstat'],
+                'newstatus' => null,
+            );
+
+        }
+        foreach($eventInfo['attendees'][$attendee]['instances'] as $instance) {
+
+            if (isset($instances[$instance['id']])) {
+                $instances[$instance['id']]['newstatus'] = $instance['partstat'];
+            } else {
+                $instances[$instance['id']] = array(
+                    'id' => $instance['id'],
+                    'oldstatus' => null,
+                    'newstatus' => $instance['partstat'],
+                );
+            }
+
+        }
+
+        // We need to also look for differences in EXDATE. If there are new
+        // items in EXDATE, it means that an attendee deleted instances of an
+        // event, which means we need to send DECLINED specifically for those
+        // instances.
+        // We only need to do that though, if the master event is not declined.
+        if (isset($instances['master']) && $instances['master']['newstatus'] !== 'DECLINED') {
+            foreach($eventInfo['exdate'] as $exDate) {
+
+                if (!in_array($exDate, $oldEventInfo['exdate'])) {
+                    if (isset($instances[$exDate])) {
+                        $instances[$exDate]['newstatus'] = 'DECLINED';
+                    } else {
+                        $instances[$exDate] = array(
+                            'id' => $exDate,
+                            'oldstatus' => null,
+                            'newstatus' => 'DECLINED',
+                        );
+                    }
+                }
+
+            }
+        }
+
+        // Gathering a few extra properties for each instance.
+        foreach($instances as $recurId=>$instanceInfo) {
+
+            if (isset($eventInfo['instances'][$recurId])) {
+                $instances[$recurId]['dtstart'] = clone $eventInfo['instances'][$recurId]->DTSTART;
+            } else {
+                $instances[$recurId]['dtstart'] = $recurId;
+            }
+
+        }
+
+        $message = new Message();
+        $message->uid = $eventInfo['uid'];
+        $message->method = 'REPLY';
+        $message->component = 'VEVENT';
+        $message->sequence = $eventInfo['sequence'];
+        $message->sender = $attendee;
+        $message->senderName = $eventInfo['attendees'][$attendee]['name'];
+        $message->recipient = $eventInfo['organizer'];
+        $message->recipientName = $eventInfo['organizerName'];
+
+        $icalMsg = new VCalendar();
+        $icalMsg->METHOD = 'REPLY';
+
+        $hasReply = false;
+
+        foreach($instances as $instance) {
+
+            if ($instance['oldstatus']==$instance['newstatus'] && $eventInfo['organizerForceSend'] !== 'REPLY') {
+                // Skip
+                continue;
+            }
+
+            $event = $icalMsg->add('VEVENT', array(
+                'UID' => $message->uid,
+                'SEQUENCE' => $message->sequence,
+            ));
+            $summary = isset($calendar->VEVENT->SUMMARY)?$calendar->VEVENT->SUMMARY->getValue():'';
+            // Adding properties from the correct source instance
+            if (isset($eventInfo['instances'][$instance['id']])) {
+                $instanceObj = $eventInfo['instances'][$instance['id']];
+                $event->add(clone $instanceObj->DTSTART);
+                if (isset($instanceObj->DTEND)) {
+                    $event->add(clone $instanceObj->DTEND);
+                } elseif (isset($instanceObj->DURATION)) {
+                    $event->add(clone $instanceObj->DURATION);
+                }
+                if (isset($instanceObj->SUMMARY)) {
+                    $event->add('SUMMARY', $instanceObj->SUMMARY->getValue());
+                } elseif ($summary) {
+                    $event->add('SUMMARY', $summary);
+                }
+            } else {
+                // This branch of the code is reached, when a reply is
+                // generated for an instance of a recurring event, through the
+                // fact that the instance has disappeared by showing up in
+                // EXDATE
+                $dt = DateTimeParser::parse($instance['id'], $eventInfo['timezone']);
+                // Treat is as a DATE field
+                if (strlen($instance['id']) <= 8) {
+                    $recur = $event->add('DTSTART', $dt, array('VALUE' => 'DATE'));
+                } else {
+                    $recur = $event->add('DTSTART', $dt);
+                }
+                if ($summary) {
+                    $event->add('SUMMARY', $summary);
+                }
+            }
+            if ($instance['id'] !== 'master') {
+                $dt = DateTimeParser::parse($instance['id'], $eventInfo['timezone']);
+                // Treat is as a DATE field
+                if (strlen($instance['id']) <= 8) {
+                    $recur = $event->add('RECURRENCE-ID', $dt, array('VALUE' => 'DATE'));
+                } else {
+                    $recur = $event->add('RECURRENCE-ID', $dt);
+                }
+            }
+            $organizer = $event->add('ORGANIZER', $message->recipient);
+            if ($message->recipientName) {
+                $organizer['CN'] = $message->recipientName;
+            }
+            $attendee = $event->add('ATTENDEE', $message->sender, array(
+                'PARTSTAT' => $instance['newstatus']
+            ));
+            if ($message->senderName) {
+                $attendee['CN'] = $message->senderName;
+            }
+            $hasReply = true;
+
+        }
+
+        if ($hasReply) {
+            $message->message = $icalMsg;
+            return array($message);
+        } else {
+            return array();
+        }
+
+    }
+
+    /**
+     * Returns attendee information and information about instances of an
+     * event.
+     *
+     * Returns an array with the following keys:
+     *
+     * 1. uid
+     * 2. organizer
+     * 3. organizerName
+     * 4. organizerScheduleAgent
+     * 5. organizerForceSend
+     * 6. instances
+     * 7. attendees
+     * 8. sequence
+     * 9. exdate
+     * 10. timezone - strictly the timezone on which the recurrence rule is
+     *                based on.
+     * 11. significantChangeHash
+     * 12. status
+     * @param VCalendar $calendar
+     * @return array
+     */
+    protected function parseEventInfo(VCalendar $calendar = null) {
+
+        $uid = null;
+        $organizer = null;
+        $organizerName = null;
+        $organizerForceSend = null;
+        $sequence = null;
+        $timezone = null;
+        $status = null;
+        $organizerScheduleAgent = 'SERVER';
+
+        $significantChangeHash = '';
+
+        // Now we need to collect a list of attendees, and which instances they
+        // are a part of.
+        $attendees = array();
+
+        $instances = array();
+        $exdate = array();
+
+        foreach($calendar->VEVENT as $vevent) {
+
+            if (is_null($uid)) {
+                $uid = $vevent->UID->getValue();
+            } else {
+                if ($uid !== $vevent->UID->getValue()) {
+                    throw new ITipException('If a calendar contained more than one event, they must have the same UID.');
+                }
+            }
+
+            if (!isset($vevent->DTSTART)) {
+                throw new ITipException('An event MUST have a DTSTART property.');
+            }
+
+            if (isset($vevent->ORGANIZER)) {
+                if (is_null($organizer)) {
+                    $organizer = $vevent->ORGANIZER->getNormalizedValue();
+                    $organizerName = isset($vevent->ORGANIZER['CN'])?$vevent->ORGANIZER['CN']:null;
+                } else {
+                    if ($organizer !== $vevent->ORGANIZER->getNormalizedValue()) {
+                        throw new SameOrganizerForAllComponentsException('Every instance of the event must have the same organizer.');
+                    }
+                }
+                $organizerForceSend =
+                    isset($vevent->ORGANIZER['SCHEDULE-FORCE-SEND']) ?
+                    strtoupper($vevent->ORGANIZER['SCHEDULE-FORCE-SEND']) :
+                    null;
+                $organizerScheduleAgent =
+                    isset($vevent->ORGANIZER['SCHEDULE-AGENT']) ?
+                    strtoupper((string)$vevent->ORGANIZER['SCHEDULE-AGENT']) :
+                    'SERVER';
+            }
+            if (is_null($sequence) && isset($vevent->SEQUENCE)) {
+                $sequence = $vevent->SEQUENCE->getValue();
+            }
+            if (isset($vevent->EXDATE)) {
+                foreach ($vevent->select('EXDATE') as $val) {
+                    $exdate = array_merge($exdate, $val->getParts());
+                }
+                sort($exdate);
+            }
+            if (isset($vevent->STATUS)) {
+                $status = strtoupper($vevent->STATUS->getValue());
+            }
+
+            $recurId = isset($vevent->{'RECURRENCE-ID'}) ? $vevent->{'RECURRENCE-ID'}->getValue() : 'master';
+            if (is_null($timezone)) {
+                if ($recurId === 'master') {
+                    $timezone = $vevent->DTSTART->getDateTime()->getTimeZone();
+                } else {
+                    $timezone = $vevent->{'RECURRENCE-ID'}->getDateTime()->getTimeZone();
+                }
+            }
+            if(isset($vevent->ATTENDEE)) {
+                foreach($vevent->ATTENDEE as $attendee) {
+
+                    if ($this->scheduleAgentServerRules &&
+                        isset($attendee['SCHEDULE-AGENT']) &&
+                        strtoupper($attendee['SCHEDULE-AGENT']->getValue()) === 'CLIENT'
+                    ) {
+                        continue;
+                    }
+                    $partStat =
+                        isset($attendee['PARTSTAT']) ?
+                        strtoupper($attendee['PARTSTAT']) :
+                        'NEEDS-ACTION';
+
+                    $forceSend =
+                        isset($attendee['SCHEDULE-FORCE-SEND']) ?
+                        strtoupper($attendee['SCHEDULE-FORCE-SEND']) :
+                        null;
+
+
+                    if (isset($attendees[$attendee->getNormalizedValue()])) {
+                        $attendees[$attendee->getNormalizedValue()]['instances'][$recurId] = array(
+                            'id' => $recurId,
+                            'partstat' => $partStat,
+                            'force-send' => $forceSend,
+                        );
+                    } else {
+                        $attendees[$attendee->getNormalizedValue()] = array(
+                            'href' => $attendee->getNormalizedValue(),
+                            'instances' => array(
+                                $recurId => array(
+                                    'id' => $recurId,
+                                    'partstat' => $partStat,
+                                ),
+                            ),
+                            'name' => isset($attendee['CN'])?(string)$attendee['CN']:null,
+                            'forceSend' => $forceSend,
+                        );
+                    }
+
+                }
+                $instances[$recurId] = $vevent;
+
+            }
+
+            foreach($this->significantChangeProperties as $prop) {
+                if (isset($vevent->$prop)) {
+                    $propertyValues = $vevent->select($prop);
+
+                    $significantChangeHash.=$prop.':';
+
+                    if ($prop === 'EXDATE') {
+
+                        $significantChangeHash.= implode(',', $exdate).';';
+
+                    } else {
+
+                        foreach($propertyValues as $val) {
+                            $significantChangeHash.= $val->getValue().';';
+                        }
+
+                    }
+                }
+            }
+
+        }
+        $significantChangeHash = md5($significantChangeHash);
+
+        return compact(
+            'uid',
+            'organizer',
+            'organizerName',
+            'organizerScheduleAgent',
+            'organizerForceSend',
+            'instances',
+            'attendees',
+            'sequence',
+            'exdate',
+            'timezone',
+            'significantChangeHash',
+            'status'
+        );
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/ITip/ITipException.php b/vendor/sabre/vobject/lib/ITip/ITipException.php
new file mode 100644
index 0000000000000000000000000000000000000000..ad5e53ab4ae02903d813f91f1d14ff3788a3a030
--- /dev/null
+++ b/vendor/sabre/vobject/lib/ITip/ITipException.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace Sabre\VObject\ITip;
+
+use Exception;
+
+/**
+ * This message is emitted in case of serious problems with iTip messages.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class ITipException extends Exception {
+}
diff --git a/vendor/sabre/vobject/lib/ITip/Message.php b/vendor/sabre/vobject/lib/ITip/Message.php
new file mode 100644
index 0000000000000000000000000000000000000000..251cfc966951b54a12cd59c9c030c0592a36c4e7
--- /dev/null
+++ b/vendor/sabre/vobject/lib/ITip/Message.php
@@ -0,0 +1,141 @@
+<?php
+
+namespace Sabre\VObject\ITip;
+
+/**
+ * This class represents an iTip message
+ *
+ * A message holds all the information relevant to the message, including the
+ * object itself.
+ *
+ * It should for the most part be treated as immutable.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class Message {
+
+    /**
+     * The object's UID
+     *
+     * @var string
+     */
+    public $uid;
+
+    /**
+     * The component type, such as VEVENT
+     *
+     * @var string
+     */
+    public $component;
+
+    /**
+     * Contains the ITip method, which is something like REQUEST, REPLY or
+     * CANCEL.
+     *
+     * @var string
+     */
+    public $method;
+
+    /**
+     * The current sequence number for the event.
+     *
+     * @var int
+     */
+    public $sequence;
+
+    /**
+     * The senders' email address.
+     *
+     * Note that this does not imply that this has to be used in a From: field
+     * if the message is sent by email. It may also be populated in Reply-To:
+     * or not at all.
+     *
+     * @var string
+     */
+    public $sender;
+
+    /**
+     * The name of the sender. This is often populated from a CN parameter from
+     * either the ORGANIZER or ATTENDEE, depending on the message.
+     *
+     * @var string|null
+     */
+    public $senderName;
+
+    /**
+     * The recipient's email address.
+     *
+     * @var string
+     */
+    public $recipient;
+
+    /**
+     * The name of the recipient. This is usually populated with the CN
+     * parameter from the ATTENDEE or ORGANIZER property, if it's available.
+     *
+     * @var string|null
+     */
+    public $recipientName;
+
+    /**
+     * After the message has been delivered, this should contain a string such
+     * as : 1.1;Sent or 1.2;Delivered.
+     *
+     * In case of a failure, this will hold the error status code.
+     *
+     * See:
+     * http://tools.ietf.org/html/rfc6638#section-7.3
+     *
+     * @var string
+     */
+    public $scheduleStatus;
+
+    /**
+     * The iCalendar / iTip body.
+     *
+     * @var \Sabre\VObject\Component\VCalendar
+     */
+    public $message;
+
+    /**
+     * This will be set to true, if the iTip broker considers the change
+     * 'significant'.
+     *
+     * In practice, this means that we'll only mark it true, if for instance
+     * DTSTART changed. This allows systems to only send iTip messages when
+     * significant changes happened. This is especially useful for iMip, as
+     * normally a ton of messages may be generated for normal calendar use.
+     *
+     * To see the list of properties that are considered 'significant', check
+     * out Sabre\VObject\ITip\Broker::$significantChangeProperties.
+     *
+     * @var bool
+     */
+    public $significantChange = true;
+
+    /**
+     * Returns the schedule status as a string.
+     *
+     * For example:
+     * 1.2
+     *
+     * @return mixed bool|string
+     */
+    public function getScheduleStatus() {
+
+        if(!$this->scheduleStatus) {
+
+            return false;
+
+        } else {
+
+            list($scheduleStatus) = explode(';', $this->scheduleStatus);
+            return $scheduleStatus;
+
+        }
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/ITip/SameOrganizerForAllComponentsException.php b/vendor/sabre/vobject/lib/ITip/SameOrganizerForAllComponentsException.php
new file mode 100644
index 0000000000000000000000000000000000000000..d8af0317bb68530ffa510ad2926bc2d1269114d4
--- /dev/null
+++ b/vendor/sabre/vobject/lib/ITip/SameOrganizerForAllComponentsException.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace Sabre\VObject\ITip;
+
+/**
+ * SameOrganizerForAllComponentsException
+ *
+ * This exception is emitted when an event is encountered with more than one
+ * component (e.g.: exceptions), but the organizer is not identical in every
+ * component.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class SameOrganizerForAllComponentsException extends ITipException {
+
+}
diff --git a/vendor/sabre/vobject/lib/Node.php b/vendor/sabre/vobject/lib/Node.php
new file mode 100644
index 0000000000000000000000000000000000000000..5735e30dbb0aca08ff614ef3191a2a6bddad89c7
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Node.php
@@ -0,0 +1,226 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * A node is the root class for every element in an iCalendar of vCard object.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+abstract class Node implements \IteratorAggregate, \ArrayAccess, \Countable {
+
+    /**
+     * The following constants are used by the validate() method.
+     *
+     * If REPAIR is set, the validator will attempt to repair any broken data
+     * (if possible).
+     */
+    const REPAIR = 1;
+
+    /**
+     * If this option is set, the validator will operate on the vcards on the
+     * assumption that the vcards need to be valid for CardDAV.
+     *
+     * This means for example that the UID is required, whereas it is not for
+     * regular vcards.
+     */
+    const PROFILE_CARDDAV = 2;
+
+    /**
+     * If this option is set, the validator will operate on iCalendar objects
+     * on the assumption that the vcards need to be valid for CalDAV.
+     *
+     * This means for example that calendars can only contain objects with
+     * identical component types and UIDs.
+     */
+    const PROFILE_CALDAV = 4;
+
+    /**
+     * Reference to the parent object, if this is not the top object.
+     *
+     * @var Node
+     */
+    public $parent;
+
+    /**
+     * Iterator override
+     *
+     * @var ElementList
+     */
+    protected $iterator = null;
+
+    /**
+     * The root document
+     *
+     * @var Component
+     */
+    protected $root;
+
+    /**
+     * Serializes the node into a mimedir format
+     *
+     * @return string
+     */
+    abstract public function serialize();
+
+    /**
+     * This method returns an array, with the representation as it should be
+     * encoded in json. This is used to create jCard or jCal documents.
+     *
+     * @return array
+     */
+    abstract public function jsonSerialize();
+
+    /* {{{ IteratorAggregator interface */
+
+    /**
+     * Returns the iterator for this object
+     *
+     * @return ElementList
+     */
+    public function getIterator() {
+
+        if (!is_null($this->iterator))
+            return $this->iterator;
+
+        return new ElementList(array($this));
+
+    }
+
+    /**
+     * Sets the overridden iterator
+     *
+     * Note that this is not actually part of the iterator interface
+     *
+     * @param ElementList $iterator
+     * @return void
+     */
+    public function setIterator(ElementList $iterator) {
+
+        $this->iterator = $iterator;
+
+    }
+
+    /**
+     * Validates the node for correctness.
+     *
+     * The following options are supported:
+     *   Node::REPAIR - May attempt to automatically repair the problem.
+     *
+     * This method returns an array with detected problems.
+     * Every element has the following properties:
+     *
+     *  * level - problem level.
+     *  * message - A human-readable string describing the issue.
+     *  * node - A reference to the problematic node.
+     *
+     * The level means:
+     *   1 - The issue was repaired (only happens if REPAIR was turned on)
+     *   2 - An inconsequential issue
+     *   3 - A severe issue.
+     *
+     * @param int $options
+     * @return array
+     */
+    public function validate($options = 0) {
+
+        return array();
+
+    }
+
+    /* }}} */
+
+    /* {{{ Countable interface */
+
+    /**
+     * Returns the number of elements
+     *
+     * @return int
+     */
+    public function count() {
+
+        $it = $this->getIterator();
+        return $it->count();
+
+    }
+
+    /* }}} */
+
+    /* {{{ ArrayAccess Interface */
+
+
+    /**
+     * Checks if an item exists through ArrayAccess.
+     *
+     * This method just forwards the request to the inner iterator
+     *
+     * @param int $offset
+     * @return bool
+     */
+    public function offsetExists($offset) {
+
+        $iterator = $this->getIterator();
+        return $iterator->offsetExists($offset);
+
+    }
+
+    /**
+     * Gets an item through ArrayAccess.
+     *
+     * This method just forwards the request to the inner iterator
+     *
+     * @param int $offset
+     * @return mixed
+     */
+    public function offsetGet($offset) {
+
+        $iterator = $this->getIterator();
+        return $iterator->offsetGet($offset);
+
+    }
+
+    /**
+     * Sets an item through ArrayAccess.
+     *
+     * This method just forwards the request to the inner iterator
+     *
+     * @param int $offset
+     * @param mixed $value
+     * @return void
+     */
+    public function offsetSet($offset, $value) {
+
+        $iterator = $this->getIterator();
+        $iterator->offsetSet($offset,$value);
+
+    // @codeCoverageIgnoreStart
+    //
+    // This method always throws an exception, so we ignore the closing
+    // brace
+    }
+    // @codeCoverageIgnoreEnd
+
+    /**
+     * Sets an item through ArrayAccess.
+     *
+     * This method just forwards the request to the inner iterator
+     *
+     * @param int $offset
+     * @return void
+     */
+    public function offsetUnset($offset) {
+
+        $iterator = $this->getIterator();
+        $iterator->offsetUnset($offset);
+
+    // @codeCoverageIgnoreStart
+    //
+    // This method always throws an exception, so we ignore the closing
+    // brace
+    }
+    // @codeCoverageIgnoreEnd
+
+    /* }}} */
+}
diff --git a/vendor/sabre/vobject/lib/Parameter.php b/vendor/sabre/vobject/lib/Parameter.php
new file mode 100644
index 0000000000000000000000000000000000000000..fb88a00c0d154d5971c740ccab0e8de965f0bfaf
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Parameter.php
@@ -0,0 +1,373 @@
+<?php
+
+namespace Sabre\VObject;
+
+use
+    ArrayObject;
+
+/**
+ * VObject Parameter
+ *
+ * This class represents a parameter. A parameter is always tied to a property.
+ * In the case of:
+ *   DTSTART;VALUE=DATE:20101108
+ * VALUE=DATE would be the parameter name and value.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class Parameter extends Node {
+
+    /**
+     * Parameter name
+     *
+     * @var string
+     */
+    public $name;
+
+    /**
+     * vCard 2.1 allows parameters to be encoded without a name.
+     *
+     * We can deduce the parameter name based on it's value.
+     *
+     * @var bool
+     */
+    public $noName = false;
+
+    /**
+     * Parameter value
+     *
+     * @var string
+     */
+    protected $value;
+
+    /**
+     * Sets up the object.
+     *
+     * It's recommended to use the create:: factory method instead.
+     *
+     * @param string $name
+     * @param string $value
+     */
+    public function __construct(Document $root, $name, $value = null) {
+
+        $this->name = strtoupper($name);
+        $this->root = $root;
+        if (is_null($name)) {
+            $this->noName = true;
+            $this->name = static::guessParameterNameByValue($value);
+        }
+
+        // If guessParameterNameByValue() returns an empty string
+        // above, we're actually dealing with a parameter that has no value.
+        // In that case we have to move the value to the name.
+        if ($this->name === '') {
+            $this->noName = false;
+            $this->name = strtoupper($value);
+        } else {
+            $this->setValue($value);
+        }
+
+    }
+
+    /**
+     * Try to guess property name by value, can be used for vCard 2.1 nameless parameters.
+     *
+     * Figuring out what the name should have been. Note that a ton of
+     * these are rather silly in 2014 and would probably rarely be
+     * used, but we like to be complete.
+     *
+     * @param string $value
+     * @return string
+     */
+    public static function guessParameterNameByValue($value) {
+        switch(strtoupper($value)) {
+
+            // Encodings
+            case '7-BIT' :
+            case 'QUOTED-PRINTABLE' :
+            case 'BASE64' :
+                $name = 'ENCODING';
+                break;
+
+            // Common types
+            case 'WORK' :
+            case 'HOME' :
+            case 'PREF' :
+
+                // Delivery Label Type
+            case 'DOM' :
+            case 'INTL' :
+            case 'POSTAL' :
+            case 'PARCEL' :
+
+                // Telephone types
+            case 'VOICE' :
+            case 'FAX' :
+            case 'MSG' :
+            case 'CELL' :
+            case 'PAGER' :
+            case 'BBS' :
+            case 'MODEM' :
+            case 'CAR' :
+            case 'ISDN' :
+            case 'VIDEO' :
+
+                // EMAIL types (lol)
+            case 'AOL' :
+            case 'APPLELINK' :
+            case 'ATTMAIL' :
+            case 'CIS' :
+            case 'EWORLD' :
+            case 'INTERNET' :
+            case 'IBMMAIL' :
+            case 'MCIMAIL' :
+            case 'POWERSHARE' :
+            case 'PRODIGY' :
+            case 'TLX' :
+            case 'X400' :
+
+                // Photo / Logo format types
+            case 'GIF' :
+            case 'CGM' :
+            case 'WMF' :
+            case 'BMP' :
+            case 'DIB' :
+            case 'PICT' :
+            case 'TIFF' :
+            case 'PDF ':
+            case 'PS' :
+            case 'JPEG' :
+            case 'MPEG' :
+            case 'MPEG2' :
+            case 'AVI' :
+            case 'QTIME' :
+
+                // Sound Digital Audio Type
+            case 'WAVE' :
+            case 'PCM' :
+            case 'AIFF' :
+
+                // Key types
+            case 'X509' :
+            case 'PGP' :
+                $name = 'TYPE';
+                break;
+
+            // Value types
+            case 'INLINE' :
+            case 'URL' :
+            case 'CONTENT-ID' :
+            case 'CID' :
+                $name = 'VALUE';
+                break;
+
+            default:
+                $name = '';
+        }
+
+        return $name;
+    }
+
+    /**
+     * Updates the current value.
+     *
+     * This may be either a single, or multiple strings in an array.
+     *
+     * @param string|array $value
+     * @return void
+     */
+    public function setValue($value) {
+
+        $this->value = $value;
+
+    }
+
+    /**
+     * Returns the current value
+     *
+     * This method will always return a string, or null. If there were multiple
+     * values, it will automatically concatinate them (separated by comma).
+     *
+     * @return string|null
+     */
+    public function getValue() {
+
+        if (is_array($this->value)) {
+            return implode(',' , $this->value);
+        } else {
+            return $this->value;
+        }
+
+    }
+
+    /**
+     * Sets multiple values for this parameter.
+     *
+     * @param array $value
+     * @return void
+     */
+    public function setParts(array $value) {
+
+        $this->value = $value;
+
+    }
+
+    /**
+     * Returns all values for this parameter.
+     *
+     * If there were no values, an empty array will be returned.
+     *
+     * @return array
+     */
+    public function getParts() {
+
+        if (is_array($this->value)) {
+            return $this->value;
+        } elseif (is_null($this->value)) {
+            return array();
+        } else {
+            return array($this->value);
+        }
+
+    }
+
+    /**
+     * Adds a value to this parameter
+     *
+     * If the argument is specified as an array, all items will be added to the
+     * parameter value list.
+     *
+     * @param string|array $part
+     * @return void
+     */
+    public function addValue($part) {
+
+        if (is_null($this->value)) {
+            $this->value = $part;
+        } else {
+            $this->value = array_merge((array)$this->value, (array)$part);
+        }
+
+    }
+
+    /**
+     * Checks if this parameter contains the specified value.
+     *
+     * This is a case-insensitive match. It makes sense to call this for for
+     * instance the TYPE parameter, to see if it contains a keyword such as
+     * 'WORK' or 'FAX'.
+     *
+     * @param string $value
+     * @return bool
+     */
+    public function has($value) {
+
+        return in_array(
+            strtolower($value),
+            array_map('strtolower', (array)$this->value)
+        );
+
+    }
+
+    /**
+     * Turns the object back into a serialized blob.
+     *
+     * @return string
+     */
+    public function serialize() {
+
+        $value = $this->getParts();
+
+        if (count($value)===0) {
+            return $this->name . '=';
+        }
+
+        if ($this->root->getDocumentType() === Document::VCARD21 && $this->noName) {
+
+            return implode(';', $value);
+
+        }
+
+        return $this->name . '=' . array_reduce(
+            $value,
+            function($out, $item) {
+
+                if (!is_null($out)) $out.=',';
+
+                // If there's no special characters in the string, we'll use the simple
+                // format.
+                //
+                // The list of special characters is defined as:
+                //
+                // Any character except CONTROL, DQUOTE, ";", ":", ","
+                //
+                // by the iCalendar spec:
+                // https://tools.ietf.org/html/rfc5545#section-3.1
+                //
+                // And we add ^ to that because of:
+                // https://tools.ietf.org/html/rfc6868
+                //
+                // But we've found that iCal (7.0, shipped with OSX 10.9)
+                // severaly trips on + characters not being quoted, so we
+                // added + as well.
+                if (!preg_match('#(?: [\n":;\^,\+] )#x', $item)) {
+                    return $out.$item;
+                } else {
+                    // Enclosing in double-quotes, and using RFC6868 for encoding any
+                    // special characters
+                    $out.='"' . strtr(
+                        $item,
+                        array(
+                            '^'  => '^^',
+                            "\n" => '^n',
+                            '"'  => '^\'',
+                        )
+                    ) . '"';
+                    return $out;
+                }
+
+            }
+        );
+
+    }
+
+    /**
+     * This method returns an array, with the representation as it should be
+     * encoded in json. This is used to create jCard or jCal documents.
+     *
+     * @return array
+     */
+    public function jsonSerialize() {
+
+        return $this->value;
+
+    }
+
+    /**
+     * Called when this object is being cast to a string
+     *
+     * @return string
+     */
+    public function __toString() {
+
+        return (string)$this->getValue();
+
+    }
+
+    /**
+     * Returns the iterator for this object
+     *
+     * @return ElementList
+     */
+    public function getIterator() {
+
+        if (!is_null($this->iterator))
+            return $this->iterator;
+
+        return $this->iterator = new ArrayObject((array)$this->value);
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/ParseException.php b/vendor/sabre/vobject/lib/ParseException.php
new file mode 100644
index 0000000000000000000000000000000000000000..d96d20720d6c88158f20051a9628edb8ae727179
--- /dev/null
+++ b/vendor/sabre/vobject/lib/ParseException.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * Exception thrown by Reader if an invalid object was attempted to be parsed.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class ParseException extends \Exception {
+}
diff --git a/vendor/sabre/vobject/lib/Parser/Json.php b/vendor/sabre/vobject/lib/Parser/Json.php
new file mode 100644
index 0000000000000000000000000000000000000000..50e2af24d3866a4b33ec74f85c9ff85684ffe893
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Parser/Json.php
@@ -0,0 +1,194 @@
+<?php
+
+namespace Sabre\VObject\Parser;
+
+use
+    Sabre\VObject\Component\VCalendar,
+    Sabre\VObject\Component\VCard,
+    Sabre\VObject\ParseException,
+    Sabre\VObject\EofException;
+
+/**
+ * Json Parser.
+ *
+ * This parser parses both the jCal and jCard formats.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class Json extends Parser {
+
+    /**
+     * The input data
+     *
+     * @var array
+     */
+    protected $input;
+
+    /**
+     * Root component
+     *
+     * @var Document
+     */
+    protected $root;
+
+    /**
+     * This method starts the parsing process.
+     *
+     * If the input was not supplied during construction, it's possible to pass
+     * it here instead.
+     *
+     * If either input or options are not supplied, the defaults will be used.
+     *
+     * @param resource|string|array|null $input
+     * @param int|null $options
+     * @return array
+     */
+    public function parse($input = null, $options = null) {
+
+        if (!is_null($input)) {
+            $this->setInput($input);
+        }
+        if (is_null($this->input)) {
+            throw new EofException('End of input stream, or no input supplied');
+        }
+
+        if (!is_null($options)) {
+            $this->options = $options;
+        }
+
+        switch($this->input[0]) {
+            case 'vcalendar' :
+                $this->root = new VCalendar(array(), false);
+                break;
+            case 'vcard' :
+                $this->root = new VCard(array(), false);
+                break;
+            default :
+                throw new ParseException('The root component must either be a vcalendar, or a vcard');
+
+        }
+        foreach($this->input[1] as $prop) {
+            $this->root->add($this->parseProperty($prop));
+        }
+        if (isset($this->input[2])) foreach($this->input[2] as $comp) {
+            $this->root->add($this->parseComponent($comp));
+        }
+
+        // Resetting the input so we can throw an feof exception the next time.
+        $this->input = null;
+
+        return $this->root;
+
+    }
+
+    /**
+     * Parses a component
+     *
+     * @param array $jComp
+     * @return \Sabre\VObject\Component
+     */
+    public function parseComponent(array $jComp) {
+
+        // We can remove $self from PHP 5.4 onward.
+        $self = $this;
+
+        $properties = array_map(
+            function($jProp) use ($self) {
+                return $self->parseProperty($jProp);
+            },
+            $jComp[1]
+        );
+
+        if (isset($jComp[2])) {
+
+            $components = array_map(
+                function($jComp) use ($self) {
+                    return $self->parseComponent($jComp);
+                },
+                $jComp[2]
+            );
+
+        } else $components = array();
+
+        return $this->root->createComponent(
+            $jComp[0],
+            array_merge($properties, $components),
+            $defaults = false
+        );
+
+    }
+
+    /**
+     * Parses properties.
+     *
+     * @param array $jProp
+     * @return \Sabre\VObject\Property
+     */
+    public function parseProperty(array $jProp) {
+
+        list(
+            $propertyName,
+            $parameters,
+            $valueType
+        ) = $jProp;
+
+        $propertyName = strtoupper($propertyName);
+
+        // This is the default class we would be using if we didn't know the
+        // value type. We're using this value later in this function.
+        $defaultPropertyClass = $this->root->getClassNameForPropertyName($propertyName);
+
+        $parameters = (array)$parameters;
+
+        $value = array_slice($jProp, 3);
+
+        $valueType = strtoupper($valueType);
+
+        if (isset($parameters['group'])) {
+            $propertyName = $parameters['group'] . '.' . $propertyName;
+            unset($parameters['group']);
+        }
+
+        $prop = $this->root->createProperty($propertyName, null, $parameters, $valueType);
+        $prop->setJsonValue($value);
+
+        // We have to do something awkward here. FlatText as well as Text
+        // represents TEXT values. We have to normalize these here. In the
+        // future we can get rid of FlatText once we're allowed to break BC
+        // again.
+        if ($defaultPropertyClass === 'Sabre\VObject\Property\FlatText') {
+            $defaultPropertyClass = 'Sabre\VObject\Property\Text';
+        }
+
+        // If the value type we received (e.g.: TEXT) was not the default value
+        // type for the given property (e.g.: BDAY), we need to add a VALUE=
+        // parameter.
+        if ($defaultPropertyClass !== get_class($prop)) {
+            $prop["VALUE"] = $valueType;
+        }
+
+        return $prop;
+
+    }
+
+    /**
+     * Sets the input data
+     *
+     * @param resource|string|array $input
+     * @return void
+     */
+    public function setInput($input) {
+
+        if (is_resource($input)) {
+            $input = stream_get_contents($input);
+        }
+        if (is_string($input)) {
+            $input = json_decode($input);
+        }
+        $this->input = $input;
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/Parser/MimeDir.php b/vendor/sabre/vobject/lib/Parser/MimeDir.php
new file mode 100644
index 0000000000000000000000000000000000000000..e7fa2ed40b3b6e9ba82d3fe2c10dac3d21ad4107
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Parser/MimeDir.php
@@ -0,0 +1,628 @@
+<?php
+
+namespace Sabre\VObject\Parser;
+
+use
+    Sabre\VObject\ParseException,
+    Sabre\VObject\EofException,
+    Sabre\VObject\Component,
+    Sabre\VObject\Property,
+    Sabre\VObject\Component\VCalendar,
+    Sabre\VObject\Component\VCard;
+
+/**
+ * MimeDir parser.
+ *
+ * This class parses iCalendar 2.0 and vCard 2.1, 3.0 and 4.0 files. This
+ * parser will return one of the following two objects from the parse method:
+ *
+ * Sabre\VObject\Component\VCalendar
+ * Sabre\VObject\Component\VCard
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class MimeDir extends Parser {
+
+    /**
+     * The input stream.
+     *
+     * @var resource
+     */
+    protected $input;
+
+    /**
+     * Root component
+     *
+     * @var Component
+     */
+    protected $root;
+
+    /**
+     * Parses an iCalendar or vCard file
+     *
+     * Pass a stream or a string. If null is parsed, the existing buffer is
+     * used.
+     *
+     * @param string|resource|null $input
+     * @param int|null $options
+     * @return array
+     */
+    public function parse($input = null, $options = null) {
+
+        $this->root = null;
+        if (!is_null($input)) {
+
+            $this->setInput($input);
+
+        }
+
+        if (!is_null($options)) $this->options = $options;
+
+        $this->parseDocument();
+
+        return $this->root;
+
+    }
+
+    /**
+     * Sets the input buffer. Must be a string or stream.
+     *
+     * @param resource|string $input
+     * @return void
+     */
+    public function setInput($input) {
+
+        // Resetting the parser
+        $this->lineIndex = 0;
+        $this->startLine = 0;
+
+        if (is_string($input)) {
+            // Convering to a stream.
+            $stream = fopen('php://temp', 'r+');
+            fwrite($stream, $input);
+            rewind($stream);
+            $this->input = $stream;
+        } elseif (is_resource($input)) {
+            $this->input = $input;
+        } else {
+            throw new \InvalidArgumentException('This parser can only read from strings or streams.');
+        }
+
+    }
+
+    /**
+     * Parses an entire document.
+     *
+     * @return void
+     */
+    protected function parseDocument() {
+
+        $line = $this->readLine();
+
+        // BOM is ZERO WIDTH NO-BREAK SPACE (U+FEFF).
+        // It's 0xEF 0xBB 0xBF in UTF-8 hex.
+        if (   3 <= strlen($line)
+            && ord($line[0]) === 0xef
+            && ord($line[1]) === 0xbb
+            && ord($line[2]) === 0xbf) {
+            $line = substr($line, 3);
+        }
+
+        switch(strtoupper($line)) {
+            case 'BEGIN:VCALENDAR' :
+                $class = isset(VCalendar::$componentMap['VCALENDAR'])
+                    ? VCalendar::$componentMap[$name]
+                    : 'Sabre\\VObject\\Component\\VCalendar';
+                break;
+            case 'BEGIN:VCARD' :
+                $class = isset(VCard::$componentMap['VCARD'])
+                    ? VCard::$componentMap['VCARD']
+                    : 'Sabre\\VObject\\Component\\VCard';
+                break;
+            default :
+                throw new ParseException('This parser only supports VCARD and VCALENDAR files');
+        }
+
+        $this->root = new $class(array(), false);
+
+        while(true) {
+
+            // Reading until we hit END:
+            $line = $this->readLine();
+            if (strtoupper(substr($line,0,4)) === 'END:') {
+                break;
+            }
+            $result = $this->parseLine($line);
+            if ($result) {
+                $this->root->add($result);
+            }
+
+        }
+
+        $name = strtoupper(substr($line, 4));
+        if ($name!==$this->root->name) {
+            throw new ParseException('Invalid MimeDir file. expected: "END:' . $this->root->name . '" got: "END:' . $name . '"');
+        }
+
+    }
+
+    /**
+     * Parses a line, and if it hits a component, it will also attempt to parse
+     * the entire component
+     *
+     * @param string $line Unfolded line
+     * @return Node
+     */
+    protected function parseLine($line) {
+
+        // Start of a new component
+        if (strtoupper(substr($line, 0, 6)) === 'BEGIN:') {
+
+            $component = $this->root->createComponent(substr($line,6), array(), false);
+
+            while(true) {
+
+                // Reading until we hit END:
+                $line = $this->readLine();
+                if (strtoupper(substr($line,0,4)) === 'END:') {
+                    break;
+                }
+                $result = $this->parseLine($line);
+                if ($result) {
+                    $component->add($result);
+                }
+
+            }
+
+            $name = strtoupper(substr($line, 4));
+            if ($name!==$component->name) {
+                throw new ParseException('Invalid MimeDir file. expected: "END:' . $component->name . '" got: "END:' . $name . '"');
+            }
+
+            return $component;
+
+        } else {
+
+            // Property reader
+            $property = $this->readProperty($line);
+            if (!$property) {
+                // Ignored line
+                return false;
+            }
+            return $property;
+
+        }
+
+    }
+
+    /**
+     * We need to look ahead 1 line every time to see if we need to 'unfold'
+     * the next line.
+     *
+     * If that was not the case, we store it here.
+     *
+     * @var null|string
+     */
+    protected $lineBuffer;
+
+    /**
+     * The real current line number.
+     */
+    protected $lineIndex = 0;
+
+    /**
+     * In the case of unfolded lines, this property holds the line number for
+     * the start of the line.
+     *
+     * @var int
+     */
+    protected $startLine = 0;
+
+    /**
+     * Contains a 'raw' representation of the current line.
+     *
+     * @var string
+     */
+    protected $rawLine;
+
+    /**
+     * Reads a single line from the buffer.
+     *
+     * This method strips any newlines and also takes care of unfolding.
+     *
+     * @throws \Sabre\VObject\EofException
+     * @return string
+     */
+    protected function readLine() {
+
+        if (!is_null($this->lineBuffer)) {
+            $rawLine = $this->lineBuffer;
+            $this->lineBuffer = null;
+        } else {
+            do {
+                $eof = feof($this->input);
+
+                $rawLine = fgets($this->input);
+
+                if ($eof || (feof($this->input) && $rawLine===false)) {
+                    throw new EofException('End of document reached prematurely');
+                }
+                if ($rawLine === false) {
+                    throw new ParseException('Error reading from input stream');
+                }
+                $rawLine = rtrim($rawLine, "\r\n");
+            } while ($rawLine === ''); // Skipping empty lines
+            $this->lineIndex++;
+        }
+        $line = $rawLine;
+
+        $this->startLine = $this->lineIndex;
+
+        // Looking ahead for folded lines.
+        while (true) {
+
+            $nextLine = rtrim(fgets($this->input), "\r\n");
+            $this->lineIndex++;
+            if (!$nextLine) {
+                break;
+            }
+            if ($nextLine[0] === "\t" || $nextLine[0] === " ") {
+                $line .= substr($nextLine, 1);
+                $rawLine .= "\n " . substr($nextLine, 1);
+            } else {
+                $this->lineBuffer = $nextLine;
+                break;
+            }
+
+        }
+        $this->rawLine = $rawLine;
+        return $line;
+
+    }
+
+    /**
+     * Reads a property or component from a line.
+     *
+     * @return void
+     */
+    protected function readProperty($line) {
+
+        if ($this->options & self::OPTION_FORGIVING) {
+            $propNameToken = 'A-Z0-9\-\._\\/';
+        } else {
+            $propNameToken = 'A-Z0-9\-\.';
+        }
+
+        $paramNameToken = 'A-Z0-9\-';
+        $safeChar = '^";:,';
+        $qSafeChar = '^"';
+
+        $regex = "/
+            ^(?P<name> [$propNameToken]+ ) (?=[;:])        # property name
+            |
+            (?<=:)(?P<propValue> .+)$                      # property value
+            |
+            ;(?P<paramName> [$paramNameToken]+) (?=[=;:])  # parameter name
+            |
+            (=|,)(?P<paramValue>                           # parameter value
+                (?: [$safeChar]*) |
+                \"(?: [$qSafeChar]+)\"
+            ) (?=[;:,])
+            /xi";
+
+        //echo $regex, "\n"; die();
+        preg_match_all($regex, $line, $matches,  PREG_SET_ORDER);
+
+        $property = array(
+            'name' => null,
+            'parameters' => array(),
+            'value' => null
+        );
+
+        $lastParam = null;
+
+        /**
+         * Looping through all the tokens.
+         *
+         * Note that we are looping through them in reverse order, because if a
+         * sub-pattern matched, the subsequent named patterns will not show up
+         * in the result.
+         */
+        foreach($matches as $match) {
+
+            if (isset($match['paramValue'])) {
+                if ($match['paramValue'] && $match['paramValue'][0] === '"') {
+                    $value = substr($match['paramValue'], 1, -1);
+                } else {
+                    $value = $match['paramValue'];
+                }
+
+                $value = $this->unescapeParam($value);
+
+                if (is_null($property['parameters'][$lastParam])) {
+                    $property['parameters'][$lastParam] = $value;
+                } elseif (is_array($property['parameters'][$lastParam])) {
+                    $property['parameters'][$lastParam][] = $value;
+                } else {
+                    $property['parameters'][$lastParam] = array(
+                        $property['parameters'][$lastParam],
+                        $value
+                    );
+                }
+                continue;
+            }
+            if (isset($match['paramName'])) {
+                $lastParam = strtoupper($match['paramName']);
+                if (!isset($property['parameters'][$lastParam])) {
+                    $property['parameters'][$lastParam] = null;
+                }
+                continue;
+            }
+            if (isset($match['propValue'])) {
+                $property['value'] = $match['propValue'];
+                continue;
+            }
+            if (isset($match['name']) && $match['name']) {
+                $property['name'] = strtoupper($match['name']);
+                continue;
+            }
+
+            // @codeCoverageIgnoreStart
+            throw new \LogicException('This code should not be reachable');
+            // @codeCoverageIgnoreEnd
+
+        }
+
+        if (is_null($property['value'])) {
+            $property['value'] = '';
+        }
+        if (!$property['name']) {
+            if ($this->options & self::OPTION_IGNORE_INVALID_LINES) {
+                return false;
+            }
+            throw new ParseException('Invalid Mimedir file. Line starting at ' . $this->startLine . ' did not follow iCalendar/vCard conventions');
+        }
+
+        // vCard 2.1 states that parameters may appear without a name, and only
+        // a value. We can deduce the value based on it's name.
+        //
+        // Our parser will get those as parameters without a value instead, so
+        // we're filtering these parameters out first.
+        $namedParameters = array();
+        $namelessParameters = array();
+
+        foreach($property['parameters'] as $name=>$value) {
+            if (!is_null($value)) {
+                $namedParameters[$name] = $value;
+            } else {
+                $namelessParameters[] = $name;
+            }
+        }
+
+        $propObj = $this->root->createProperty($property['name'], null, $namedParameters);
+
+        foreach($namelessParameters as $namelessParameter) {
+            $propObj->add(null, $namelessParameter);
+        }
+
+        if (strtoupper($propObj['ENCODING']) === 'QUOTED-PRINTABLE') {
+            $propObj->setQuotedPrintableValue($this->extractQuotedPrintableValue());
+        } else {
+            $propObj->setRawMimeDirValue($property['value']);
+        }
+
+        return $propObj;
+
+    }
+
+    /**
+     * Unescapes a property value.
+     *
+     * vCard 2.1 says:
+     *   * Semi-colons must be escaped in some property values, specifically
+     *     ADR, ORG and N.
+     *   * Semi-colons must be escaped in parameter values, because semi-colons
+     *     are also use to separate values.
+     *   * No mention of escaping backslashes with another backslash.
+     *   * newlines are not escaped either, instead QUOTED-PRINTABLE is used to
+     *     span values over more than 1 line.
+     *
+     * vCard 3.0 says:
+     *   * (rfc2425) Backslashes, newlines (\n or \N) and comma's must be
+     *     escaped, all time time.
+     *   * Comma's are used for delimeters in multiple values
+     *   * (rfc2426) Adds to to this that the semi-colon MUST also be escaped,
+     *     as in some properties semi-colon is used for separators.
+     *   * Properties using semi-colons: N, ADR, GEO, ORG
+     *   * Both ADR and N's individual parts may be broken up further with a
+     *     comma.
+     *   * Properties using commas: NICKNAME, CATEGORIES
+     *
+     * vCard 4.0 (rfc6350) says:
+     *   * Commas must be escaped.
+     *   * Semi-colons may be escaped, an unescaped semi-colon _may_ be a
+     *     delimiter, depending on the property.
+     *   * Backslashes must be escaped
+     *   * Newlines must be escaped as either \N or \n.
+     *   * Some compound properties may contain multiple parts themselves, so a
+     *     comma within a semi-colon delimited property may also be unescaped
+     *     to denote multiple parts _within_ the compound property.
+     *   * Text-properties using semi-colons: N, ADR, ORG, CLIENTPIDMAP.
+     *   * Text-properties using commas: NICKNAME, RELATED, CATEGORIES, PID.
+     *
+     * Even though the spec says that commas must always be escaped, the
+     * example for GEO in Section 6.5.2 seems to violate this.
+     *
+     * iCalendar 2.0 (rfc5545) says:
+     *   * Commas or semi-colons may be used as delimiters, depending on the
+     *     property.
+     *   * Commas, semi-colons, backslashes, newline (\N or \n) are always
+     *     escaped, unless they are delimiters.
+     *   * Colons shall not be escaped.
+     *   * Commas can be considered the 'default delimiter' and is described as
+     *     the delimiter in cases where the order of the multiple values is
+     *     insignificant.
+     *   * Semi-colons are described as the delimiter for 'structured values'.
+     *     They are specifically used in Semi-colons are used as a delimiter in
+     *     REQUEST-STATUS, RRULE, GEO and EXRULE. EXRULE is deprecated however.
+     *
+     * Now for the parameters
+     *
+     * If delimiter is not set (null) this method will just return a string.
+     * If it's a comma or a semi-colon the string will be split on those
+     * characters, and always return an array.
+     *
+     * @param string $input
+     * @param string $delimiter
+     * @return string|string[]
+     */
+    static public function unescapeValue($input, $delimiter = ';') {
+
+        $regex = '#  (?: (\\\\ (?: \\\\ | N | n | ; | , ) )';
+        if ($delimiter) {
+            $regex .= ' | (' . $delimiter . ')';
+        }
+        $regex .= ') #x';
+
+        $matches = preg_split($regex, $input, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
+
+        $resultArray = array();
+        $result = '';
+
+        foreach($matches as $match) {
+
+            switch ($match) {
+                case '\\\\' :
+                    $result .='\\';
+                    break;
+                case '\N' :
+                case '\n' :
+                    $result .="\n";
+                    break;
+                case '\;' :
+                    $result .=';';
+                    break;
+                case '\,' :
+                    $result .=',';
+                    break;
+                case $delimiter :
+                    $resultArray[] = $result;
+                    $result = '';
+                    break;
+                default :
+                    $result .= $match;
+                    break;
+
+            }
+
+        }
+
+        $resultArray[] = $result;
+        return $delimiter ? $resultArray : $result;
+
+    }
+
+    /**
+     * Unescapes a parameter value.
+     *
+     * vCard 2.1:
+     *   * Does not mention a mechanism for this. In addition, double quotes
+     *     are never used to wrap values.
+     *   * This means that parameters can simply not contain colons or
+     *     semi-colons.
+     *
+     * vCard 3.0 (rfc2425, rfc2426):
+     *   * Parameters _may_ be surrounded by double quotes.
+     *   * If this is not the case, semi-colon, colon and comma may simply not
+     *     occur (the comma used for multiple parameter values though).
+     *   * If it is surrounded by double-quotes, it may simply not contain
+     *     double-quotes.
+     *   * This means that a parameter can in no case encode double-quotes, or
+     *     newlines.
+     *
+     * vCard 4.0 (rfc6350)
+     *   * Behavior seems to be identical to vCard 3.0
+     *
+     * iCalendar 2.0 (rfc5545)
+     *   * Behavior seems to be identical to vCard 3.0
+     *
+     * Parameter escaping mechanism (rfc6868) :
+     *   * This rfc describes a new way to escape parameter values.
+     *   * New-line is encoded as ^n
+     *   * ^ is encoded as ^^.
+     *   * " is encoded as ^'
+     *
+     * @param string $input
+     * @return void
+     */
+    private function unescapeParam($input) {
+
+        return
+            preg_replace_callback(
+                '#(\^(\^|n|\'))#',
+                function($matches) {
+                    switch($matches[2]) {
+                        case 'n' :
+                            return "\n";
+                        case '^' :
+                            return '^';
+                        case '\'' :
+                            return '"';
+
+                    // @codeCoverageIgnoreStart
+                    }
+                    // @codeCoverageIgnoreEnd
+                },
+                $input
+            );
+    }
+
+    /**
+     * Gets the full quoted printable value.
+     *
+     * We need a special method for this, because newlines have both a meaning
+     * in vCards, and in QuotedPrintable.
+     *
+     * This method does not do any decoding.
+     *
+     * @return string
+     */
+    private function extractQuotedPrintableValue() {
+
+        // We need to parse the raw line again to get the start of the value.
+        //
+        // We are basically looking for the first colon (:), but we need to
+        // skip over the parameters first, as they may contain one.
+        $regex = '/^
+            (?: [^:])+ # Anything but a colon
+            (?: "[^"]")* # A parameter in double quotes
+            : # start of the value we really care about
+            (.*)$
+        /xs';
+
+        preg_match($regex, $this->rawLine, $matches);
+
+        $value = $matches[1];
+        // Removing the first whitespace character from every line. Kind of
+        // like unfolding, but we keep the newline.
+        $value = str_replace("\n ", "\n", $value);
+
+        // Microsoft products don't always correctly fold lines, they may be
+        // missing a whitespace. So if 'forgiving' is turned on, we will take
+        // those as well.
+        if ($this->options & self::OPTION_FORGIVING) {
+            while(substr($value,-1) === '=') {
+                // Reading the line
+                $this->readLine();
+                // Grabbing the raw form
+                $value.="\n" . $this->rawLine;
+            }
+        }
+
+        return $value;
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/Parser/Parser.php b/vendor/sabre/vobject/lib/Parser/Parser.php
new file mode 100644
index 0000000000000000000000000000000000000000..dcaa38a13da96b28ee787fac8fd0fca376ea479d
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Parser/Parser.php
@@ -0,0 +1,77 @@
+<?php
+
+namespace Sabre\VObject\Parser;
+
+/**
+ * Abstract parser.
+ *
+ * This class serves as a base-class for the different parsers.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+abstract class Parser {
+
+    /**
+     * Turning on this option makes the parser more forgiving.
+     *
+     * In the case of the MimeDir parser, this means that the parser will
+     * accept slashes and underscores in property names, and it will also
+     * attempt to fix Microsoft vCard 2.1's broken line folding.
+     */
+    const OPTION_FORGIVING = 1;
+
+    /**
+     * If this option is turned on, any lines we cannot parse will be ignored
+     * by the reader.
+     */
+    const OPTION_IGNORE_INVALID_LINES = 2;
+
+    /**
+     * Bitmask of parser options
+     *
+     * @var int
+     */
+    protected $options;
+
+    /**
+     * Creates the parser.
+     *
+     * Optionally, it's possible to parse the input stream here.
+     *
+     * @param mixed $input
+     * @param int $options Any parser options (OPTION constants).
+     * @return void
+     */
+    public function __construct($input = null, $options = 0) {
+
+        if (!is_null($input)) {
+            $this->setInput($input);
+        }
+        $this->options = $options;
+    }
+
+    /**
+     * This method starts the parsing process.
+     *
+     * If the input was not supplied during construction, it's possible to pass
+     * it here instead.
+     *
+     * If either input or options are not supplied, the defaults will be used.
+     *
+     * @param mixed $input
+     * @param int|null $options
+     * @return array
+     */
+    abstract public function parse($input = null, $options = null);
+
+    /**
+     * Sets the input data
+     *
+     * @param mixed $input
+     * @return void
+     */
+    abstract public function setInput($input);
+
+}
diff --git a/vendor/sabre/vobject/lib/Property.php b/vendor/sabre/vobject/lib/Property.php
new file mode 100644
index 0000000000000000000000000000000000000000..73686bcac9829d639ba16bf8942d9f9c676db3ff
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Property.php
@@ -0,0 +1,555 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * Property
+ *
+ * A property is always in a KEY:VALUE structure, and may optionally contain
+ * parameters.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+abstract class Property extends Node {
+
+    /**
+     * Property name.
+     *
+     * This will contain a string such as DTSTART, SUMMARY, FN.
+     *
+     * @var string
+     */
+    public $name;
+
+    /**
+     * Property group.
+     *
+     * This is only used in vcards
+     *
+     * @var string
+     */
+    public $group;
+
+    /**
+     * List of parameters
+     *
+     * @var array
+     */
+    public $parameters = array();
+
+    /**
+     * Current value
+     *
+     * @var mixed
+     */
+    protected $value;
+
+    /**
+     * In case this is a multi-value property. This string will be used as a
+     * delimiter.
+     *
+     * @var string|null
+     */
+    public $delimiter = ';';
+
+    /**
+     * Creates the generic property.
+     *
+     * Parameters must be specified in key=>value syntax.
+     *
+     * @param Component $root The root document
+     * @param string $name
+     * @param string|array|null $value
+     * @param array $parameters List of parameters
+     * @param string $group The vcard property group
+     * @return void
+     */
+    function __construct(Component $root, $name, $value = null, array $parameters = array(), $group = null) {
+
+        $this->name = $name;
+        $this->group = $group;
+
+        $this->root = $root;
+
+        foreach($parameters as $k=>$v) {
+            $this->add($k, $v);
+        }
+
+        if (!is_null($value)) {
+            $this->setValue($value);
+        }
+
+    }
+
+    /**
+     * Updates the current value.
+     *
+     * This may be either a single, or multiple strings in an array.
+     *
+     * @param string|array $value
+     * @return void
+     */
+    function setValue($value) {
+
+        $this->value = $value;
+
+    }
+
+    /**
+     * Returns the current value.
+     *
+     * This method will always return a singular value. If this was a
+     * multi-value object, some decision will be made first on how to represent
+     * it as a string.
+     *
+     * To get the correct multi-value version, use getParts.
+     *
+     * @return string
+     */
+    function getValue() {
+
+        if (is_array($this->value)) {
+            if (count($this->value)==0) {
+                return null;
+            } elseif (count($this->value)===1) {
+                return $this->value[0];
+            } else {
+                return $this->getRawMimeDirValue($this->value);
+            }
+        } else {
+            return $this->value;
+        }
+
+    }
+
+    /**
+     * Sets a multi-valued property.
+     *
+     * @param array $parts
+     * @return void
+     */
+    function setParts(array $parts) {
+
+        $this->value = $parts;
+
+    }
+
+    /**
+     * Returns a multi-valued property.
+     *
+     * This method always returns an array, if there was only a single value,
+     * it will still be wrapped in an array.
+     *
+     * @return array
+     */
+    function getParts() {
+
+        if (is_null($this->value)) {
+            return array();
+        } elseif (is_array($this->value)) {
+            return $this->value;
+        } else {
+            return array($this->value);
+        }
+
+    }
+
+    /**
+     * Adds a new parameter, and returns the new item.
+     *
+     * If a parameter with same name already existed, the values will be
+     * combined.
+     * If nameless parameter is added, we try to guess it's name.
+     *
+     * @param string $name
+     * @param string|null|array $value
+     * @return Node
+     */
+    function add($name, $value = null) {
+        $noName = false;
+        if ($name === null) {
+            $name = Parameter::guessParameterNameByValue($value);
+            $noName = true;
+        }
+
+        if (isset($this->parameters[strtoupper($name)])) {
+            $this->parameters[strtoupper($name)]->addValue($value);
+        }
+        else {
+            $param = new Parameter($this->root, $name, $value);
+            $param->noName = $noName;
+            $this->parameters[$param->name] = $param;
+        }
+    }
+
+    /**
+     * Returns an iterable list of children
+     *
+     * @return array
+     */
+    function parameters() {
+
+        return $this->parameters;
+
+    }
+
+    /**
+     * Returns the type of value.
+     *
+     * This corresponds to the VALUE= parameter. Every property also has a
+     * 'default' valueType.
+     *
+     * @return string
+     */
+    abstract function getValueType();
+
+    /**
+     * Sets a raw value coming from a mimedir (iCalendar/vCard) file.
+     *
+     * This has been 'unfolded', so only 1 line will be passed. Unescaping is
+     * not yet done, but parameters are not included.
+     *
+     * @param string $val
+     * @return void
+     */
+    abstract function setRawMimeDirValue($val);
+
+    /**
+     * Returns a raw mime-dir representation of the value.
+     *
+     * @return string
+     */
+    abstract function getRawMimeDirValue();
+
+    /**
+     * Turns the object back into a serialized blob.
+     *
+     * @return string
+     */
+    function serialize() {
+
+        $str = $this->name;
+        if ($this->group) $str = $this->group . '.' . $this->name;
+
+        foreach($this->parameters as $param) {
+
+            $str.=';' . $param->serialize();
+
+        }
+
+        $str.=':' . $this->getRawMimeDirValue();
+
+        $out = '';
+        while(strlen($str)>0) {
+            if (strlen($str)>75) {
+                $out.= mb_strcut($str,0,75,'utf-8') . "\r\n";
+                $str = ' ' . mb_strcut($str,75,strlen($str),'utf-8');
+            } else {
+                $out.=$str . "\r\n";
+                $str='';
+                break;
+            }
+        }
+
+        return $out;
+
+    }
+
+    /**
+     * Returns the value, in the format it should be encoded for json.
+     *
+     * This method must always return an array.
+     *
+     * @return array
+     */
+    function getJsonValue() {
+
+        return $this->getParts();
+
+    }
+
+    /**
+     * Sets the json value, as it would appear in a jCard or jCal object.
+     *
+     * The value must always be an array.
+     *
+     * @param array $value
+     * @return void
+     */
+    function setJsonValue(array $value) {
+
+        if (count($value)===1) {
+            $this->setValue(reset($value));
+        } else {
+            $this->setValue($value);
+        }
+
+    }
+
+    /**
+     * This method returns an array, with the representation as it should be
+     * encoded in json. This is used to create jCard or jCal documents.
+     *
+     * @return array
+     */
+    function jsonSerialize() {
+
+        $parameters = array();
+
+        foreach($this->parameters as $parameter) {
+            if ($parameter->name === 'VALUE') {
+                continue;
+            }
+            $parameters[strtolower($parameter->name)] = $parameter->jsonSerialize();
+        }
+        // In jCard, we need to encode the property-group as a separate 'group'
+        // parameter.
+        if ($this->group) {
+            $parameters['group'] = $this->group;
+        }
+
+        return array_merge(
+            array(
+                strtolower($this->name),
+                (object)$parameters,
+                strtolower($this->getValueType()),
+            ),
+            $this->getJsonValue()
+        );
+    }
+
+
+    /**
+     * Called when this object is being cast to a string.
+     *
+     * If the property only had a single value, you will get just that. In the
+     * case the property had multiple values, the contents will be escaped and
+     * combined with ,.
+     *
+     * @return string
+     */
+    function __toString() {
+
+        return (string)$this->getValue();
+
+    }
+
+    /* ArrayAccess interface {{{ */
+
+    /**
+     * Checks if an array element exists
+     *
+     * @param mixed $name
+     * @return bool
+     */
+    function offsetExists($name) {
+
+        if (is_int($name)) return parent::offsetExists($name);
+
+        $name = strtoupper($name);
+
+        foreach($this->parameters as $parameter) {
+            if ($parameter->name == $name) return true;
+        }
+        return false;
+
+    }
+
+    /**
+     * Returns a parameter.
+     *
+     * If the parameter does not exist, null is returned.
+     *
+     * @param string $name
+     * @return Node
+     */
+    function offsetGet($name) {
+
+        if (is_int($name)) return parent::offsetGet($name);
+        $name = strtoupper($name);
+
+        if (!isset($this->parameters[$name])) {
+            return null;
+        }
+
+        return $this->parameters[$name];
+
+    }
+
+    /**
+     * Creates a new parameter
+     *
+     * @param string $name
+     * @param mixed $value
+     * @return void
+     */
+    function offsetSet($name, $value) {
+
+        if (is_int($name)) {
+            parent::offsetSet($name, $value);
+            // @codeCoverageIgnoreStart
+            // This will never be reached, because an exception is always
+            // thrown.
+            return;
+            // @codeCoverageIgnoreEnd
+        }
+
+        $param = new Parameter($this->root, $name, $value);
+        $this->parameters[$param->name] = $param;
+
+    }
+
+    /**
+     * Removes one or more parameters with the specified name
+     *
+     * @param string $name
+     * @return void
+     */
+    function offsetUnset($name) {
+
+        if (is_int($name)) {
+            parent::offsetUnset($name);
+            // @codeCoverageIgnoreStart
+            // This will never be reached, because an exception is always
+            // thrown.
+            return;
+            // @codeCoverageIgnoreEnd
+        }
+
+        unset($this->parameters[strtoupper($name)]);
+
+    }
+    /* }}} */
+
+    /**
+     * This method is automatically called when the object is cloned.
+     * Specifically, this will ensure all child elements are also cloned.
+     *
+     * @return void
+     */
+    function __clone() {
+
+        foreach($this->parameters as $key=>$child) {
+            $this->parameters[$key] = clone $child;
+            $this->parameters[$key]->parent = $this;
+        }
+
+    }
+
+    /**
+     * Validates the node for correctness.
+     *
+     * The following options are supported:
+     *   - Node::REPAIR - If something is broken, and automatic repair may
+     *                    be attempted.
+     *
+     * An array is returned with warnings.
+     *
+     * Every item in the array has the following properties:
+     *    * level - (number between 1 and 3 with severity information)
+     *    * message - (human readable message)
+     *    * node - (reference to the offending node)
+     *
+     * @param int $options
+     * @return array
+     */
+    function validate($options = 0) {
+
+        $warnings = array();
+
+        // Checking if our value is UTF-8
+        if (!StringUtil::isUTF8($this->getRawMimeDirValue())) {
+
+            $oldValue = $this->getRawMimeDirValue();
+            $level = 3;
+            if ($options & self::REPAIR) {
+                $newValue = StringUtil::convertToUTF8($oldValue);
+                if (true || StringUtil::isUTF8($newValue)) {
+                    $this->setRawMimeDirValue($newValue);
+                    $level = 1;
+                }
+
+            }
+
+
+            if (preg_match('%([\x00-\x08\x0B-\x0C\x0E-\x1F\x7F])%', $oldValue, $matches)) {
+                $message = 'Property contained a control character (0x' . bin2hex($matches[1]) . ')';
+            } else {
+                $message = 'Property is not valid UTF-8! ' . $oldValue;
+            }
+
+            $warnings[] = array(
+                'level' => $level,
+                'message' => $message,
+                'node' => $this,
+            );
+        }
+
+        // Checking if the propertyname does not contain any invalid bytes.
+        if (!preg_match('/^([A-Z0-9-]+)$/', $this->name)) {
+            $warnings[] = array(
+                'level' => 1,
+                'message' => 'The propertyname: ' . $this->name . ' contains invalid characters. Only A-Z, 0-9 and - are allowed',
+                'node' => $this,
+            );
+            if ($options & self::REPAIR) {
+                // Uppercasing and converting underscores to dashes.
+                $this->name = strtoupper(
+                    str_replace('_', '-', $this->name)
+                );
+                // Removing every other invalid character
+                $this->name = preg_replace('/([^A-Z0-9-])/u', '', $this->name);
+
+            }
+
+        }
+
+        if ($encoding = $this->offsetGet('ENCODING')) {
+
+            if ($this->root->getDocumentType()===Document::VCARD40) {
+                $warnings[] = array(
+                    'level' => 1,
+                    'message' => 'ENCODING parameter is not valid in vCard 4.',
+                    'node' => $this
+                );
+            } else {
+
+                $encoding = (string)$encoding;
+
+                $allowedEncoding = array();
+
+                switch($this->root->getDocumentType()) {
+                    case Document::ICALENDAR20 :
+                        $allowedEncoding = array('8BIT', 'BASE64');
+                        break;
+                    case Document::VCARD21 :
+                        $allowedEncoding = array('QUOTED-PRINTABLE', 'BASE64', '8BIT');
+                        break;
+                    case Document::VCARD30 :
+                        $allowedEncoding = array('B');
+                        break;
+
+                }
+                if ($allowedEncoding && !in_array(strtoupper($encoding), $allowedEncoding)) {
+                    $warnings[] = array(
+                        'level' => 1,
+                        'message' => 'ENCODING=' . strtoupper($encoding) . ' is not valid for this document type.',
+                        'node' => $this
+                    );
+                }
+            }
+
+        }
+
+        // Validating inner parameters
+        foreach($this->parameters as $param) {
+            $warnings = array_merge($warnings, $param->validate($options));
+        }
+
+        return $warnings;
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/Property/Binary.php b/vendor/sabre/vobject/lib/Property/Binary.php
new file mode 100644
index 0000000000000000000000000000000000000000..c55467e72477c18d3315c5094d08b33acd014036
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Property/Binary.php
@@ -0,0 +1,127 @@
+<?php
+
+namespace Sabre\VObject\Property;
+
+use
+    LogicException,
+    Sabre\VObject\Property;
+
+/**
+ * BINARY property
+ *
+ * This object represents BINARY values.
+ *
+ * Binary values are most commonly used by the iCalendar ATTACH property, and
+ * the vCard PHOTO property.
+ *
+ * This property will transparently encode and decode to base64.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class Binary extends Property {
+
+    /**
+     * In case this is a multi-value property. This string will be used as a
+     * delimiter.
+     *
+     * @var string|null
+     */
+    public $delimiter = null;
+
+    /**
+     * Updates the current value.
+     *
+     * This may be either a single, or multiple strings in an array.
+     *
+     * @param string|array $value
+     * @return void
+     */
+    public function setValue($value) {
+
+        if(is_array($value)) {
+
+            if(count($value) === 1) {
+                $this->value = $value[0];
+            } else {
+                throw new \InvalidArgumentException('The argument must either be a string or an array with only one child');
+            }
+
+        } else {
+
+            $this->value = $value;
+
+        }
+
+    }
+
+    /**
+     * Sets a raw value coming from a mimedir (iCalendar/vCard) file.
+     *
+     * This has been 'unfolded', so only 1 line will be passed. Unescaping is
+     * not yet done, but parameters are not included.
+     *
+     * @param string $val
+     * @return void
+     */
+    public function setRawMimeDirValue($val) {
+
+        $this->value = base64_decode($val);
+
+    }
+
+    /**
+     * Returns a raw mime-dir representation of the value.
+     *
+     * @return string
+     */
+    public function getRawMimeDirValue() {
+
+        return base64_encode($this->value);
+
+    }
+
+    /**
+     * Returns the type of value.
+     *
+     * This corresponds to the VALUE= parameter. Every property also has a
+     * 'default' valueType.
+     *
+     * @return string
+     */
+    public function getValueType() {
+
+        return 'BINARY';
+
+    }
+
+    /**
+     * Returns the value, in the format it should be encoded for json.
+     *
+     * This method must always return an array.
+     *
+     * @return array
+     */
+    public function getJsonValue() {
+
+        return array(base64_encode($this->getValue()));
+
+    }
+
+    /**
+     * Sets the json value, as it would appear in a jCard or jCal object.
+     *
+     * The value must always be an array.
+     *
+     * @param array $value
+     * @return void
+     */
+    public function setJsonValue(array $value) {
+
+        $value = array_map('base64_decode', $value);
+        parent::setJsonValue($value);
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/Property/Boolean.php b/vendor/sabre/vobject/lib/Property/Boolean.php
new file mode 100644
index 0000000000000000000000000000000000000000..255dc3c18440262cce65ae7bd5c5c2fe273c36a3
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Property/Boolean.php
@@ -0,0 +1,63 @@
+<?php
+
+namespace Sabre\VObject\Property;
+
+use
+    Sabre\VObject\Property;
+
+/**
+ * Boolean property
+ *
+ * This object represents BOOLEAN values. These are always the case-insenstive
+ * string TRUE or FALSE.
+ *
+ * Automatic conversion to PHP's true and false are done.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class Boolean extends Property {
+
+    /**
+     * Sets a raw value coming from a mimedir (iCalendar/vCard) file.
+     *
+     * This has been 'unfolded', so only 1 line will be passed. Unescaping is
+     * not yet done, but parameters are not included.
+     *
+     * @param string $val
+     * @return void
+     */
+    public function setRawMimeDirValue($val) {
+
+        $val = strtoupper($val)==='TRUE'?true:false;
+        $this->setValue($val);
+
+    }
+
+    /**
+     * Returns a raw mime-dir representation of the value.
+     *
+     * @return string
+     */
+    public function getRawMimeDirValue() {
+
+        return $this->value?'TRUE':'FALSE';
+
+    }
+
+    /**
+     * Returns the type of value.
+     *
+     * This corresponds to the VALUE= parameter. Every property also has a
+     * 'default' valueType.
+     *
+     * @return string
+     */
+    public function getValueType() {
+
+        return 'BOOLEAN';
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/Property/FlatText.php b/vendor/sabre/vobject/lib/Property/FlatText.php
new file mode 100644
index 0000000000000000000000000000000000000000..5800d29f6fc62eb18959c8d448283ccc748065a2
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Property/FlatText.php
@@ -0,0 +1,49 @@
+<?php
+
+namespace Sabre\VObject\Property;
+
+/**
+ * FlatText property
+ *
+ * This object represents certain TEXT values.
+ *
+ * Specifically, this property is used for text values where there is only 1
+ * part. Semi-colons and colons will be de-escaped when deserializing, but if
+ * any semi-colons or commas appear without a backslash, we will not assume
+ * that they are delimiters.
+ *
+ * vCard 2.1 specifically has a whole bunch of properties where this may
+ * happen, as it only defines a delimiter for a few properties.
+ *
+ * vCard 4.0 states something similar. An unescaped semi-colon _may_ be a
+ * delimiter, depending on the property.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class FlatText extends Text {
+
+    /**
+     * Field separator
+     *
+     * @var string
+     */
+    public $delimiter = ',';
+
+    /**
+     * Sets the value as a quoted-printable encoded string.
+     *
+     * Overriding this so we're not splitting on a ; delimiter.
+     *
+     * @param string $val
+     * @return void
+     */
+    public function setQuotedPrintableValue($val) {
+
+        $val = quoted_printable_decode($val);
+        $this->setValue($val);
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/Property/FloatValue.php b/vendor/sabre/vobject/lib/Property/FloatValue.php
new file mode 100644
index 0000000000000000000000000000000000000000..531bcfd04b1f00556d09f3f54e365ff2a3e7ac8d
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Property/FloatValue.php
@@ -0,0 +1,104 @@
+<?php
+
+namespace Sabre\VObject\Property;
+
+use
+    Sabre\VObject\Property;
+
+/**
+ * Float property
+ *
+ * This object represents FLOAT values. These can be 1 or more floating-point
+ * numbers.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class FloatValue extends Property {
+
+    /**
+     * In case this is a multi-value property. This string will be used as a
+     * delimiter.
+     *
+     * @var string|null
+     */
+    public $delimiter = ';';
+
+    /**
+     * Sets a raw value coming from a mimedir (iCalendar/vCard) file.
+     *
+     * This has been 'unfolded', so only 1 line will be passed. Unescaping is
+     * not yet done, but parameters are not included.
+     *
+     * @param string $val
+     * @return void
+     */
+    public function setRawMimeDirValue($val) {
+
+        $val = explode($this->delimiter, $val);
+        foreach($val as &$item) {
+            $item = (float)$item;
+        }
+        $this->setParts($val);
+
+    }
+
+    /**
+     * Returns a raw mime-dir representation of the value.
+     *
+     * @return string
+     */
+    public function getRawMimeDirValue() {
+
+        return implode(
+            $this->delimiter,
+            $this->getParts()
+        );
+
+    }
+
+    /**
+     * Returns the type of value.
+     *
+     * This corresponds to the VALUE= parameter. Every property also has a
+     * 'default' valueType.
+     *
+     * @return string
+     */
+    public function getValueType() {
+
+        return "FLOAT";
+
+    }
+
+    /**
+     * Returns the value, in the format it should be encoded for json.
+     *
+     * This method must always return an array.
+     *
+     * @return array
+     */
+    public function getJsonValue() {
+
+        $val = array_map(
+            function($item) {
+
+                return (float)$item;
+
+            },
+            $this->getParts()
+        );
+
+        // Special-casing the GEO property.
+        //
+        // See:
+        // http://tools.ietf.org/html/draft-ietf-jcardcal-jcal-04#section-3.4.1.2
+        if ($this->name==='GEO') {
+            return array($val);
+        } else {
+            return $val;
+        }
+
+    }
+}
diff --git a/vendor/sabre/vobject/lib/Property/ICalendar/CalAddress.php b/vendor/sabre/vobject/lib/Property/ICalendar/CalAddress.php
new file mode 100644
index 0000000000000000000000000000000000000000..03a34c8febf81ccff93327c471f88711aa443dc2
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Property/ICalendar/CalAddress.php
@@ -0,0 +1,61 @@
+<?php
+
+namespace Sabre\VObject\Property\ICalendar;
+
+use
+    Sabre\VObject\Property\Text;
+
+/**
+ * CalAddress property
+ *
+ * This object encodes CAL-ADDRESS values, as defined in rfc5545
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class CalAddress extends Text {
+
+    /**
+     * In case this is a multi-value property. This string will be used as a
+     * delimiter.
+     *
+     * @var string|null
+     */
+    public $delimiter = null;
+
+    /**
+     * Returns the type of value.
+     *
+     * This corresponds to the VALUE= parameter. Every property also has a
+     * 'default' valueType.
+     *
+     * @return string
+     */
+    public function getValueType() {
+
+        return 'CAL-ADDRESS';
+
+    }
+
+    /**
+     * This returns a normalized form of the value.
+     *
+     * This is primarily used right now to turn mixed-cased schemes in user
+     * uris to lower-case.
+     *
+     * Evolution in particular tends to encode mailto: as MAILTO:.
+     *
+     * @return string
+     */
+    public function getNormalizedValue() {
+
+        $input = $this->getValue();
+        if (!strpos($input, ':')) {
+            return $input;
+        }
+        list($schema, $everythingElse) = explode(':', $input, 2);
+        return strtolower($schema) . ':' . $everythingElse;
+
+    }
+}
diff --git a/vendor/sabre/vobject/lib/Property/ICalendar/Date.php b/vendor/sabre/vobject/lib/Property/ICalendar/Date.php
new file mode 100644
index 0000000000000000000000000000000000000000..95fdd1711b49dd1f2f13d500dba6f94fc245db46
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Property/ICalendar/Date.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace Sabre\VObject\Property\ICalendar;
+
+/**
+ * DateTime property
+ *
+ * This object represents DATE values, as defined here:
+ *
+ * http://tools.ietf.org/html/rfc5545#section-3.3.5
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class Date extends DateTime {
+
+}
diff --git a/vendor/sabre/vobject/lib/Property/ICalendar/DateTime.php b/vendor/sabre/vobject/lib/Property/ICalendar/DateTime.php
new file mode 100644
index 0000000000000000000000000000000000000000..2bd845f59a55befec2498cb69170fb4e0743e3d9
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Property/ICalendar/DateTime.php
@@ -0,0 +1,390 @@
+<?php
+
+namespace Sabre\VObject\Property\ICalendar;
+
+use DateTimeZone;
+use Sabre\VObject\Property;
+use Sabre\VObject\DateTimeParser;
+use Sabre\VObject\TimeZoneUtil;
+
+/**
+ * DateTime property
+ *
+ * This object represents DATE-TIME values, as defined here:
+ *
+ * http://tools.ietf.org/html/rfc5545#section-3.3.4
+ *
+ * This particular object has a bit of hackish magic that it may also in some
+ * cases represent a DATE value. This is because it's a common usecase to be
+ * able to change a DATE-TIME into a DATE.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class DateTime extends Property {
+
+    /**
+     * In case this is a multi-value property. This string will be used as a
+     * delimiter.
+     *
+     * @var string|null
+     */
+    public $delimiter = ',';
+
+    /**
+     * Sets a multi-valued property.
+     *
+     * You may also specify DateTime objects here.
+     *
+     * @param array $parts
+     * @return void
+     */
+    public function setParts(array $parts) {
+
+        if (isset($parts[0]) && $parts[0] instanceof \DateTime) {
+            $this->setDateTimes($parts);
+        } else {
+            parent::setParts($parts);
+        }
+
+    }
+
+    /**
+     * Updates the current value.
+     *
+     * This may be either a single, or multiple strings in an array.
+     *
+     * Instead of strings, you may also use DateTime here.
+     *
+     * @param string|array|\DateTime $value
+     * @return void
+     */
+    public function setValue($value) {
+
+        if (is_array($value) && isset($value[0]) && $value[0] instanceof \DateTime) {
+            $this->setDateTimes($value);
+        } elseif ($value instanceof \DateTime) {
+            $this->setDateTimes(array($value));
+        } else {
+            parent::setValue($value);
+        }
+
+    }
+
+    /**
+     * Sets a raw value coming from a mimedir (iCalendar/vCard) file.
+     *
+     * This has been 'unfolded', so only 1 line will be passed. Unescaping is
+     * not yet done, but parameters are not included.
+     *
+     * @param string $val
+     * @return void
+     */
+    public function setRawMimeDirValue($val) {
+
+        $this->setValue(explode($this->delimiter, $val));
+
+    }
+
+    /**
+     * Returns a raw mime-dir representation of the value.
+     *
+     * @return string
+     */
+    public function getRawMimeDirValue() {
+
+        return implode($this->delimiter, $this->getParts());
+
+    }
+
+    /**
+     * Returns true if this is a DATE-TIME value, false if it's a DATE.
+     *
+     * @return bool
+     */
+    public function hasTime() {
+
+        return strtoupper((string)$this['VALUE']) !== 'DATE';
+
+    }
+
+    /**
+     * Returns true if this is a floating DATE or DATE-TIME.
+     *
+     * Note that DATE is always floating.
+     */
+    public function isFloating() {
+
+        return
+            !$this->hasTime() ||
+            (
+                !isset($this['TZID']) &&
+                strpos($this->getValue(),'Z')===false
+            );
+
+    }
+
+    /**
+     * Returns a date-time value.
+     *
+     * Note that if this property contained more than 1 date-time, only the
+     * first will be returned. To get an array with multiple values, call
+     * getDateTimes.
+     *
+     * If no timezone information is known, because it's either an all-day
+     * property or floating time, we will use the DateTimeZone argument to
+     * figure out the exact date.
+     *
+     * @param DateTimeZone $timeZone
+     * @return \DateTime
+     */
+    public function getDateTime(DateTimeZone $timeZone = null) {
+
+        $dt = $this->getDateTimes($timeZone);
+        if (!$dt) return null;
+
+        return $dt[0];
+
+    }
+
+    /**
+     * Returns multiple date-time values.
+     *
+     * If no timezone information is known, because it's either an all-day
+     * property or floating time, we will use the DateTimeZone argument to
+     * figure out the exact date.
+     *
+     * @param DateTimeZone $timeZone
+     * @return \DateTime[]
+     */
+    public function getDateTimes(DateTimeZone $timeZone = null) {
+
+        // Does the property have a TZID?
+        $tzid = $this['TZID'];
+
+        if ($tzid) {
+            $timeZone = TimeZoneUtil::getTimeZone((string)$tzid, $this->root);
+        }
+
+        $dts = array();
+        foreach($this->getParts() as $part) {
+            $dts[] = DateTimeParser::parse($part, $timeZone);
+        }
+        return $dts;
+
+    }
+
+    /**
+     * Sets the property as a DateTime object.
+     *
+     * @param \DateTime $dt
+     * @param bool isFloating If set to true, timezones will be ignored.
+     * @return void
+     */
+    public function setDateTime(\DateTime $dt, $isFloating = false) {
+
+        $this->setDateTimes(array($dt), $isFloating);
+
+    }
+
+    /**
+     * Sets the property as multiple date-time objects.
+     *
+     * The first value will be used as a reference for the timezones, and all
+     * the otehr values will be adjusted for that timezone
+     *
+     * @param \DateTime[] $dt
+     * @param bool isFloating If set to true, timezones will be ignored.
+     * @return void
+     */
+    public function setDateTimes(array $dt, $isFloating = false) {
+
+        $values = array();
+
+        if($this->hasTime()) {
+
+            $tz = null;
+            $isUtc = false;
+
+            foreach($dt as $d) {
+
+                if ($isFloating) {
+                    $values[] = $d->format('Ymd\\THis');
+                    continue;
+                }
+                if (is_null($tz)) {
+                    $tz = $d->getTimeZone();
+                    $isUtc = in_array($tz->getName() , array('UTC', 'GMT', 'Z'));
+                    if (!$isUtc) {
+                        $this->offsetSet('TZID', $tz->getName());
+                    }
+                } else {
+                    $d->setTimeZone($tz);
+                }
+
+                if ($isUtc) {
+                    $values[] = $d->format('Ymd\\THis\\Z');
+                } else {
+                    $values[] = $d->format('Ymd\\THis');
+                }
+
+            }
+            if ($isUtc || $isFloating) {
+                $this->offsetUnset('TZID');
+            }
+
+        } else {
+
+            foreach($dt as $d) {
+
+                $values[] = $d->format('Ymd');
+
+            }
+            $this->offsetUnset('TZID');
+
+        }
+
+        $this->value = $values;
+
+    }
+
+    /**
+     * Returns the type of value.
+     *
+     * This corresponds to the VALUE= parameter. Every property also has a
+     * 'default' valueType.
+     *
+     * @return string
+     */
+    public function getValueType() {
+
+        return $this->hasTime()?'DATE-TIME':'DATE';
+
+    }
+
+    /**
+     * Returns the value, in the format it should be encoded for json.
+     *
+     * This method must always return an array.
+     *
+     * @return array
+     */
+    public function getJsonValue() {
+
+        $dts = $this->getDateTimes();
+        $hasTime = $this->hasTime();
+        $isFloating = $this->isFloating();
+
+        $tz = $dts[0]->getTimeZone();
+        $isUtc = $isFloating ? false : in_array($tz->getName() , array('UTC', 'GMT', 'Z'));
+
+        return array_map(
+            function($dt) use ($hasTime, $isUtc) {
+
+                if ($hasTime) {
+                    return $dt->format('Y-m-d\\TH:i:s') . ($isUtc?'Z':'');
+                } else {
+                    return $dt->format('Y-m-d');
+                }
+
+            },
+            $dts
+        );
+
+    }
+
+    /**
+     * Sets the json value, as it would appear in a jCard or jCal object.
+     *
+     * The value must always be an array.
+     *
+     * @param array $value
+     * @return void
+     */
+    public function setJsonValue(array $value) {
+
+        // dates and times in jCal have one difference to dates and times in
+        // iCalendar. In jCal date-parts are separated by dashes, and
+        // time-parts are separated by colons. It makes sense to just remove
+        // those.
+        $this->setValue(
+            array_map(
+                function($item) {
+
+                    return strtr($item, array(':'=>'', '-'=>''));
+
+                },
+                $value
+            )
+        );
+
+    }
+    /**
+     * We need to intercept offsetSet, because it may be used to alter the
+     * VALUE from DATE-TIME to DATE or vice-versa.
+     *
+     * @param string $name
+     * @param mixed $value
+     * @return void
+     */
+    public function offsetSet($name, $value) {
+
+        parent::offsetSet($name, $value);
+        if (strtoupper($name)!=='VALUE') {
+            return;
+        }
+
+        // This will ensure that dates are correctly encoded.
+        $this->setDateTimes($this->getDateTimes());
+
+    }
+
+    /**
+     * Validates the node for correctness.
+     *
+     * The following options are supported:
+     *   Node::REPAIR - May attempt to automatically repair the problem.
+     *
+     * This method returns an array with detected problems.
+     * Every element has the following properties:
+     *
+     *  * level - problem level.
+     *  * message - A human-readable string describing the issue.
+     *  * node - A reference to the problematic node.
+     *
+     * The level means:
+     *   1 - The issue was repaired (only happens if REPAIR was turned on)
+     *   2 - An inconsequential issue
+     *   3 - A severe issue.
+     *
+     * @param int $options
+     * @return array
+     */
+    public function validate($options = 0) {
+
+        $messages = parent::validate($options);
+        $valueType = $this->getValueType();
+        $values = $this->getParts();
+        try {
+            foreach($values as $value) {
+                switch($valueType) {
+                    case 'DATE' :
+                        $foo = DateTimeParser::parseDate($value);
+                        break;
+                    case 'DATE-TIME' :
+                        $foo = DateTimeParser::parseDateTime($value);
+                        break;
+                }
+            }
+        } catch (\LogicException $e) {
+            $messages[] = array(
+                'level' => 3,
+                'message' => 'The supplied value (' . $value . ') is not a correct ' . $valueType,
+                'node' => $this,
+            );
+        }
+        return $messages;
+
+    }
+}
diff --git a/vendor/sabre/vobject/lib/Property/ICalendar/Duration.php b/vendor/sabre/vobject/lib/Property/ICalendar/Duration.php
new file mode 100644
index 0000000000000000000000000000000000000000..15679589e8a0d7d37ce05168c75a2e1f7e581f01
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Property/ICalendar/Duration.php
@@ -0,0 +1,86 @@
+<?php
+
+namespace Sabre\VObject\Property\ICalendar;
+
+use
+    Sabre\VObject\Property,
+    Sabre\VObject\Parser\MimeDir,
+    Sabre\VObject\DateTimeParser;
+
+/**
+ * Duration property
+ *
+ * This object represents DURATION values, as defined here:
+ *
+ * http://tools.ietf.org/html/rfc5545#section-3.3.6
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class Duration extends Property {
+
+    /**
+     * In case this is a multi-value property. This string will be used as a
+     * delimiter.
+     *
+     * @var string|null
+     */
+    public $delimiter = ',';
+
+    /**
+     * Sets a raw value coming from a mimedir (iCalendar/vCard) file.
+     *
+     * This has been 'unfolded', so only 1 line will be passed. Unescaping is
+     * not yet done, but parameters are not included.
+     *
+     * @param string $val
+     * @return void
+     */
+    public function setRawMimeDirValue($val) {
+
+        $this->setValue(explode($this->delimiter, $val));
+
+    }
+
+    /**
+     * Returns a raw mime-dir representation of the value.
+     *
+     * @return string
+     */
+    public function getRawMimeDirValue() {
+
+        return implode($this->delimiter, $this->getParts());
+
+    }
+
+    /**
+     * Returns the type of value.
+     *
+     * This corresponds to the VALUE= parameter. Every property also has a
+     * 'default' valueType.
+     *
+     * @return string
+     */
+    public function getValueType() {
+
+        return 'DURATION';
+
+    }
+
+    /**
+     * Returns a DateInterval representation of the Duration property.
+     *
+     * If the property has more than one value, only the first is returned.
+     *
+     * @return \DateInterval
+     */
+    public function getDateInterval() {
+
+        $parts = $this->getParts();
+        $value = $parts[0];
+        return DateTimeParser::parseDuration($value);
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/Property/ICalendar/Period.php b/vendor/sabre/vobject/lib/Property/ICalendar/Period.php
new file mode 100644
index 0000000000000000000000000000000000000000..d9f629365d51c2bc72fd7ec6f6ba7e2f771b9339
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Property/ICalendar/Period.php
@@ -0,0 +1,129 @@
+<?php
+
+namespace Sabre\VObject\Property\ICalendar;
+
+use
+    Sabre\VObject\Property,
+    Sabre\VObject\Parser\MimeDir,
+    Sabre\VObject\DateTimeParser;
+
+/**
+ * Period property
+ *
+ * This object represents PERIOD values, as defined here:
+ *
+ * http://tools.ietf.org/html/rfc5545#section-3.8.2.6
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class Period extends Property {
+
+    /**
+     * In case this is a multi-value property. This string will be used as a
+     * delimiter.
+     *
+     * @var string|null
+     */
+    public $delimiter = ',';
+
+    /**
+     * Sets a raw value coming from a mimedir (iCalendar/vCard) file.
+     *
+     * This has been 'unfolded', so only 1 line will be passed. Unescaping is
+     * not yet done, but parameters are not included.
+     *
+     * @param string $val
+     * @return void
+     */
+    public function setRawMimeDirValue($val) {
+
+        $this->setValue(explode($this->delimiter, $val));
+
+    }
+
+    /**
+     * Returns a raw mime-dir representation of the value.
+     *
+     * @return string
+     */
+    public function getRawMimeDirValue() {
+
+        return implode($this->delimiter, $this->getParts());
+
+    }
+
+    /**
+     * Returns the type of value.
+     *
+     * This corresponds to the VALUE= parameter. Every property also has a
+     * 'default' valueType.
+     *
+     * @return string
+     */
+    public function getValueType() {
+
+        return "PERIOD";
+
+    }
+
+    /**
+     * Sets the json value, as it would appear in a jCard or jCal object.
+     *
+     * The value must always be an array.
+     *
+     * @param array $value
+     * @return void
+     */
+    public function setJsonValue(array $value) {
+
+        $value = array_map(
+            function($item) {
+
+                return strtr(implode('/', $item), array(':' => '', '-' => ''));
+
+            },
+            $value
+        );
+        parent::setJsonValue($value);
+
+    }
+
+    /**
+     * Returns the value, in the format it should be encoded for json.
+     *
+     * This method must always return an array.
+     *
+     * @return array
+     */
+    public function getJsonValue() {
+
+        $return = array();
+        foreach($this->getParts() as $item) {
+
+            list($start, $end) = explode('/', $item, 2);
+
+            $start = DateTimeParser::parseDateTime($start);
+
+            // This is a duration value.
+            if ($end[0]==='P') {
+                $return[] = array(
+                    $start->format('Y-m-d\\TH:i:s'),
+                    $end
+                );
+            } else {
+                $end = DateTimeParser::parseDateTime($end);
+                $return[] = array(
+                    $start->format('Y-m-d\\TH:i:s'),
+                    $end->format('Y-m-d\\TH:i:s'),
+                );
+            }
+
+        }
+
+        return $return;
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/Property/ICalendar/Recur.php b/vendor/sabre/vobject/lib/Property/ICalendar/Recur.php
new file mode 100644
index 0000000000000000000000000000000000000000..6cdb2b78a1cf7e60e6ea4142959b14cfc1ebf71c
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Property/ICalendar/Recur.php
@@ -0,0 +1,203 @@
+<?php
+
+namespace Sabre\VObject\Property\ICalendar;
+
+use
+    Sabre\VObject\Property,
+    Sabre\VObject\Parser\MimeDir;
+
+/**
+ * Recur property
+ *
+ * This object represents RECUR properties.
+ * These values are just used for RRULE and the now deprecated EXRULE.
+ *
+ * The RRULE property may look something like this:
+ *
+ * RRULE:FREQ=MONTHLY;BYDAY=1,2,3;BYHOUR=5.
+ *
+ * This property exposes this as a key=>value array that is accessible using
+ * getParts, and may be set using setParts.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class Recur extends Property {
+
+    /**
+     * Updates the current value.
+     *
+     * This may be either a single, or multiple strings in an array.
+     *
+     * @param string|array $value
+     * @return void
+     */
+    public function setValue($value) {
+
+        // If we're getting the data from json, we'll be receiving an object
+        if ($value instanceof \StdClass) {
+            $value = (array)$value;
+        }
+
+        if (is_array($value)) {
+            $newVal = array();
+            foreach($value as $k=>$v) {
+
+                if (is_string($v)) {
+                    $v = strtoupper($v);
+
+                    // The value had multiple sub-values
+                    if (strpos($v,',')!==false) {
+                        $v = explode(',', $v);
+                    }
+                } else {
+                    $v = array_map('strtoupper', $v);
+                }
+
+                $newVal[strtoupper($k)] = $v;
+            }
+            $this->value = $newVal;
+        } elseif (is_string($value)) {
+            $this->value = self::stringToArray($value);
+        } else {
+            throw new \InvalidArgumentException('You must either pass a string, or a key=>value array');
+        }
+
+    }
+
+    /**
+     * Returns the current value.
+     *
+     * This method will always return a singular value. If this was a
+     * multi-value object, some decision will be made first on how to represent
+     * it as a string.
+     *
+     * To get the correct multi-value version, use getParts.
+     *
+     * @return string
+     */
+    public function getValue() {
+
+        $out = array();
+        foreach($this->value as $key=>$value) {
+            $out[] = $key . '=' . (is_array($value)?implode(',', $value):$value);
+        }
+        return strtoupper(implode(';',$out));
+
+    }
+
+    /**
+     * Sets a multi-valued property.
+     *
+     * @param array $parts
+     * @return void
+     */
+    public function setParts(array $parts) {
+
+        $this->setValue($parts);
+
+    }
+
+    /**
+     * Returns a multi-valued property.
+     *
+     * This method always returns an array, if there was only a single value,
+     * it will still be wrapped in an array.
+     *
+     * @return array
+     */
+    public function getParts() {
+
+        return $this->value;
+
+    }
+
+    /**
+     * Sets a raw value coming from a mimedir (iCalendar/vCard) file.
+     *
+     * This has been 'unfolded', so only 1 line will be passed. Unescaping is
+     * not yet done, but parameters are not included.
+     *
+     * @param string $val
+     * @return void
+     */
+    public function setRawMimeDirValue($val) {
+
+        $this->setValue($val);
+
+    }
+
+    /**
+     * Returns a raw mime-dir representation of the value.
+     *
+     * @return string
+     */
+    public function getRawMimeDirValue() {
+
+        return $this->getValue();
+
+    }
+
+    /**
+     * Returns the type of value.
+     *
+     * This corresponds to the VALUE= parameter. Every property also has a
+     * 'default' valueType.
+     *
+     * @return string
+     */
+    public function getValueType() {
+
+        return "RECUR";
+
+    }
+
+    /**
+     * Returns the value, in the format it should be encoded for json.
+     *
+     * This method must always return an array.
+     *
+     * @return array
+     */
+    public function getJsonValue() {
+
+        $values = array();
+        foreach($this->getParts() as $k=>$v) {
+            $values[strtolower($k)] = $v;
+        }
+        return array($values);
+
+    }
+
+    /**
+     * Parses an RRULE value string, and turns it into a struct-ish array.
+     *
+     * @param string $value
+     * @return array
+     */
+    static function stringToArray($value) {
+
+        $value = strtoupper($value);
+        $newValue = array();
+        foreach(explode(';', $value) as $part) {
+
+            // Skipping empty parts.
+            if (empty($part)) {
+                continue;
+            }
+            list($partName, $partValue) = explode('=', $part);
+
+            // The value itself had multiple values..
+            if (strpos($partValue,',')!==false) {
+                $partValue=explode(',', $partValue);
+            }
+            $newValue[$partName] = $partValue;
+
+        }
+
+        return $newValue;
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/Property/IntegerValue.php b/vendor/sabre/vobject/lib/Property/IntegerValue.php
new file mode 100644
index 0000000000000000000000000000000000000000..0428633a1cbec7acabb25dfdeb16514cc336f9a2
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Property/IntegerValue.php
@@ -0,0 +1,72 @@
+<?php
+
+namespace Sabre\VObject\Property;
+
+use
+    Sabre\VObject\Property;
+
+/**
+ * Integer property
+ *
+ * This object represents INTEGER values. These are always a single integer.
+ * They may be preceeded by either + or -.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class IntegerValue extends Property {
+
+    /**
+     * Sets a raw value coming from a mimedir (iCalendar/vCard) file.
+     *
+     * This has been 'unfolded', so only 1 line will be passed. Unescaping is
+     * not yet done, but parameters are not included.
+     *
+     * @param string $val
+     * @return void
+     */
+    public function setRawMimeDirValue($val) {
+
+        $this->setValue((int)$val);
+
+    }
+
+    /**
+     * Returns a raw mime-dir representation of the value.
+     *
+     * @return string
+     */
+    public function getRawMimeDirValue() {
+
+        return $this->value;
+
+    }
+
+    /**
+     * Returns the type of value.
+     *
+     * This corresponds to the VALUE= parameter. Every property also has a
+     * 'default' valueType.
+     *
+     * @return string
+     */
+    public function getValueType() {
+
+        return "INTEGER";
+
+    }
+
+    /**
+     * Returns the value, in the format it should be encoded for json.
+     *
+     * This method must always return an array.
+     *
+     * @return array
+     */
+    public function getJsonValue() {
+
+        return array((int)$this->getValue());
+
+    }
+}
diff --git a/vendor/sabre/vobject/lib/Property/Text.php b/vendor/sabre/vobject/lib/Property/Text.php
new file mode 100644
index 0000000000000000000000000000000000000000..ffd4c4b65fc43e0f1b2abc30abce1b31e270203a
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Property/Text.php
@@ -0,0 +1,333 @@
+<?php
+
+namespace Sabre\VObject\Property;
+
+use
+    Sabre\VObject\Property,
+    Sabre\VObject\Component,
+    Sabre\VObject\Parser\MimeDir,
+    Sabre\VObject\Document;
+
+/**
+ * Text property
+ *
+ * This object represents TEXT values.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class Text extends Property {
+
+    /**
+     * In case this is a multi-value property. This string will be used as a
+     * delimiter.
+     *
+     * @var string
+     */
+    public $delimiter = ',';
+
+    /**
+     * List of properties that are considered 'structured'.
+     *
+     * @var array
+     */
+    protected $structuredValues = array(
+        // vCard
+        'N',
+        'ADR',
+        'ORG',
+        'GENDER',
+
+        // iCalendar
+        'REQUEST-STATUS',
+    );
+
+    /**
+     * Some text components have a minimum number of components.
+     *
+     * N must for instance be represented as 5 components, separated by ;, even
+     * if the last few components are unused.
+     *
+     * @var array
+     */
+    protected $minimumPropertyValues = array(
+        'N' => 5,
+        'ADR' => 7,
+    );
+
+    /**
+     * Creates the property.
+     *
+     * You can specify the parameters either in key=>value syntax, in which case
+     * parameters will automatically be created, or you can just pass a list of
+     * Parameter objects.
+     *
+     * @param Component $root The root document
+     * @param string $name
+     * @param string|array|null $value
+     * @param array $parameters List of parameters
+     * @param string $group The vcard property group
+     * @return void
+     */
+    public function __construct(Component $root, $name, $value = null, array $parameters = array(), $group = null) {
+
+        // There's two types of multi-valued text properties:
+        // 1. multivalue properties.
+        // 2. structured value properties
+        //
+        // The former is always separated by a comma, the latter by semi-colon.
+        if (in_array($name, $this->structuredValues)) {
+            $this->delimiter = ';';
+        }
+
+        parent::__construct($root, $name, $value, $parameters, $group);
+
+    }
+
+
+    /**
+     * Sets a raw value coming from a mimedir (iCalendar/vCard) file.
+     *
+     * This has been 'unfolded', so only 1 line will be passed. Unescaping is
+     * not yet done, but parameters are not included.
+     *
+     * @param string $val
+     * @return void
+     */
+    public function setRawMimeDirValue($val) {
+
+        $this->setValue(MimeDir::unescapeValue($val, $this->delimiter));
+
+    }
+
+    /**
+     * Sets the value as a quoted-printable encoded string.
+     *
+     * @param string $val
+     * @return void
+     */
+    public function setQuotedPrintableValue($val) {
+
+        $val = quoted_printable_decode($val);
+
+        // Quoted printable only appears in vCard 2.1, and the only character
+        // that may be escaped there is ;. So we are simply splitting on just
+        // that.
+        //
+        // We also don't have to unescape \\, so all we need to look for is a ;
+        // that's not preceeded with a \.
+        $regex = '# (?<!\\\\) ; #x';
+        $matches = preg_split($regex, $val);
+        $this->setValue($matches);
+
+    }
+
+    /**
+     * Returns a raw mime-dir representation of the value.
+     *
+     * @return string
+     */
+    public function getRawMimeDirValue() {
+
+        $val = $this->getParts();
+
+        if (isset($this->minimumPropertyValues[$this->name])) {
+            $val = array_pad($val, $this->minimumPropertyValues[$this->name], '');
+        }
+
+        foreach($val as &$item) {
+
+            if (!is_array($item)) {
+                $item = array($item);
+            }
+
+            foreach($item as &$subItem) {
+                $subItem = strtr(
+                    $subItem,
+                    array(
+                        '\\' => '\\\\',
+                        ';'  => '\;',
+                        ','  => '\,',
+                        "\n" => '\n',
+                        "\r" => "",
+                    )
+                );
+            }
+            $item = implode(',', $item);
+
+        }
+
+        return implode($this->delimiter, $val);
+
+    }
+
+    /**
+     * Returns the value, in the format it should be encoded for json.
+     *
+     * This method must always return an array.
+     *
+     * @return array
+     */
+    public function getJsonValue() {
+
+        // Structured text values should always be returned as a single
+        // array-item. Multi-value text should be returned as multiple items in
+        // the top-array.
+        if (in_array($this->name, $this->structuredValues)) {
+            return array($this->getParts());
+        } else {
+            return $this->getParts();
+        }
+
+    }
+
+    /**
+     * Returns the type of value.
+     *
+     * This corresponds to the VALUE= parameter. Every property also has a
+     * 'default' valueType.
+     *
+     * @return string
+     */
+    public function getValueType() {
+
+        return "TEXT";
+
+    }
+
+    /**
+     * Turns the object back into a serialized blob.
+     *
+     * @return string
+     */
+    public function serialize() {
+
+        // We need to kick in a special type of encoding, if it's a 2.1 vcard.
+        if ($this->root->getDocumentType() !== Document::VCARD21) {
+            return parent::serialize();
+        }
+
+        $val = $this->getParts();
+
+        if (isset($this->minimumPropertyValues[$this->name])) {
+            $val = array_pad($val, $this->minimumPropertyValues[$this->name], '');
+        }
+
+        // Imploding multiple parts into a single value, and splitting the
+        // values with ;.
+        if (count($val)>1) {
+            foreach($val as $k=>$v) {
+                $val[$k] = str_replace(';','\;', $v);
+            }
+            $val = implode(';', $val);
+        } else {
+            $val = $val[0];
+        }
+
+        $str = $this->name;
+        if ($this->group) $str = $this->group . '.' . $this->name;
+        foreach($this->parameters as $param) {
+
+            if ($param->getValue() === 'QUOTED-PRINTABLE') {
+                continue;
+            }
+            $str.=';' . $param->serialize();
+
+        }
+
+
+
+        // If the resulting value contains a \n, we must encode it as
+        // quoted-printable.
+        if (strpos($val,"\n") !== false) {
+
+            $str.=';ENCODING=QUOTED-PRINTABLE:';
+            $lastLine=$str;
+            $out = null;
+
+            // The PHP built-in quoted-printable-encode does not correctly
+            // encode newlines for us. Specifically, the \r\n sequence must in
+            // vcards be encoded as =0D=OA and we must insert soft-newlines
+            // every 75 bytes.
+            for($ii=0;$ii<strlen($val);$ii++) {
+                $ord = ord($val[$ii]);
+                // These characters are encoded as themselves.
+                if ($ord >= 32 && $ord <=126) {
+                    $lastLine.=$val[$ii];
+                } else {
+                    $lastLine.='=' . strtoupper(bin2hex($val[$ii]));
+                }
+                if (strlen($lastLine)>=75) {
+                    // Soft line break
+                    $out.=$lastLine. "=\r\n ";
+                    $lastLine = null;
+                }
+
+            }
+            if (!is_null($lastLine)) $out.= $lastLine . "\r\n";
+            return $out;
+
+        } else {
+            $str.=':' . $val;
+            $out = '';
+            while(strlen($str)>0) {
+                if (strlen($str)>75) {
+                    $out.= mb_strcut($str,0,75,'utf-8') . "\r\n";
+                    $str = ' ' . mb_strcut($str,75,strlen($str),'utf-8');
+                } else {
+                    $out.=$str . "\r\n";
+                    $str='';
+                    break;
+                }
+            }
+
+            return $out;
+
+
+        }
+
+    }
+
+    /**
+     * Validates the node for correctness.
+     *
+     * The following options are supported:
+     *   - Node::REPAIR - If something is broken, and automatic repair may
+     *                    be attempted.
+     *
+     * An array is returned with warnings.
+     *
+     * Every item in the array has the following properties:
+     *    * level - (number between 1 and 3 with severity information)
+     *    * message - (human readable message)
+     *    * node - (reference to the offending node)
+     *
+     * @param int $options
+     * @return array
+     */
+    public function validate($options = 0) {
+
+        $warnings = parent::validate($options);
+
+        if (isset($this->minimumPropertyValues[$this->name])) {
+
+            $minimum = $this->minimumPropertyValues[$this->name];
+            $parts = $this->getParts();
+            if (count($parts) < $minimum) {
+                $warnings[] = array(
+                    'level' => 1,
+                    'message' => 'This property must have at least ' . $minimum . ' components. It only has ' . count($parts),
+                    'node' => $this,
+                );
+                if ($options & self::REPAIR) {
+                    $parts = array_pad($parts, $minimum, '');
+                    $this->setParts($parts);
+                }
+            }
+
+        }
+        return $warnings;
+
+    }
+}
diff --git a/vendor/sabre/vobject/lib/Property/Time.php b/vendor/sabre/vobject/lib/Property/Time.php
new file mode 100644
index 0000000000000000000000000000000000000000..33e76c7db2aff6e7f019eefc7db343493fcec9ec
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Property/Time.php
@@ -0,0 +1,94 @@
+<?php
+
+namespace Sabre\VObject\Property;
+
+use Sabre\VObject\DateTimeParser;
+
+/**
+ * Time property
+ *
+ * This object encodes TIME values.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class Time extends Text {
+
+    /**
+     * In case this is a multi-value property. This string will be used as a
+     * delimiter.
+     *
+     * @var string|null
+     */
+    public $delimiter = null;
+
+    /**
+     * Returns the type of value.
+     *
+     * This corresponds to the VALUE= parameter. Every property also has a
+     * 'default' valueType.
+     *
+     * @return string
+     */
+    public function getValueType() {
+
+        return "TIME";
+
+    }
+
+    /**
+     * Returns the value, in the format it should be encoded for json.
+     *
+     * This method must always return an array.
+     *
+     * @return array
+     */
+    public function getJsonValue() {
+
+        $parts = DateTimeParser::parseVCardTime($this->getValue());
+
+        $timeStr = '';
+
+        // Hour
+        if (!is_null($parts['hour'])) {
+            $timeStr.=$parts['hour'];
+
+            if (!is_null($parts['minute'])) {
+                $timeStr.=':';
+            }
+        } else {
+            // We know either minute or second _must_ be set, so we insert a
+            // dash for an empty value.
+            $timeStr.='-';
+        }
+
+        // Minute
+        if (!is_null($parts['minute'])) {
+            $timeStr.=$parts['minute'];
+
+            if (!is_null($parts['second'])) {
+                $timeStr.=':';
+            }
+        } else {
+            if (isset($parts['second'])) {
+                // Dash for empty minute
+                $timeStr.='-';
+            }
+        }
+
+        // Second
+        if (!is_null($parts['second'])) {
+            $timeStr.=$parts['second'];
+        }
+
+        // Timezone
+        if (!is_null($parts['timezone'])) {
+            $timeStr.=$parts['timezone'];
+        }
+
+        return array($timeStr);
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/Property/Unknown.php b/vendor/sabre/vobject/lib/Property/Unknown.php
new file mode 100644
index 0000000000000000000000000000000000000000..36a4e430d5dd07cff08df77cdee33e50e228c21e
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Property/Unknown.php
@@ -0,0 +1,50 @@
+<?php
+
+namespace Sabre\VObject\Property;
+
+use
+    Sabre\VObject\Property,
+    Sabre\VObject\Component,
+    Sabre\VObject\Parser\MimeDir,
+    Sabre\VObject\Document;
+
+/**
+ * Unknown property
+ *
+ * This object represents any properties not recognized by the parser.
+ * This type of value has been introduced by the jCal, jCard specs.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class Unknown extends Text {
+
+    /**
+     * Returns the value, in the format it should be encoded for json.
+     *
+     * This method must always return an array.
+     *
+     * @return array
+     */
+    public function getJsonValue() {
+
+        return array($this->getRawMimeDirValue());
+
+    }
+
+    /**
+     * Returns the type of value.
+     *
+     * This corresponds to the VALUE= parameter. Every property also has a
+     * 'default' valueType.
+     *
+     * @return string
+     */
+    public function getValueType() {
+
+        return "UNKNOWN";
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/Property/Uri.php b/vendor/sabre/vobject/lib/Property/Uri.php
new file mode 100644
index 0000000000000000000000000000000000000000..33e63d146a8b7cafec4151785b0a43f848381a1b
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Property/Uri.php
@@ -0,0 +1,95 @@
+<?php
+
+namespace Sabre\VObject\Property;
+
+use Sabre\VObject\Property;
+
+/**
+ * URI property
+ *
+ * This object encodes URI values. vCard 2.1 calls these URL.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class Uri extends Text {
+
+    /**
+     * In case this is a multi-value property. This string will be used as a
+     * delimiter.
+     *
+     * @var string|null
+     */
+    public $delimiter = null;
+
+    /**
+     * Returns the type of value.
+     *
+     * This corresponds to the VALUE= parameter. Every property also has a
+     * 'default' valueType.
+     *
+     * @return string
+     */
+    public function getValueType() {
+
+        return "URI";
+
+    }
+
+    /**
+     * Sets a raw value coming from a mimedir (iCalendar/vCard) file.
+     *
+     * This has been 'unfolded', so only 1 line will be passed. Unescaping is
+     * not yet done, but parameters are not included.
+     *
+     * @param string $val
+     * @return void
+     */
+    public function setRawMimeDirValue($val) {
+
+        // Normally we don't need to do any type of unescaping for these
+        // properties, however.. we've noticed that Google Contacts
+        // specifically escapes the colon (:) with a blackslash. While I have
+        // no clue why they thought that was a good idea, I'm unescaping it
+        // anyway.
+        //
+        // Good thing backslashes are not allowed in urls. Makes it easy to
+        // assume that a backslash is always intended as an escape character.
+        if ($this->name === 'URL') {
+            $regex = '#  (?: (\\\\ (?: \\\\ | : ) ) ) #x';
+            $matches = preg_split($regex, $val, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
+            $newVal = '';
+            foreach($matches as $match) {
+                switch($match) {
+                    case '\:' :
+                        $newVal.=':';
+                        break;
+                    default :
+                        $newVal.=$match;
+                        break;
+                }
+            }
+            $this->value = $newVal;
+        } else {
+            $this->value = $val;
+        }
+
+    }
+
+    /**
+     * Returns a raw mime-dir representation of the value.
+     *
+     * @return string
+     */
+    public function getRawMimeDirValue() {
+
+        if (is_array($this->value)) {
+            return $this->value[0];
+        } else {
+            return $this->value;
+        }
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/Property/UtcOffset.php b/vendor/sabre/vobject/lib/Property/UtcOffset.php
new file mode 100644
index 0000000000000000000000000000000000000000..185ab829f3a00b0d5a93e73a0c42a25a074f54cd
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Property/UtcOffset.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace Sabre\VObject\Property;
+
+/**
+ * UtcOffset property
+ *
+ * This object encodes UTC-OFFSET values.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class UtcOffset extends Text {
+
+    /**
+     * In case this is a multi-value property. This string will be used as a
+     * delimiter.
+     *
+     * @var string|null
+     */
+    public $delimiter = null;
+
+    /**
+     * Returns the type of value.
+     *
+     * This corresponds to the VALUE= parameter. Every property also has a
+     * 'default' valueType.
+     *
+     * @return string
+     */
+    public function getValueType() {
+
+        return "UTC-OFFSET";
+
+    }
+}
diff --git a/vendor/sabre/vobject/lib/Property/VCard/Date.php b/vendor/sabre/vobject/lib/Property/VCard/Date.php
new file mode 100644
index 0000000000000000000000000000000000000000..0e5653d6b58cc2a8a2deeb6b1f4ffbac1377d0c5
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Property/VCard/Date.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace Sabre\VObject\Property\VCard;
+
+use
+    Sabre\VObject\DateTimeParser;
+
+/**
+ * Date property
+ *
+ * This object encodes vCard DATE values.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class Date extends DateAndOrTime {
+
+    /**
+     * Returns the type of value.
+     *
+     * This corresponds to the VALUE= parameter. Every property also has a
+     * 'default' valueType.
+     *
+     * @return string
+     */
+    public function getValueType() {
+
+        return "DATE";
+
+    }
+
+    /**
+     * Sets the property as a DateTime object.
+     *
+     * @param \DateTime $dt
+     * @return void
+     */
+    public function setDateTime(\DateTime $dt) {
+
+        $this->value = $dt->format('Ymd');
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/Property/VCard/DateAndOrTime.php b/vendor/sabre/vobject/lib/Property/VCard/DateAndOrTime.php
new file mode 100644
index 0000000000000000000000000000000000000000..f36868a521527dbdcb068a6f6bd376e8953fdc36
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Property/VCard/DateAndOrTime.php
@@ -0,0 +1,317 @@
+<?php
+
+namespace Sabre\VObject\Property\VCard;
+
+use
+    Sabre\VObject\DateTimeParser,
+    Sabre\VObject\Property\Text,
+    Sabre\VObject\Property,
+    DateTime;
+
+/**
+ * DateAndOrTime property
+ *
+ * This object encodes DATE-AND-OR-TIME values.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class DateAndOrTime extends Property {
+
+    /**
+     * Field separator
+     *
+     * @var null|string
+     */
+    public $delimiter = null;
+
+    /**
+     * Returns the type of value.
+     *
+     * This corresponds to the VALUE= parameter. Every property also has a
+     * 'default' valueType.
+     *
+     * @return string
+     */
+    public function getValueType() {
+
+        return "DATE-AND-OR-TIME";
+
+    }
+
+    /**
+     * Sets a multi-valued property.
+     *
+     * You may also specify DateTime objects here.
+     *
+     * @param array $parts
+     * @return void
+     */
+    public function setParts(array $parts) {
+
+        if (count($parts)>1) {
+            throw new \InvalidArgumentException('Only one value allowed');
+        }
+        if (isset($parts[0]) && $parts[0] instanceof \DateTime) {
+            $this->setDateTime($parts[0]);
+        } else {
+            parent::setParts($parts);
+        }
+
+    }
+
+    /**
+     * Updates the current value.
+     *
+     * This may be either a single, or multiple strings in an array.
+     *
+     * Instead of strings, you may also use DateTime here.
+     *
+     * @param string|array|\DateTime $value
+     * @return void
+     */
+    public function setValue($value) {
+
+        if ($value instanceof \DateTime) {
+            $this->setDateTime($value);
+        } else {
+            parent::setValue($value);
+        }
+
+    }
+
+    /**
+     * Sets the property as a DateTime object.
+     *
+     * @param \DateTime $dt
+     * @return void
+     */
+    public function setDateTime(\DateTime $dt) {
+
+        $values = array();
+
+        $tz = null;
+        $isUtc = false;
+
+        $tz = $dt->getTimeZone();
+        $isUtc = in_array($tz->getName() , array('UTC', 'GMT', 'Z'));
+
+        if ($isUtc) {
+            $value = $dt->format('Ymd\\THis\\Z');
+        } else {
+            // Calculating the offset.
+            $value = $dt->format('Ymd\\THisO');
+        }
+
+        $this->value = $value;
+
+    }
+
+    /**
+     * Returns a date-time value.
+     *
+     * Note that if this property contained more than 1 date-time, only the
+     * first will be returned. To get an array with multiple values, call
+     * getDateTimes.
+     *
+     * If no time was specified, we will always use midnight (in the default
+     * timezone) as the time.
+     *
+     * If parts of the date were omitted, such as the year, we will grab the
+     * current values for those. So at the time of writing, if the year was
+     * omitted, we would have filled in 2014.
+     *
+     * @return \DateTime
+     */
+    public function getDateTime() {
+
+        $dts = array();
+        $now = new DateTime();
+
+        $tzFormat = $now->getTimezone()->getOffset($now)===0?'\\Z':'O';
+        $nowParts = DateTimeParser::parseVCardDateTime($now->format('Ymd\\This' . $tzFormat));
+
+        $value = $this->getValue();
+
+        $dateParts = DateTimeParser::parseVCardDateTime($this->getValue());
+
+        // This sets all the missing parts to the current date/time.
+        // So if the year was missing for a birthday, we're making it 'this
+        // year'.
+        foreach($dateParts as $k=>$v) {
+            if (is_null($v)) {
+                $dateParts[$k] = $nowParts[$k];
+            }
+        }
+        return new DateTime("$dateParts[year]-$dateParts[month]-$dateParts[date] $dateParts[hour]:$dateParts[minute]:$dateParts[second] $dateParts[timezone]");
+
+    }
+
+    /**
+     * Returns the value, in the format it should be encoded for json.
+     *
+     * This method must always return an array.
+     *
+     * @return array
+     */
+    public function getJsonValue() {
+
+        $parts = DateTimeParser::parseVCardDateTime($this->getValue());
+
+        $dateStr = '';
+
+        // Year
+        if (!is_null($parts['year'])) {
+            $dateStr.=$parts['year'];
+
+            if (!is_null($parts['month'])) {
+                // If a year and a month is set, we need to insert a separator
+                // dash.
+                $dateStr.='-';
+            }
+
+        } else {
+
+            if (!is_null($parts['month']) || !is_null($parts['date'])) {
+                // Inserting two dashes
+                $dateStr.='--';
+            }
+
+        }
+
+        // Month
+
+        if (!is_null($parts['month'])) {
+            $dateStr.=$parts['month'];
+
+            if (isset($parts['date'])) {
+                // If month and date are set, we need the separator dash.
+                $dateStr.='-';
+            }
+        } else {
+            if (isset($parts['date'])) {
+                // If the month is empty, and a date is set, we need a 'empty
+                // dash'
+                $dateStr.='-';
+            }
+        }
+
+        // Date
+        if (!is_null($parts['date'])) {
+            $dateStr.=$parts['date'];
+        }
+
+
+        // Early exit if we don't have a time string.
+        if (is_null($parts['hour']) && is_null($parts['minute']) && is_null($parts['second'])) {
+            return array($dateStr);
+        }
+
+        $dateStr.='T';
+
+        // Hour
+        if (!is_null($parts['hour'])) {
+            $dateStr.=$parts['hour'];
+
+            if (!is_null($parts['minute'])) {
+                $dateStr.=':';
+            }
+        } else {
+            // We know either minute or second _must_ be set, so we insert a
+            // dash for an empty value.
+            $dateStr.='-';
+        }
+
+        // Minute
+        if (!is_null($parts['minute'])) {
+            $dateStr.=$parts['minute'];
+
+            if (!is_null($parts['second'])) {
+                $dateStr.=':';
+            }
+        } else {
+            if (isset($parts['second'])) {
+                // Dash for empty minute
+                $dateStr.='-';
+            }
+        }
+
+        // Second
+        if (!is_null($parts['second'])) {
+            $dateStr.=$parts['second'];
+        }
+
+        // Timezone
+        if (!is_null($parts['timezone'])) {
+            $dateStr.=$parts['timezone'];
+        }
+
+        return array($dateStr);
+
+    }
+
+    /**
+     * Sets a raw value coming from a mimedir (iCalendar/vCard) file.
+     *
+     * This has been 'unfolded', so only 1 line will be passed. Unescaping is
+     * not yet done, but parameters are not included.
+     *
+     * @param string $val
+     * @return void
+     */
+    public function setRawMimeDirValue($val) {
+
+        $this->setValue($val);
+
+    }
+
+    /**
+     * Returns a raw mime-dir representation of the value.
+     *
+     * @return string
+     */
+    public function getRawMimeDirValue() {
+
+        return implode($this->delimiter, $this->getParts());
+
+    }
+
+    /**
+     * Validates the node for correctness.
+     *
+     * The following options are supported:
+     *   Node::REPAIR - May attempt to automatically repair the problem.
+     *
+     * This method returns an array with detected problems.
+     * Every element has the following properties:
+     *
+     *  * level - problem level.
+     *  * message - A human-readable string describing the issue.
+     *  * node - A reference to the problematic node.
+     *
+     * The level means:
+     *   1 - The issue was repaired (only happens if REPAIR was turned on)
+     *   2 - An inconsequential issue
+     *   3 - A severe issue.
+     *
+     * @param int $options
+     * @return array
+     */
+    public function validate($options = 0) {
+
+        $messages = parent::validate($options);
+        $value = $this->getValue();
+        try {
+            DateTimeParser::parseVCardDateTime($value);
+        } catch (\InvalidArgumentException $e) {
+            $messages[] = array(
+                'level' => 3,
+                'message' => 'The supplied value (' . $value . ') is not a correct DATE-AND-OR-TIME property',
+                'node' => $this,
+            );
+        }
+        return $messages;
+
+    }
+}
diff --git a/vendor/sabre/vobject/lib/Property/VCard/DateTime.php b/vendor/sabre/vobject/lib/Property/VCard/DateTime.php
new file mode 100644
index 0000000000000000000000000000000000000000..7daad89db20964ceab59bf9aa0cea666970ec6dc
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Property/VCard/DateTime.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace Sabre\VObject\Property\VCard;
+
+use
+    Sabre\VObject\DateTimeParser;
+
+/**
+ * DateTime property
+ *
+ * This object encodes DATE-TIME values for vCards.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class DateTime extends DateAndOrTime {
+
+    /**
+     * Returns the type of value.
+     *
+     * This corresponds to the VALUE= parameter. Every property also has a
+     * 'default' valueType.
+     *
+     * @return string
+     */
+    public function getValueType() {
+
+        return "DATE-TIME";
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/Property/VCard/LanguageTag.php b/vendor/sabre/vobject/lib/Property/VCard/LanguageTag.php
new file mode 100644
index 0000000000000000000000000000000000000000..c819aad865eb09e3e64fb39176d77cde6fb4e59d
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Property/VCard/LanguageTag.php
@@ -0,0 +1,59 @@
+<?php
+
+namespace Sabre\VObject\Property\VCard;
+
+use
+    Sabre\VObject\Property;
+
+/**
+ * LanguageTag property
+ *
+ * This object represents LANGUAGE-TAG values as used in vCards.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class LanguageTag extends Property {
+
+    /**
+     * Sets a raw value coming from a mimedir (iCalendar/vCard) file.
+     *
+     * This has been 'unfolded', so only 1 line will be passed. Unescaping is
+     * not yet done, but parameters are not included.
+     *
+     * @param string $val
+     * @return void
+     */
+    public function setRawMimeDirValue($val) {
+
+        $this->setValue($val);
+
+    }
+
+    /**
+     * Returns a raw mime-dir representation of the value.
+     *
+     * @return string
+     */
+    public function getRawMimeDirValue() {
+
+        return $this->getValue();
+
+    }
+
+    /**
+     * Returns the type of value.
+     *
+     * This corresponds to the VALUE= parameter. Every property also has a
+     * 'default' valueType.
+     *
+     * @return string
+     */
+    public function getValueType() {
+
+        return "LANGUAGE-TAG";
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/Property/VCard/TimeStamp.php b/vendor/sabre/vobject/lib/Property/VCard/TimeStamp.php
new file mode 100644
index 0000000000000000000000000000000000000000..5f7f4986ad850ce7c799374df5c29afc44a9b1a1
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Property/VCard/TimeStamp.php
@@ -0,0 +1,69 @@
+<?php
+
+namespace Sabre\VObject\Property\VCard;
+
+use
+    Sabre\VObject\DateTimeParser,
+    Sabre\VObject\Property\Text;
+
+/**
+ * TimeStamp property
+ *
+ * This object encodes TIMESTAMP values.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class TimeStamp extends Text {
+
+    /**
+     * In case this is a multi-value property. This string will be used as a
+     * delimiter.
+     *
+     * @var string|null
+     */
+    public $delimiter = null;
+
+    /**
+     * Returns the type of value.
+     *
+     * This corresponds to the VALUE= parameter. Every property also has a
+     * 'default' valueType.
+     *
+     * @return string
+     */
+    public function getValueType() {
+
+        return "TIMESTAMP";
+
+    }
+
+    /**
+     * Returns the value, in the format it should be encoded for json.
+     *
+     * This method must always return an array.
+     *
+     * @return array
+     */
+    public function getJsonValue() {
+
+        $parts = DateTimeParser::parseVCardDateTime($this->getValue());
+
+        $dateStr =
+            $parts['year'] . '-' .
+            $parts['month'] . '-' .
+            $parts['date'] . 'T' .
+            $parts['hour'] . ':' .
+            $parts['minute'] . ':' .
+            $parts['second'];
+
+        // Timezone
+        if (!is_null($parts['timezone'])) {
+            $dateStr.=$parts['timezone'];
+        }
+
+        return array($dateStr);
+
+    }
+}
diff --git a/vendor/sabre/vobject/lib/Reader.php b/vendor/sabre/vobject/lib/Reader.php
new file mode 100644
index 0000000000000000000000000000000000000000..d61fa51ac1ec058e4965ba0d4c34b53f2ede9794
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Reader.php
@@ -0,0 +1,73 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * iCalendar/vCard/jCal/jCard reader object.
+ *
+ * This object provides a few (static) convenience methods to quickly access
+ * the parsers.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class Reader {
+
+    /**
+     * If this option is passed to the reader, it will be less strict about the
+     * validity of the lines.
+     */
+    const OPTION_FORGIVING = 1;
+
+    /**
+     * If this option is turned on, any lines we cannot parse will be ignored
+     * by the reader.
+     */
+    const OPTION_IGNORE_INVALID_LINES = 2;
+
+    /**
+     * Parses a vCard or iCalendar object, and returns the top component.
+     *
+     * The options argument is a bitfield. Pass any of the OPTIONS constant to
+     * alter the parsers' behaviour.
+     *
+     * You can either supply a string, or a readable stream for input.
+     *
+     * @param string|resource $data
+     * @param int $options
+     * @return Document
+     */
+    static public function read($data, $options = 0) {
+
+        $parser = new Parser\MimeDir();
+        $result = $parser->parse($data, $options);
+
+        return $result;
+
+    }
+
+    /**
+     * Parses a jCard or jCal object, and returns the top component.
+     *
+     * The options argument is a bitfield. Pass any of the OPTIONS constant to
+     * alter the parsers' behaviour.
+     *
+     * You can either a string, a readable stream, or an array for it's input.
+     * Specifying the array is useful if json_decode was already called on the
+     * input.
+     *
+     * @param string|resource|array $data
+     * @param int $options
+     * @return Node
+     */
+    static public function readJson($data, $options = 0) {
+
+        $parser = new Parser\Json();
+        $result = $parser->parse($data, $options);
+
+        return $result;
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/Recur/EventIterator.php b/vendor/sabre/vobject/lib/Recur/EventIterator.php
new file mode 100644
index 0000000000000000000000000000000000000000..506a1213af6955c608700b39b23a18e67753d1b3
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Recur/EventIterator.php
@@ -0,0 +1,500 @@
+<?php
+
+namespace Sabre\VObject\Recur;
+
+use InvalidArgumentException;
+use DateTime;
+use DateTimeZone;
+use Sabre\VObject\Component;
+use Sabre\VObject\Component\VEvent;
+
+/**
+ * This class is used to determine new for a recurring event, when the next
+ * events occur.
+ *
+ * This iterator may loop infinitely in the future, therefore it is important
+ * that if you use this class, you set hard limits for the amount of iterations
+ * you want to handle.
+ *
+ * Note that currently there is not full support for the entire iCalendar
+ * specification, as it's very complex and contains a lot of permutations
+ * that's not yet used very often in software.
+ *
+ * For the focus has been on features as they actually appear in Calendaring
+ * software, but this may well get expanded as needed / on demand
+ *
+ * The following RRULE properties are supported
+ *   * UNTIL
+ *   * INTERVAL
+ *   * COUNT
+ *   * FREQ=DAILY
+ *     * BYDAY
+ *     * BYHOUR
+ *     * BYMONTH
+ *   * FREQ=WEEKLY
+ *     * BYDAY
+ *     * BYHOUR
+ *     * WKST
+ *   * FREQ=MONTHLY
+ *     * BYMONTHDAY
+ *     * BYDAY
+ *     * BYSETPOS
+ *   * FREQ=YEARLY
+ *     * BYMONTH
+ *     * BYMONTHDAY (only if BYMONTH is also set)
+ *     * BYDAY (only if BYMONTH is also set)
+ *
+ * Anything beyond this is 'undefined', which means that it may get ignored, or
+ * you may get unexpected results. The effect is that in some applications the
+ * specified recurrence may look incorrect, or is missing.
+ *
+ * The recurrence iterator also does not yet support THISANDFUTURE.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class EventIterator implements \Iterator {
+
+    /**
+     * Reference timeZone for floating dates and times.
+     *
+     * @var DateTimeZone
+     */
+    protected $timeZone;
+
+    /**
+     * True if we're iterating an all-day event.
+     *
+     * @var bool
+     */
+    protected $allDay = false;
+
+    /**
+     * Creates the iterator
+     *
+     * There's three ways to set up the iterator.
+     *
+     * 1. You can pass a VCALENDAR component and a UID.
+     * 2. You can pass an array of VEVENTs (all UIDS should match).
+     * 3. You can pass a single VEVENT component.
+     *
+     * Only the second method is recomended. The other 1 and 3 will be removed
+     * at some point in the future.
+     *
+     * The $uid parameter is only required for the first method.
+     *
+     * @param Component|array $input
+     * @param string|null $uid
+     * @param DateTimeZone $timeZone Reference timezone for floating dates and
+     *                               times.
+     */
+    public function __construct($input, $uid = null, DateTimeZone $timeZone = null) {
+
+        if (is_null($this->timeZone)) {
+            $timeZone = new DateTimeZone('UTC');
+        }
+        $this->timeZone = $timeZone;
+
+        if (is_array($input)) {
+            $events = $input;
+        } elseif ($input instanceof VEvent) {
+            // Single instance mode.
+            $events = array($input);
+        } else {
+            // Calendar + UID mode.
+            $uid = (string)$uid;
+            if (!$uid) {
+                throw new InvalidArgumentException('The UID argument is required when a VCALENDAR is passed to this constructor');
+            }
+            if (!isset($input->VEVENT)) {
+                throw new InvalidArgumentException('No events found in this calendar');
+            }
+            $events = $input->getByUID($uid);
+
+        }
+
+        foreach($events as $vevent) {
+
+            if (!isset($vevent->{'RECURRENCE-ID'})) {
+
+                $this->masterEvent = $vevent;
+
+            } else {
+
+                $this->exceptions[
+                    $vevent->{'RECURRENCE-ID'}->getDateTime($this->timeZone)->getTimeStamp()
+                ] = true;
+                $this->overriddenEvents[] = $vevent;
+
+            }
+
+        }
+
+        if (!$this->masterEvent) {
+            // No base event was found. CalDAV does allow cases where only
+            // overridden instances are stored.
+            //
+            // In this particular case, we're just going to grab the first
+            // event and use that instead. This may not always give the
+            // desired result.
+            if (!count($this->overriddenEvents)) {
+                throw new InvalidArgumentException('This VCALENDAR did not have an event with UID: ' . $uid);
+            }
+            $this->masterEvent = array_shift($this->overriddenEvents);
+        }
+
+        $this->startDate = $this->masterEvent->DTSTART->getDateTime($this->timeZone);
+        $this->allDay = !$this->masterEvent->DTSTART->hasTime();
+
+        if (isset($this->masterEvent->EXDATE)) {
+
+            foreach($this->masterEvent->EXDATE as $exDate) {
+
+                foreach($exDate->getDateTimes($this->timeZone) as $dt) {
+                    $this->exceptions[$dt->getTimeStamp()] = true;
+                }
+
+            }
+
+        }
+
+        if (isset($this->masterEvent->DTEND)) {
+            $this->eventDuration =
+                $this->masterEvent->DTEND->getDateTime($this->timeZone)->getTimeStamp() -
+                $this->startDate->getTimeStamp();
+        } elseif (isset($this->masterEvent->DURATION)) {
+            $duration = $this->masterEvent->DURATION->getDateInterval();
+            $end = clone $this->startDate;
+            $end->add($duration);
+            $this->eventDuration = $end->getTimeStamp() - $this->startDate->getTimeStamp();
+        } elseif ($this->allDay) {
+            $this->eventDuration = 3600 * 24;
+        } else {
+            $this->eventDuration = 0;
+        }
+
+        if (isset($this->masterEvent->RDATE)) {
+            $this->recurIterator = new RDateIterator(
+                $this->masterEvent->RDATE->getParts(),
+                $this->startDate
+            );
+        } elseif (isset($this->masterEvent->RRULE)) {
+            $this->recurIterator = new RRuleIterator(
+                $this->masterEvent->RRULE->getParts(),
+                $this->startDate
+            );
+        } else {
+            $this->recurIterator = new RRuleIterator(
+                array(
+                    'FREQ' => 'DAILY',
+                    'COUNT' => 1,
+                ),
+                $this->startDate
+            );
+        }
+
+        $this->rewind();
+        if (!$this->valid()) {
+            throw new NoInstancesException('This recurrence rule does not generate any valid instances');
+        }
+
+    }
+
+    /**
+     * Returns the date for the current position of the iterator.
+     *
+     * @return DateTime
+     */
+    public function current() {
+
+        if ($this->currentDate) {
+            return clone $this->currentDate;
+        }
+
+    }
+
+    /**
+     * This method returns the start date for the current iteration of the
+     * event.
+     *
+     * @return DateTime
+     */
+    public function getDtStart() {
+
+        if ($this->currentDate) {
+            return clone $this->currentDate;
+        }
+
+    }
+
+    /**
+     * This method returns the end date for the current iteration of the
+     * event.
+     *
+     * @return DateTime
+     */
+    public function getDtEnd() {
+
+        if (!$this->valid()) {
+            return null;
+        }
+        $end = clone $this->currentDate;
+        $end->modify('+' . $this->eventDuration . ' seconds');
+        return $end;
+
+    }
+
+    /**
+     * Returns a VEVENT for the current iterations of the event.
+     *
+     * This VEVENT will have a recurrence id, and it's DTSTART and DTEND
+     * altered.
+     *
+     * @return VEvent
+     */
+    public function getEventObject() {
+
+        if ($this->currentOverriddenEvent) {
+            return $this->currentOverriddenEvent;
+        }
+
+        $event = clone $this->masterEvent;
+
+        // Ignoring the following block, because PHPUnit's code coverage
+        // ignores most of these lines, and this messes with our stats.
+        //
+        // @codeCoverageIgnoreStart
+        unset(
+            $event->RRULE,
+            $event->EXDATE,
+            $event->RDATE,
+            $event->EXRULE,
+            $event->{'RECURRENCE-ID'}
+        );
+        // @codeCoverageIgnoreEnd
+
+        $event->DTSTART->setDateTime($this->getDtStart(), $event->DTSTART->isFloating());
+        if (isset($event->DTEND)) {
+            $event->DTEND->setDateTime($this->getDtEnd(), $event->DTEND->isFloating());
+        }
+        $recurid = clone $event->DTSTART;
+        $recurid->name = 'RECURRENCE-ID';
+        $event->add($recurid);
+        return $event;
+
+    }
+
+    /**
+     * Returns the current position of the iterator.
+     *
+     * This is for us simply a 0-based index.
+     *
+     * @return int
+     */
+    public function key() {
+
+        // The counter is always 1 ahead.
+        return $this->counter - 1;
+
+    }
+
+    /**
+     * This is called after next, to see if the iterator is still at a valid
+     * position, or if it's at the end.
+     *
+     * @return bool
+     */
+    public function valid() {
+
+        return !!$this->currentDate;
+
+    }
+
+    /**
+     * Sets the iterator back to the starting point.
+     */
+    public function rewind() {
+
+        $this->recurIterator->rewind();
+        // re-creating overridden event index.
+        $index = array();
+        foreach($this->overriddenEvents as $key=>$event) {
+            $stamp = $event->DTSTART->getDateTime($this->timeZone)->getTimeStamp();
+            $index[$stamp][] = $key;
+        }
+        krsort($index);
+        $this->counter = 0;
+        $this->overriddenEventsIndex = $index;
+        $this->currentOverriddenEvent = null;
+
+        $this->nextDate = null;
+        $this->currentDate = clone $this->startDate;
+
+        $this->next();
+
+    }
+
+    /**
+     * Advances the iterator with one step.
+     *
+     * @return void
+     */
+    public function next() {
+
+        $this->currentOverriddenEvent = null;
+        $this->counter++;
+        if ($this->nextDate) {
+            // We had a stored value.
+            $nextDate = $this->nextDate;
+            $this->nextDate = null;
+        } else {
+            // We need to ask rruleparser for the next date.
+            // We need to do this until we find a date that's not in the
+            // exception list.
+            do {
+                if (!$this->recurIterator->valid()) {
+                    $nextDate = null;
+                    break;
+                }
+                $nextDate = $this->recurIterator->current();
+                $this->recurIterator->next();
+            } while(isset($this->exceptions[$nextDate->getTimeStamp()]));
+
+        }
+
+
+        // $nextDate now contains what rrule thinks is the next one, but an
+        // overridden event may cut ahead.
+        if ($this->overriddenEventsIndex) {
+
+            $offsets = end($this->overriddenEventsIndex);
+            $timestamp = key($this->overriddenEventsIndex);
+            $offset = end($offsets);
+            if (!$nextDate || $timestamp < $nextDate->getTimeStamp()) {
+                // Overridden event comes first.
+                $this->currentOverriddenEvent = $this->overriddenEvents[$offset];
+
+                // Putting the rrule next date aside.
+                $this->nextDate = $nextDate;
+                $this->currentDate = $this->currentOverriddenEvent->DTSTART->getDateTime($this->timeZone);
+
+                // Ensuring that this item will only be used once.
+                array_pop($this->overriddenEventsIndex[$timestamp]);
+                if (!$this->overriddenEventsIndex[$timestamp]) {
+                    array_pop($this->overriddenEventsIndex);
+                }
+
+                // Exit point!
+                return;
+
+            }
+
+        }
+
+        $this->currentDate = $nextDate;
+
+    }
+
+    /**
+     * Quickly jump to a date in the future.
+     *
+     * @param DateTime $dateTime
+     */
+    public function fastForward(DateTime $dateTime) {
+
+        while($this->valid() && $this->getDtEnd() < $dateTime ) {
+            $this->next();
+        }
+
+    }
+
+    /**
+     * Returns true if this recurring event never ends.
+     *
+     * @return bool
+     */
+    public function isInfinite() {
+
+        return $this->recurIterator->isInfinite();
+
+    }
+
+    /**
+     * RRULE parser
+     *
+     * @var RRuleIterator
+     */
+    protected $recurIterator;
+
+    /**
+     * The duration, in seconds, of the master event.
+     *
+     * We use this to calculate the DTEND for subsequent events.
+     */
+    protected $eventDuration;
+
+    /**
+     * A reference to the main (master) event.
+     *
+     * @var VEVENT
+     */
+    protected $masterEvent;
+
+    /**
+     * List of overridden events.
+     *
+     * @var array
+     */
+    protected $overriddenEvents = array();
+
+    /**
+     * Overridden event index.
+     *
+     * Key is timestamp, value is the list of indexes of the item in the $overriddenEvent
+     * property.
+     *
+     * @var array
+     */
+    protected $overriddenEventsIndex;
+
+    /**
+     * A list of recurrence-id's that are either part of EXDATE, or are
+     * overridden.
+     *
+     * @var array
+     */
+    protected $exceptions = array();
+
+    /**
+     * Internal event counter
+     *
+     * @var int
+     */
+    protected $counter;
+
+    /**
+     * The very start of the iteration process.
+     *
+     * @var DateTime
+     */
+    protected $startDate;
+
+    /**
+     * Where we are currently in the iteration process
+     *
+     * @var DateTime
+     */
+    protected $currentDate;
+
+    /**
+     * The next date from the rrule parser.
+     *
+     * Sometimes we need to temporary store the next date, because an
+     * overridden event came before.
+     *
+     * @var DateTime
+     */
+    protected $nextDate;
+
+}
diff --git a/vendor/sabre/vobject/lib/Recur/NoInstancesException.php b/vendor/sabre/vobject/lib/Recur/NoInstancesException.php
new file mode 100644
index 0000000000000000000000000000000000000000..8f8bb472bf59a7c6da2345c9da16ea1eeffc936f
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Recur/NoInstancesException.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace Sabre\VObject\Recur;
+
+use Exception;
+
+/**
+ * This exception gets thrown when a recurrence iterator produces 0 instances.
+ *
+ * This may happen when every occurence in a rrule is also in EXDATE.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class NoInstancesException extends Exception {
+
+}
diff --git a/vendor/sabre/vobject/lib/Recur/RDateIterator.php b/vendor/sabre/vobject/lib/Recur/RDateIterator.php
new file mode 100644
index 0000000000000000000000000000000000000000..14e6d678a58690f3bf0e7b02247e12075f25fa1e
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Recur/RDateIterator.php
@@ -0,0 +1,174 @@
+<?php
+
+namespace Sabre\VObject\Recur;
+
+use DateTime;
+use InvalidArgumentException;
+use Iterator;
+use Sabre\VObject\DateTimeParser;
+
+
+/**
+ * RRuleParser
+ *
+ * This class receives an RRULE string, and allows you to iterate to get a list
+ * of dates in that recurrence.
+ *
+ * For instance, passing: FREQ=DAILY;LIMIT=5 will cause the iterator to contain
+ * 5 items, one for each day.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class RDateIterator implements Iterator {
+
+    /**
+     * Creates the Iterator.
+     *
+     * @param string|array $rrule
+     * @param DateTime $start
+     */
+    public function __construct($rrule, DateTime $start) {
+
+        $this->startDate = $start;
+        $this->parseRDate($rrule);
+        $this->currentDate = clone $this->startDate;
+
+    }
+
+    /* Implementation of the Iterator interface {{{ */
+
+    public function current() {
+
+        if (!$this->valid()) return null;
+        return clone $this->currentDate;
+
+    }
+
+    /**
+     * Returns the current item number.
+     *
+     * @return int
+     */
+    public function key() {
+
+        return $this->counter;
+
+    }
+
+    /**
+     * Returns whether the current item is a valid item for the recurrence
+     * iterator.
+     *
+     * @return bool
+     */
+    public function valid() {
+
+        return ($this->counter <= count($this->dates));
+
+    }
+
+    /**
+     * Resets the iterator.
+     *
+     * @return void
+     */
+    public function rewind() {
+
+        $this->currentDate = clone $this->startDate;
+        $this->counter = 0;
+
+    }
+
+    /**
+     * Goes on to the next iteration.
+     *
+     * @return void
+     */
+    public function next() {
+
+        $this->counter++;
+        if (!$this->valid()) return;
+
+        $this->currentDate =
+            DateTimeParser::parse(
+                $this->dates[$this->counter-1]
+            );
+
+    }
+
+    /* End of Iterator implementation }}} */
+
+    /**
+     * Returns true if this recurring event never ends.
+     *
+     * @return bool
+     */
+    public function isInfinite() {
+
+        return false;
+
+    }
+
+    /**
+     * This method allows you to quickly go to the next occurrence after the
+     * specified date.
+     *
+     * @param DateTime $dt
+     * @return void
+     */
+    public function fastForward(\DateTime $dt) {
+
+        while($this->valid() && $this->currentDate < $dt ) {
+            $this->next();
+        }
+
+    }
+
+    /**
+     * The reference start date/time for the rrule.
+     *
+     * All calculations are based on this initial date.
+     *
+     * @var DateTime
+     */
+    protected $startDate;
+
+    /**
+     * The date of the current iteration. You can get this by calling
+     * ->current().
+     *
+     * @var DateTime
+     */
+    protected $currentDate;
+
+    /**
+     * The current item in the list.
+     *
+     * You can get this number with the key() method.
+     *
+     * @var int
+     */
+    protected $counter = 0;
+
+    /* }}} */
+
+    /**
+     * This method receives a string from an RRULE property, and populates this
+     * class with all the values.
+     *
+     * @param string|array $rrule
+     * @return void
+     */
+    protected function parseRDate($rdate) {
+
+        if (is_string($rdate)) {
+            $rdate = explode(',', $rdate);
+        }
+
+        $this->dates = $rdate;
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/Recur/RRuleIterator.php b/vendor/sabre/vobject/lib/Recur/RRuleIterator.php
new file mode 100644
index 0000000000000000000000000000000000000000..eda411d95ffae167613d0190d890fe4591801415
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Recur/RRuleIterator.php
@@ -0,0 +1,904 @@
+<?php
+
+namespace Sabre\VObject\Recur;
+
+use DateTime;
+use InvalidArgumentException;
+use Iterator;
+use Sabre\VObject\DateTimeParser;
+use Sabre\VObject\Property;
+
+
+/**
+ * RRuleParser
+ *
+ * This class receives an RRULE string, and allows you to iterate to get a list
+ * of dates in that recurrence.
+ *
+ * For instance, passing: FREQ=DAILY;LIMIT=5 will cause the iterator to contain
+ * 5 items, one for each day.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class RRuleIterator implements Iterator {
+
+    /**
+     * Creates the Iterator
+     *
+     * @param string|array $rrule
+     * @param DateTime $start
+     */
+    public function __construct($rrule, DateTime $start) {
+
+        $this->startDate = $start;
+        $this->parseRRule($rrule);
+        $this->currentDate = clone $this->startDate;
+
+    }
+
+    /* Implementation of the Iterator interface {{{ */
+
+    public function current() {
+
+        if (!$this->valid()) return null;
+        return clone $this->currentDate;
+
+    }
+
+    /**
+     * Returns the current item number
+     *
+     * @return int
+     */
+    public function key() {
+
+        return $this->counter;
+
+    }
+
+    /**
+     * Returns whether the current item is a valid item for the recurrence
+     * iterator. This will return false if we've gone beyond the UNTIL or COUNT
+     * statements.
+     *
+     * @return bool
+     */
+    public function valid() {
+
+        if (!is_null($this->count)) {
+            return $this->counter < $this->count;
+        }
+        return is_null($this->until) || $this->currentDate <= $this->until;
+
+    }
+
+    /**
+     * Resets the iterator
+     *
+     * @return void
+     */
+    public function rewind() {
+
+        $this->currentDate = clone $this->startDate;
+        $this->counter = 0;
+
+    }
+
+    /**
+     * Goes on to the next iteration
+     *
+     * @return void
+     */
+    public function next() {
+
+        $previousStamp = $this->currentDate->getTimeStamp();
+
+        // Otherwise, we find the next event in the normal RRULE
+        // sequence.
+        switch($this->frequency) {
+
+            case 'hourly' :
+                $this->nextHourly();
+                break;
+
+            case 'daily' :
+                $this->nextDaily();
+                break;
+
+            case 'weekly' :
+                $this->nextWeekly();
+                break;
+
+            case 'monthly' :
+                $this->nextMonthly();
+                break;
+
+            case 'yearly' :
+                $this->nextYearly();
+                break;
+
+        }
+        $this->counter++;
+
+    }
+
+    /* End of Iterator implementation }}} */
+
+    /**
+     * Returns true if this recurring event never ends.
+     *
+     * @return bool
+     */
+    public function isInfinite() {
+
+        return !$this->count && !$this->until;
+
+    }
+
+    /**
+     * This method allows you to quickly go to the next occurrence after the
+     * specified date.
+     *
+     * @param DateTime $dt
+     * @return void
+     */
+    public function fastForward(\DateTime $dt) {
+
+        while($this->valid() && $this->currentDate < $dt ) {
+            $this->next();
+        }
+
+    }
+
+    /**
+     * The reference start date/time for the rrule.
+     *
+     * All calculations are based on this initial date.
+     *
+     * @var DateTime
+     */
+    protected $startDate;
+
+    /**
+     * The date of the current iteration. You can get this by calling
+     * ->current().
+     *
+     * @var DateTime
+     */
+    protected $currentDate;
+
+    /**
+     * Frequency is one of: secondly, minutely, hourly, daily, weekly, monthly,
+     * yearly.
+     *
+     * @var string
+     */
+    protected $frequency;
+
+    /**
+     * The number of recurrences, or 'null' if infinitely recurring.
+     *
+     * @var int
+     */
+    protected $count;
+
+    /**
+     * The interval.
+     *
+     * If for example frequency is set to daily, interval = 2 would mean every
+     * 2 days.
+     *
+     * @var int
+     */
+    protected $interval = 1;
+
+    /**
+     * The last instance of this recurrence, inclusively
+     *
+     * @var \DateTime|null
+     */
+    protected $until;
+
+    /**
+     * Which seconds to recur.
+     *
+     * This is an array of integers (between 0 and 60)
+     *
+     * @var array
+     */
+    protected $bySecond;
+
+    /**
+     * Which minutes to recur
+     *
+     * This is an array of integers (between 0 and 59)
+     *
+     * @var array
+     */
+    protected $byMinute;
+
+    /**
+     * Which hours to recur
+     *
+     * This is an array of integers (between 0 and 23)
+     *
+     * @var array
+     */
+    protected $byHour;
+
+    /**
+     * The current item in the list.
+     *
+     * You can get this number with the key() method.
+     *
+     * @var int
+     */
+    protected $counter = 0;
+
+    /**
+     * Which weekdays to recur.
+     *
+     * This is an array of weekdays
+     *
+     * This may also be preceeded by a positive or negative integer. If present,
+     * this indicates the nth occurrence of a specific day within the monthly or
+     * yearly rrule. For instance, -2TU indicates the second-last tuesday of
+     * the month, or year.
+     *
+     * @var array
+     */
+    protected $byDay;
+
+    /**
+     * Which days of the month to recur
+     *
+     * This is an array of days of the months (1-31). The value can also be
+     * negative. -5 for instance means the 5th last day of the month.
+     *
+     * @var array
+     */
+    protected $byMonthDay;
+
+    /**
+     * Which days of the year to recur.
+     *
+     * This is an array with days of the year (1 to 366). The values can also
+     * be negative. For instance, -1 will always represent the last day of the
+     * year. (December 31st).
+     *
+     * @var array
+     */
+    protected $byYearDay;
+
+    /**
+     * Which week numbers to recur.
+     *
+     * This is an array of integers from 1 to 53. The values can also be
+     * negative. -1 will always refer to the last week of the year.
+     *
+     * @var array
+     */
+    protected $byWeekNo;
+
+    /**
+     * Which months to recur.
+     *
+     * This is an array of integers from 1 to 12.
+     *
+     * @var array
+     */
+    protected $byMonth;
+
+    /**
+     * Which items in an existing st to recur.
+     *
+     * These numbers work together with an existing by* rule. It specifies
+     * exactly which items of the existing by-rule to filter.
+     *
+     * Valid values are 1 to 366 and -1 to -366. As an example, this can be
+     * used to recur the last workday of the month.
+     *
+     * This would be done by setting frequency to 'monthly', byDay to
+     * 'MO,TU,WE,TH,FR' and bySetPos to -1.
+     *
+     * @var array
+     */
+    protected $bySetPos;
+
+    /**
+     * When the week starts.
+     *
+     * @var string
+     */
+    protected $weekStart = 'MO';
+
+    /* Functions that advance the iterator {{{ */
+
+    /**
+     * Does the processing for advancing the iterator for hourly frequency.
+     *
+     * @return void
+     */
+    protected function nextHourly() {
+
+        $this->currentDate->modify('+' . $this->interval . ' hours');
+
+    }
+
+    /**
+     * Does the processing for advancing the iterator for daily frequency.
+     *
+     * @return void
+     */
+    protected function nextDaily() {
+
+        if (!$this->byHour && !$this->byDay) {
+            $this->currentDate->modify('+' . $this->interval . ' days');
+            return;
+        }
+
+        if (isset($this->byHour)) {
+            $recurrenceHours = $this->getHours();
+        }
+
+        if (isset($this->byDay)) {
+            $recurrenceDays = $this->getDays();
+        }
+
+        if (isset($this->byMonth)) {
+            $recurrenceMonths = $this->getMonths();
+        }
+
+        do {
+            if ($this->byHour) {
+                if ($this->currentDate->format('G') == '23') {
+                    // to obey the interval rule
+                    $this->currentDate->modify('+' . $this->interval-1 . ' days');
+                }
+
+                $this->currentDate->modify('+1 hours');
+
+            } else {
+                $this->currentDate->modify('+' . $this->interval . ' days');
+
+            }
+
+            // Current month of the year
+            $currentMonth = $this->currentDate->format('n');
+
+            // Current day of the week
+            $currentDay = $this->currentDate->format('w');
+
+            // Current hour of the day
+            $currentHour = $this->currentDate->format('G');
+
+        } while (
+            ($this->byDay   && !in_array($currentDay, $recurrenceDays)) ||
+            ($this->byHour  && !in_array($currentHour, $recurrenceHours)) ||
+            ($this->byMonth && !in_array($currentMonth, $recurrenceMonths))
+        );
+
+    }
+
+    /**
+     * Does the processing for advancing the iterator for weekly frequency.
+     *
+     * @return void
+     */
+    protected function nextWeekly() {
+
+        if (!$this->byHour && !$this->byDay) {
+            $this->currentDate->modify('+' . $this->interval . ' weeks');
+            return;
+        }
+
+        if ($this->byHour) {
+            $recurrenceHours = $this->getHours();
+        }
+
+        if ($this->byDay) {
+            $recurrenceDays = $this->getDays();
+        }
+
+        // First day of the week:
+        $firstDay = $this->dayMap[$this->weekStart];
+
+        do {
+
+            if ($this->byHour) {
+                $this->currentDate->modify('+1 hours');
+            } else {
+                $this->currentDate->modify('+1 days');
+            }
+
+            // Current day of the week
+            $currentDay = (int) $this->currentDate->format('w');
+
+            // Current hour of the day
+            $currentHour = (int) $this->currentDate->format('G');
+
+            // We need to roll over to the next week
+            if ($currentDay === $firstDay && (!$this->byHour || $currentHour == '0')) {
+                $this->currentDate->modify('+' . $this->interval-1 . ' weeks');
+
+                // We need to go to the first day of this week, but only if we
+                // are not already on this first day of this week.
+                if($this->currentDate->format('w') != $firstDay) {
+                    $this->currentDate->modify('last ' . $this->dayNames[$this->dayMap[$this->weekStart]]);
+                }
+            }
+
+            // We have a match
+        } while (($this->byDay && !in_array($currentDay, $recurrenceDays)) || ($this->byHour && !in_array($currentHour, $recurrenceHours)));
+    }
+
+    /**
+     * Does the processing for advancing the iterator for monthly frequency.
+     *
+     * @return void
+     */
+    protected function nextMonthly() {
+
+        $currentDayOfMonth = $this->currentDate->format('j');
+        if (!$this->byMonthDay && !$this->byDay) {
+
+            // If the current day is higher than the 28th, rollover can
+            // occur to the next month. We Must skip these invalid
+            // entries.
+            if ($currentDayOfMonth < 29) {
+                $this->currentDate->modify('+' . $this->interval . ' months');
+            } else {
+                $increase = 0;
+                do {
+                    $increase++;
+                    $tempDate = clone $this->currentDate;
+                    $tempDate->modify('+ ' . ($this->interval*$increase) . ' months');
+                } while ($tempDate->format('j') != $currentDayOfMonth);
+                $this->currentDate = $tempDate;
+            }
+            return;
+        }
+
+        while(true) {
+
+            $occurrences = $this->getMonthlyOccurrences();
+
+            foreach($occurrences as $occurrence) {
+
+                // The first occurrence thats higher than the current
+                // day of the month wins.
+                if ($occurrence > $currentDayOfMonth) {
+                    break 2;
+                }
+
+            }
+
+            // If we made it all the way here, it means there were no
+            // valid occurrences, and we need to advance to the next
+            // month.
+            //
+            // This line does not currently work in hhvm. Temporary workaround
+            // follows:
+            // $this->currentDate->modify('first day of this month');
+            $this->currentDate = new \DateTime($this->currentDate->format('Y-m-1 H:i:s'), $this->currentDate->getTimezone());
+            // end of workaround
+            $this->currentDate->modify('+ ' . $this->interval . ' months');
+
+            // This goes to 0 because we need to start counting at the
+            // beginning.
+            $currentDayOfMonth = 0;
+
+        }
+
+        $this->currentDate->setDate($this->currentDate->format('Y'), $this->currentDate->format('n'), $occurrence);
+
+    }
+
+    /**
+     * Does the processing for advancing the iterator for yearly frequency.
+     *
+     * @return void
+     */
+    protected function nextYearly() {
+
+        $currentMonth = $this->currentDate->format('n');
+        $currentYear = $this->currentDate->format('Y');
+        $currentDayOfMonth = $this->currentDate->format('j');
+
+        // No sub-rules, so we just advance by year
+        if (!$this->byMonth) {
+
+            // Unless it was a leap day!
+            if ($currentMonth==2 && $currentDayOfMonth==29) {
+
+                $counter = 0;
+                do {
+                    $counter++;
+                    // Here we increase the year count by the interval, until
+                    // we hit a date that's also in a leap year.
+                    //
+                    // We could just find the next interval that's dividable by
+                    // 4, but that would ignore the rule that there's no leap
+                    // year every year that's dividable by a 100, but not by
+                    // 400. (1800, 1900, 2100). So we just rely on the datetime
+                    // functions instead.
+                    $nextDate = clone $this->currentDate;
+                    $nextDate->modify('+ ' . ($this->interval*$counter) . ' years');
+                } while ($nextDate->format('n')!=2);
+                $this->currentDate = $nextDate;
+
+                return;
+
+            }
+
+            // The easiest form
+            $this->currentDate->modify('+' . $this->interval . ' years');
+            return;
+
+        }
+
+        $currentMonth = $this->currentDate->format('n');
+        $currentYear = $this->currentDate->format('Y');
+        $currentDayOfMonth = $this->currentDate->format('j');
+
+        $advancedToNewMonth = false;
+
+        // If we got a byDay or getMonthDay filter, we must first expand
+        // further.
+        if ($this->byDay || $this->byMonthDay) {
+
+            while(true) {
+
+                $occurrences = $this->getMonthlyOccurrences();
+
+                foreach($occurrences as $occurrence) {
+
+                    // The first occurrence that's higher than the current
+                    // day of the month wins.
+                    // If we advanced to the next month or year, the first
+                    // occurrence is always correct.
+                    if ($occurrence > $currentDayOfMonth || $advancedToNewMonth) {
+                        break 2;
+                    }
+
+                }
+
+                // If we made it here, it means we need to advance to
+                // the next month or year.
+                $currentDayOfMonth = 1;
+                $advancedToNewMonth = true;
+                do {
+
+                    $currentMonth++;
+                    if ($currentMonth>12) {
+                        $currentYear+=$this->interval;
+                        $currentMonth = 1;
+                    }
+                } while (!in_array($currentMonth, $this->byMonth));
+
+                $this->currentDate->setDate($currentYear, $currentMonth, $currentDayOfMonth);
+
+            }
+
+            // If we made it here, it means we got a valid occurrence
+            $this->currentDate->setDate($currentYear, $currentMonth, $occurrence);
+            return;
+
+        } else {
+
+            // These are the 'byMonth' rules, if there are no byDay or
+            // byMonthDay sub-rules.
+            do {
+
+                $currentMonth++;
+                if ($currentMonth>12) {
+                    $currentYear+=$this->interval;
+                    $currentMonth = 1;
+                }
+            } while (!in_array($currentMonth, $this->byMonth));
+            $this->currentDate->setDate($currentYear, $currentMonth, $currentDayOfMonth);
+
+            return;
+
+        }
+
+    }
+
+    /* }}} */
+
+    /**
+     * This method receives a string from an RRULE property, and populates this
+     * class with all the values.
+     *
+     * @param string|array $rrule
+     * @return void
+     */
+    protected function parseRRule($rrule) {
+
+        if (is_string($rrule)) {
+            $rrule = Property\ICalendar\Recur::stringToArray($rrule);
+        }
+
+        foreach($rrule as $key=>$value) {
+
+            $key = strtoupper($key);
+            switch($key) {
+
+                case 'FREQ' :
+                    $value = strtolower($value);
+                    if (!in_array(
+                        $value,
+                        array('secondly','minutely','hourly','daily','weekly','monthly','yearly')
+                    )) {
+                        throw new InvalidArgumentException('Unknown value for FREQ=' . strtoupper($value));
+                    }
+                    $this->frequency = $value;
+                    break;
+
+                case 'UNTIL' :
+                    $this->until = DateTimeParser::parse($value, $this->startDate->getTimezone());
+
+                    // In some cases events are generated with an UNTIL=
+                    // parameter before the actual start of the event.
+                    //
+                    // Not sure why this is happening. We assume that the
+                    // intention was that the event only recurs once.
+                    //
+                    // So we are modifying the parameter so our code doesn't
+                    // break.
+                    if($this->until < $this->startDate) {
+                        $this->until = $this->startDate;
+                    }
+                    break;
+
+                case 'INTERVAL' :
+                    // No break
+
+                case 'COUNT' :
+                    $val = (int)$value;
+                    if ($val < 1) {
+                        throw new \InvalidArgumentException(strtoupper($key) . ' in RRULE must be a positive integer!');
+                    }
+                    $key = strtolower($key);
+                    $this->$key = $val;
+                    break;
+
+                case 'BYSECOND' :
+                    $this->bySecond = (array)$value;
+                    break;
+
+                case 'BYMINUTE' :
+                    $this->byMinute = (array)$value;
+                    break;
+
+                case 'BYHOUR' :
+                    $this->byHour = (array)$value;
+                    break;
+
+                case 'BYDAY' :
+                    $value = (array)$value;
+                    foreach($value as $part) {
+                        if (!preg_match('#^  (-|\+)? ([1-5])? (MO|TU|WE|TH|FR|SA|SU) $# xi', $part)) {
+                            throw new \InvalidArgumentException('Invalid part in BYDAY clause: ' . $part);
+                        }
+                    }
+                    $this->byDay = $value;
+                    break;
+
+                case 'BYMONTHDAY' :
+                    $this->byMonthDay = (array)$value;
+                    break;
+
+                case 'BYYEARDAY' :
+                    $this->byYearDay = (array)$value;
+                    break;
+
+                case 'BYWEEKNO' :
+                    $this->byWeekNo = (array)$value;
+                    break;
+
+                case 'BYMONTH' :
+                    $this->byMonth = (array)$value;
+                    break;
+
+                case 'BYSETPOS' :
+                    $this->bySetPos = (array)$value;
+                    break;
+
+                case 'WKST' :
+                    $this->weekStart = strtoupper($value);
+                    break;
+
+                default:
+                    throw new \InvalidArgumentException('Not supported: ' . strtoupper($key));
+
+            }
+
+        }
+
+    }
+
+    /**
+     * Mappings between the day number and english day name.
+     *
+     * @var array
+     */
+    protected $dayNames = array(
+        0 => 'Sunday',
+        1 => 'Monday',
+        2 => 'Tuesday',
+        3 => 'Wednesday',
+        4 => 'Thursday',
+        5 => 'Friday',
+        6 => 'Saturday',
+    );
+
+    /**
+     * Returns all the occurrences for a monthly frequency with a 'byDay' or
+     * 'byMonthDay' expansion for the current month.
+     *
+     * The returned list is an array of integers with the day of month (1-31).
+     *
+     * @return array
+     */
+    protected function getMonthlyOccurrences() {
+
+        $startDate = clone $this->currentDate;
+
+        $byDayResults = array();
+
+        // Our strategy is to simply go through the byDays, advance the date to
+        // that point and add it to the results.
+        if ($this->byDay) foreach($this->byDay as $day) {
+
+            $dayName = $this->dayNames[$this->dayMap[substr($day,-2)]];
+
+
+            // Dayname will be something like 'wednesday'. Now we need to find
+            // all wednesdays in this month.
+            $dayHits = array();
+
+            // workaround for missing 'first day of the month' support in hhvm
+            $checkDate = new \DateTime($startDate->format('Y-m-1'));
+            // workaround modify always advancing the date even if the current day is a $dayName in hhvm
+            if ($checkDate->format('l') !== $dayName) {
+                $checkDate->modify($dayName);
+            }
+
+            do {
+                $dayHits[] = $checkDate->format('j');
+                $checkDate->modify('next ' . $dayName);
+            } while ($checkDate->format('n') === $startDate->format('n'));
+
+            // So now we have 'all wednesdays' for month. It is however
+            // possible that the user only really wanted the 1st, 2nd or last
+            // wednesday.
+            if (strlen($day)>2) {
+                $offset = (int)substr($day,0,-2);
+
+                if ($offset>0) {
+                    // It is possible that the day does not exist, such as a
+                    // 5th or 6th wednesday of the month.
+                    if (isset($dayHits[$offset-1])) {
+                        $byDayResults[] = $dayHits[$offset-1];
+                    }
+                } else {
+
+                    // if it was negative we count from the end of the array
+                    // might not exist, fx. -5th tuesday
+                    if (isset($dayHits[count($dayHits) + $offset])) {
+                        $byDayResults[] = $dayHits[count($dayHits) + $offset];
+                    }
+                }
+            } else {
+                // There was no counter (first, second, last wednesdays), so we
+                // just need to add the all to the list).
+                $byDayResults = array_merge($byDayResults, $dayHits);
+
+            }
+
+        }
+
+        $byMonthDayResults = array();
+        if ($this->byMonthDay) foreach($this->byMonthDay as $monthDay) {
+
+            // Removing values that are out of range for this month
+            if ($monthDay > $startDate->format('t') ||
+                $monthDay < 0-$startDate->format('t')) {
+                    continue;
+            }
+            if ($monthDay>0) {
+                $byMonthDayResults[] = $monthDay;
+            } else {
+                // Negative values
+                $byMonthDayResults[] = $startDate->format('t') + 1 + $monthDay;
+            }
+        }
+
+        // If there was just byDay or just byMonthDay, they just specify our
+        // (almost) final list. If both were provided, then byDay limits the
+        // list.
+        if ($this->byMonthDay && $this->byDay) {
+            $result = array_intersect($byMonthDayResults, $byDayResults);
+        } elseif ($this->byMonthDay) {
+            $result = $byMonthDayResults;
+        } else {
+            $result = $byDayResults;
+        }
+        $result = array_unique($result);
+        sort($result, SORT_NUMERIC);
+
+        // The last thing that needs checking is the BYSETPOS. If it's set, it
+        // means only certain items in the set survive the filter.
+        if (!$this->bySetPos) {
+            return $result;
+        }
+
+        $filteredResult = array();
+        foreach($this->bySetPos as $setPos) {
+
+            if ($setPos<0) {
+                $setPos = count($result)+($setPos+1);
+            }
+            if (isset($result[$setPos-1])) {
+                $filteredResult[] = $result[$setPos-1];
+            }
+        }
+
+        sort($filteredResult, SORT_NUMERIC);
+        return $filteredResult;
+
+    }
+
+    /**
+     * Simple mapping from iCalendar day names to day numbers
+     *
+     * @var array
+     */
+    protected $dayMap = array(
+        'SU' => 0,
+        'MO' => 1,
+        'TU' => 2,
+        'WE' => 3,
+        'TH' => 4,
+        'FR' => 5,
+        'SA' => 6,
+    );
+
+    protected function getHours()
+    {
+        $recurrenceHours = array();
+        foreach($this->byHour as $byHour) {
+            $recurrenceHours[] = $byHour;
+        }
+
+        return $recurrenceHours;
+    }
+
+    protected function getDays() {
+
+        $recurrenceDays = array();
+        foreach($this->byDay as $byDay) {
+
+            // The day may be preceeded with a positive (+n) or
+            // negative (-n) integer. However, this does not make
+            // sense in 'weekly' so we ignore it here.
+            $recurrenceDays[] = $this->dayMap[substr($byDay,-2)];
+
+        }
+
+        return $recurrenceDays;
+    }
+
+    protected function getMonths() {
+
+        $recurrenceMonths = array();
+        foreach($this->byMonth as $byMonth) {
+            $recurrenceMonths[] = $byMonth;
+        }
+
+        return $recurrenceMonths;
+    }
+}
diff --git a/vendor/sabre/vobject/lib/RecurrenceIterator.php b/vendor/sabre/vobject/lib/RecurrenceIterator.php
new file mode 100644
index 0000000000000000000000000000000000000000..3af86b0af432ee0bbd4b29a8f23e9a53d0edd250
--- /dev/null
+++ b/vendor/sabre/vobject/lib/RecurrenceIterator.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Sabre\VObject;
+
+use Sabre\VObject\Recur\EventIterator;
+
+/**
+ * RecurrenceIterator
+ *
+ * This class is deprecated. Use Sabre\VObject\Recur\EventIterator instead.
+ * This class will be removed from a future version.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @deprecated
+ * @license http://sabre.io/license Modified BSD License
+ */
+class RecurrenceIterator extends EventIterator {
+
+
+}
diff --git a/vendor/sabre/vobject/lib/Splitter/ICalendar.php b/vendor/sabre/vobject/lib/Splitter/ICalendar.php
new file mode 100644
index 0000000000000000000000000000000000000000..a39823a2baad72e6ca16d2bc92bf284181b53160
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Splitter/ICalendar.php
@@ -0,0 +1,116 @@
+<?php
+
+namespace Sabre\VObject\Splitter;
+
+use
+    Sabre\VObject,
+    Sabre\VObject\Component\VCalendar;
+
+/**
+ * Splitter
+ *
+ * This class is responsible for splitting up iCalendar objects.
+ *
+ * This class expects a single VCALENDAR object with one or more
+ * calendar-objects inside. Objects with identical UID's will be combined into
+ * a single object.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Dominik Tobschall
+ * @author Armin Hackmann
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class ICalendar implements SplitterInterface {
+
+    /**
+     * Timezones
+     *
+     * @var array
+     */
+    protected $vtimezones = array();
+
+    /**
+     * iCalendar objects
+     *
+     * @var array
+     */
+    protected $objects = array();
+
+    /**
+     * Constructor
+     *
+     * The splitter should receive an readable file stream as it's input.
+     *
+     * @param resource $input
+     * @param int $options Parser options, see the OPTIONS constants.
+     */
+    public function __construct($input, $options = 0) {
+
+        $data = VObject\Reader::read($input, $options);
+        $vtimezones = array();
+        $components = array();
+
+        if (!$data instanceof VObject\Component\VCalendar) {
+            throw new VObject\ParseException('Supplied input could not be parsed as VCALENDAR.');
+        }
+
+        foreach($data->children() as $component) {
+            if (!$component instanceof VObject\Component) {
+                continue;
+            }
+
+            // Get all timezones
+            if ($component->name === 'VTIMEZONE') {
+                $this->vtimezones[(string)$component->TZID] = $component;
+                continue;
+            }
+
+            // Get component UID for recurring Events search
+            if(!$component->UID) {
+                $component->UID = sha1(microtime()) . '-vobjectimport';
+            }
+            $uid = (string)$component->UID;
+
+            // Take care of recurring events
+            if (!array_key_exists($uid, $this->objects)) {
+                $this->objects[$uid] = new VCalendar();
+            }
+
+            $this->objects[$uid]->add(clone $component);
+        }
+
+    }
+
+    /**
+     * Every time getNext() is called, a new object will be parsed, until we
+     * hit the end of the stream.
+     *
+     * When the end is reached, null will be returned.
+     *
+     * @return Sabre\VObject\Component|null
+     */
+    public function getNext() {
+
+        if($object=array_shift($this->objects)) {
+
+            // create our baseobject
+            $object->version = '2.0';
+            $object->prodid = '-//Sabre//Sabre VObject ' . VObject\Version::VERSION . '//EN';
+            $object->calscale = 'GREGORIAN';
+
+            // add vtimezone information to obj (if we have it)
+            foreach ($this->vtimezones as $vtimezone) {
+                $object->add($vtimezone);
+            }
+
+            return $object;
+
+        } else {
+
+            return null;
+
+        }
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/Splitter/SplitterInterface.php b/vendor/sabre/vobject/lib/Splitter/SplitterInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..f50544ad7c220af779278c11783f3487d1d6f4f9
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Splitter/SplitterInterface.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Sabre\VObject\Splitter;
+
+/**
+ * VObject splitter
+ *
+ * The splitter is responsible for reading a large vCard or iCalendar object,
+ * and splitting it into multiple objects.
+ *
+ * This is for example for Card and CalDAV, which require every event and vcard
+ * to exist in their own objects, instead of one large one.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Dominik Tobschall
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+interface SplitterInterface {
+
+    /**
+     * Constructor
+     *
+     * The splitter should receive an readable file stream as it's input.
+     *
+     * @param resource $input
+     */
+    public function __construct($input);
+
+    /**
+     * Every time getNext() is called, a new object will be parsed, until we
+     * hit the end of the stream.
+     *
+     * When the end is reached, null will be returned.
+     *
+     * @return Sabre\VObject\Component|null
+     */
+    public function getNext();
+
+}
diff --git a/vendor/sabre/vobject/lib/Splitter/VCard.php b/vendor/sabre/vobject/lib/Splitter/VCard.php
new file mode 100644
index 0000000000000000000000000000000000000000..2d3e19aeb7d4d518a279e5a7a3978bcaa2798a63
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Splitter/VCard.php
@@ -0,0 +1,79 @@
+<?php
+
+namespace Sabre\VObject\Splitter;
+
+use
+    Sabre\VObject,
+    Sabre\VObject\Parser\MimeDir;
+
+/**
+ * Splitter
+ *
+ * This class is responsible for splitting up VCard objects.
+ *
+ * It is assumed that the input stream contains 1 or more VCARD objects. This
+ * class checks for BEGIN:VCARD and END:VCARD and parses each encountered
+ * component individually.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Dominik Tobschall
+ * @author Armin Hackmann
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class VCard implements SplitterInterface {
+
+    /**
+     * File handle
+     *
+     * @var resource
+     */
+    protected $input;
+
+    /**
+     * Persistent parser
+     *
+     * @var MimeDir
+     */
+    protected $parser;
+
+    /**
+     * Constructor
+     *
+     * The splitter should receive an readable file stream as it's input.
+     *
+     * @param resource $input
+     * @param int $options Parser options, see the OPTIONS constants.
+     */
+    public function __construct($input, $options = 0) {
+
+        $this->input = $input;
+        $this->parser = new MimeDir($input, $options);
+
+    }
+
+    /**
+     * Every time getNext() is called, a new object will be parsed, until we
+     * hit the end of the stream.
+     *
+     * When the end is reached, null will be returned.
+     *
+     * @return Sabre\VObject\Component|null
+     */
+    public function getNext() {
+
+        try {
+            $object = $this->parser->parse();
+
+            if (!$object instanceof VObject\Component\VCard) {
+                throw new VObject\ParseException('The supplied input contained non-VCARD data.');
+            }
+
+        } catch (VObject\EofException $e) {
+            return null;
+        }
+
+        return $object;
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/StringUtil.php b/vendor/sabre/vobject/lib/StringUtil.php
new file mode 100644
index 0000000000000000000000000000000000000000..1ecb6d1f5910ba1b59072cdc64e5f1729510a242
--- /dev/null
+++ b/vendor/sabre/vobject/lib/StringUtil.php
@@ -0,0 +1,65 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * Useful utilities for working with various strings.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class StringUtil {
+
+    /**
+     * Returns true or false depending on if a string is valid UTF-8
+     *
+     * @param string $str
+     * @return bool
+     */
+    static public function isUTF8($str) {
+
+        // Control characters
+        if (preg_match('%[\x00-\x08\x0B-\x0C\x0E\x0F]%', $str)) {
+            return false;
+        }
+
+        return (bool)preg_match('%%u', $str);
+
+    }
+
+    /**
+     * This method tries its best to convert the input string to UTF-8.
+     *
+     * Currently only ISO-5991-1 input and UTF-8 input is supported, but this
+     * may be expanded upon if we receive other examples.
+     *
+     * @param string $str
+     * @return string
+     */
+    static public function convertToUTF8($str) {
+
+        $encoding = mb_detect_encoding($str , array('UTF-8','ISO-8859-1', 'WINDOWS-1252'), true);
+
+        switch($encoding) {
+            case 'ISO-8859-1' :
+                $newStr = utf8_encode($str);
+                break;
+            /* Unreachable code. Not sure yet how we can improve this
+             * situation.
+            case 'WINDOWS-1252' :
+                $newStr = iconv('cp1252', 'UTF-8', $str);
+                break;
+             */
+            default :
+                 $newStr = $str;
+
+        }
+
+        // Removing any control characters
+        return (preg_replace('%(?:[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F])%', '', $newStr));
+
+    }
+
+}
+
diff --git a/vendor/sabre/vobject/lib/TimeZoneUtil.php b/vendor/sabre/vobject/lib/TimeZoneUtil.php
new file mode 100644
index 0000000000000000000000000000000000000000..97b9c9998304f4eb3bfb472b7015b8f94716899d
--- /dev/null
+++ b/vendor/sabre/vobject/lib/TimeZoneUtil.php
@@ -0,0 +1,265 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * Time zone name translation
+ *
+ * This file translates well-known time zone names into "Olson database" time zone names.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Frank Edelhaeuser (fedel@users.sourceforge.net)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class TimeZoneUtil {
+
+    public static $map = null;
+
+    /**
+     * List of microsoft exchange timezone ids.
+     *
+     * Source: http://msdn.microsoft.com/en-us/library/aa563018(loband).aspx
+     */
+    public static $microsoftExchangeMap = array(
+        0  => 'UTC',
+        31 => 'Africa/Casablanca',
+
+        // Insanely, id #2 is used for both Europe/Lisbon, and Europe/Sarajevo.
+        // I'm not even kidding.. We handle this special case in the
+        // getTimeZone method.
+        2  => 'Europe/Lisbon',
+        1  => 'Europe/London',
+        4  => 'Europe/Berlin',
+        6  => 'Europe/Prague',
+        3  => 'Europe/Paris',
+        69 => 'Africa/Luanda', // This was a best guess
+        7  => 'Europe/Athens',
+        5  => 'Europe/Bucharest',
+        49 => 'Africa/Cairo',
+        50 => 'Africa/Harare',
+        59 => 'Europe/Helsinki',
+        27 => 'Asia/Jerusalem',
+        26 => 'Asia/Baghdad',
+        74 => 'Asia/Kuwait',
+        51 => 'Europe/Moscow',
+        56 => 'Africa/Nairobi',
+        25 => 'Asia/Tehran',
+        24 => 'Asia/Muscat', // Best guess
+        54 => 'Asia/Baku',
+        48 => 'Asia/Kabul',
+        58 => 'Asia/Yekaterinburg',
+        47 => 'Asia/Karachi',
+        23 => 'Asia/Calcutta',
+        62 => 'Asia/Kathmandu',
+        46 => 'Asia/Almaty',
+        71 => 'Asia/Dhaka',
+        66 => 'Asia/Colombo',
+        61 => 'Asia/Rangoon',
+        22 => 'Asia/Bangkok',
+        64 => 'Asia/Krasnoyarsk',
+        45 => 'Asia/Shanghai',
+        63 => 'Asia/Irkutsk',
+        21 => 'Asia/Singapore',
+        73 => 'Australia/Perth',
+        75 => 'Asia/Taipei',
+        20 => 'Asia/Tokyo',
+        72 => 'Asia/Seoul',
+        70 => 'Asia/Yakutsk',
+        19 => 'Australia/Adelaide',
+        44 => 'Australia/Darwin',
+        18 => 'Australia/Brisbane',
+        76 => 'Australia/Sydney',
+        43 => 'Pacific/Guam',
+        42 => 'Australia/Hobart',
+        68 => 'Asia/Vladivostok',
+        41 => 'Asia/Magadan',
+        17 => 'Pacific/Auckland',
+        40 => 'Pacific/Fiji',
+        67 => 'Pacific/Tongatapu',
+        29 => 'Atlantic/Azores',
+        53 => 'Atlantic/Cape_Verde',
+        30 => 'America/Noronha',
+         8 => 'America/Sao_Paulo', // Best guess
+        32 => 'America/Argentina/Buenos_Aires',
+        60 => 'America/Godthab',
+        28 => 'America/St_Johns',
+         9 => 'America/Halifax',
+        33 => 'America/Caracas',
+        65 => 'America/Santiago',
+        35 => 'America/Bogota',
+        10 => 'America/New_York',
+        34 => 'America/Indiana/Indianapolis',
+        55 => 'America/Guatemala',
+        11 => 'America/Chicago',
+        37 => 'America/Mexico_City',
+        36 => 'America/Edmonton',
+        38 => 'America/Phoenix',
+        12 => 'America/Denver', // Best guess
+        13 => 'America/Los_Angeles', // Best guess
+        14 => 'America/Anchorage',
+        15 => 'Pacific/Honolulu',
+        16 => 'Pacific/Midway',
+        39 => 'Pacific/Kwajalein',
+    );
+
+    /**
+     * This method will try to find out the correct timezone for an iCalendar
+     * date-time value.
+     *
+     * You must pass the contents of the TZID parameter, as well as the full
+     * calendar.
+     *
+     * If the lookup fails, this method will return the default PHP timezone
+     * (as configured using date_default_timezone_set, or the date.timezone ini
+     * setting).
+     *
+     * Alternatively, if $failIfUncertain is set to true, it will throw an
+     * exception if we cannot accurately determine the timezone.
+     *
+     * @param string $tzid
+     * @param Sabre\VObject\Component $vcalendar
+     * @return DateTimeZone
+     */
+    static public function getTimeZone($tzid, Component $vcalendar = null, $failIfUncertain = false) {
+
+        // First we will just see if the tzid is a support timezone identifier.
+        //
+        // The only exception is if the timezone starts with (. This is to
+        // handle cases where certain microsoft products generate timezone
+        // identifiers that for instance look like:
+        //
+        // (GMT+01.00) Sarajevo/Warsaw/Zagreb
+        //
+        // Since PHP 5.5.10, the first bit will be used as the timezone and
+        // this method will return just GMT+01:00. This is wrong, because it
+        // doesn't take DST into account.
+        if ($tzid[0]!=='(') {
+
+            // PHP has a bug that logs PHP warnings even it shouldn't:
+            // https://bugs.php.net/bug.php?id=67881
+            //
+            // That's why we're checking if we'll be able to successfull instantiate
+            // \DateTimeZone() before doing so. Otherwise we could simply instantiate
+            // and catch the exception.
+            $tzIdentifiers = \DateTimeZone::listIdentifiers();
+
+            try {
+                if (
+                    (in_array($tzid, $tzIdentifiers)) ||
+                    (preg_match('/^GMT(\+|-)([0-9]{4})$/', $tzid, $matches)) ||
+                    (in_array($tzid, self::getIdentifiersBC()))
+                ) {
+                    return new \DateTimeZone($tzid);
+                }
+            } catch(\Exception $e) {
+            }
+
+        }
+
+        self::loadTzMaps();
+
+        // Next, we check if the tzid is somewhere in our tzid map.
+        if (isset(self::$map[$tzid])) {
+            return new \DateTimeZone(self::$map[$tzid]);
+        }
+
+        // Maybe the author was hyper-lazy and just included an offset. We
+        // support it, but we aren't happy about it.
+        if (preg_match('/^GMT(\+|-)([0-9]{4})$/', $tzid, $matches)) {
+
+            // Note that the path in the source will never be taken from PHP 5.5.10
+            // onwards. PHP 5.5.10 supports the "GMT+0100" style of format, so it
+            // already gets returned early in this function. Once we drop support
+            // for versions under PHP 5.5.10, this bit can be taken out of the
+            // source.
+            // @codeCoverageIgnoreStart
+            return new \DateTimeZone('Etc/GMT' . $matches[1] . ltrim(substr($matches[2],0,2),'0'));
+            // @codeCoverageIgnoreEnd
+        }
+
+        if ($vcalendar) {
+
+            // If that didn't work, we will scan VTIMEZONE objects
+            foreach($vcalendar->select('VTIMEZONE') as $vtimezone) {
+
+                if ((string)$vtimezone->TZID === $tzid) {
+
+                    // Some clients add 'X-LIC-LOCATION' with the olson name.
+                    if (isset($vtimezone->{'X-LIC-LOCATION'})) {
+
+                        $lic = (string)$vtimezone->{'X-LIC-LOCATION'};
+
+                        // Libical generators may specify strings like
+                        // "SystemV/EST5EDT". For those we must remove the
+                        // SystemV part.
+                        if (substr($lic,0,8)==='SystemV/') {
+                            $lic = substr($lic,8);
+                        }
+
+                        return self::getTimeZone($lic, null, $failIfUncertain);
+
+                    }
+                    // Microsoft may add a magic number, which we also have an
+                    // answer for.
+                    if (isset($vtimezone->{'X-MICROSOFT-CDO-TZID'})) {
+                        $cdoId = (int)$vtimezone->{'X-MICROSOFT-CDO-TZID'}->getValue();
+
+                        // 2 can mean both Europe/Lisbon and Europe/Sarajevo.
+                        if ($cdoId===2 && strpos((string)$vtimezone->TZID, 'Sarajevo')!==false) {
+                            return new \DateTimeZone('Europe/Sarajevo');
+                        }
+
+                        if (isset(self::$microsoftExchangeMap[$cdoId])) {
+                            return new \DateTimeZone(self::$microsoftExchangeMap[$cdoId]);
+                        }
+                    }
+
+                }
+
+            }
+
+        }
+
+        if ($failIfUncertain) {
+            throw new \InvalidArgumentException('We were unable to determine the correct PHP timezone for tzid: ' . $tzid);
+        }
+
+        // If we got all the way here, we default to UTC.
+        return new \DateTimeZone(date_default_timezone_get());
+
+    }
+
+    /**
+     * This method will load in all the tz mapping information, if it's not yet
+     * done.
+     */
+    static public function loadTzMaps() {
+
+        if (!is_null(self::$map)) return;
+
+        self::$map = array_merge(
+            include __DIR__ .  '/timezonedata/windowszones.php',
+            include __DIR__ .  '/timezonedata/lotuszones.php',
+            include __DIR__ .  '/timezonedata/exchangezones.php',
+            include __DIR__ .  '/timezonedata/php-workaround.php'
+        );
+
+    }
+
+    /**
+     * This method returns an array of timezone identifiers, that are supported
+     * by DateTimeZone(), but not returned by DateTimeZone::listIdentifiers()
+     *
+     * We're not using DateTimeZone::listIdentifiers(DateTimeZone::ALL_WITH_BC) because:
+     * - It's not supported by some PHP versions as well as HHVM.
+     * - It also returns identifiers, that are invalid values for new DateTimeZone() on some PHP versions.
+     * (See timezonedata/php-bc.php and timezonedata php-workaround.php)
+     *
+     * @return array
+     */
+    static public function getIdentifiersBC() {
+        return include __DIR__ .  '/timezonedata/php-bc.php';
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/UUIDUtil.php b/vendor/sabre/vobject/lib/UUIDUtil.php
new file mode 100644
index 0000000000000000000000000000000000000000..dbeaf7777f4119362a335a1edb105eb720f41e3a
--- /dev/null
+++ b/vendor/sabre/vobject/lib/UUIDUtil.php
@@ -0,0 +1,67 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * UUID Utility
+ *
+ * This class has static methods to generate and validate UUID's.
+ * UUIDs are used a decent amount within various *DAV standards, so it made
+ * sense to include it.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class UUIDUtil {
+
+    /**
+     * Returns a pseudo-random v4 UUID
+     *
+     * This function is based on a comment by Andrew Moore on php.net
+     *
+     * @see http://www.php.net/manual/en/function.uniqid.php#94959
+     * @return string
+     */
+    static public function getUUID() {
+
+        return sprintf(
+
+            '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
+
+            // 32 bits for "time_low"
+            mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),
+
+            // 16 bits for "time_mid"
+            mt_rand( 0, 0xffff ),
+
+            // 16 bits for "time_hi_and_version",
+            // four most significant bits holds version number 4
+            mt_rand( 0, 0x0fff ) | 0x4000,
+
+            // 16 bits, 8 bits for "clk_seq_hi_res",
+            // 8 bits for "clk_seq_low",
+            // two most significant bits holds zero and one for variant DCE1.1
+            mt_rand( 0, 0x3fff ) | 0x8000,
+
+            // 48 bits for "node"
+            mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff )
+        );
+    }
+
+    /**
+     * Checks if a string is a valid UUID.
+     *
+     * @param string $uuid
+     * @return bool
+     */
+    static public function validateUUID($uuid) {
+
+        return preg_match(
+            '/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i',
+            $uuid
+        ) == true;
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/lib/VCardConverter.php b/vendor/sabre/vobject/lib/VCardConverter.php
new file mode 100644
index 0000000000000000000000000000000000000000..24ac66bf32228d4fdd9faba64afcfb5a4955d8f2
--- /dev/null
+++ b/vendor/sabre/vobject/lib/VCardConverter.php
@@ -0,0 +1,459 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * This utility converts vcards from one version to another.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class VCardConverter {
+
+    /**
+     * Converts a vCard object to a new version.
+     *
+     * targetVersion must be one of:
+     *   Document::VCARD21
+     *   Document::VCARD30
+     *   Document::VCARD40
+     *
+     * Currently only 3.0 and 4.0 as input and output versions.
+     *
+     * 2.1 has some minor support for the input version, it's incomplete at the
+     * moment though.
+     *
+     * If input and output version are identical, a clone is returned.
+     *
+     * @param Component\VCard $input
+     * @param int $targetVersion
+     */
+    public function convert(Component\VCard $input, $targetVersion) {
+
+        $inputVersion = $input->getDocumentType();
+        if ($inputVersion===$targetVersion) {
+            return clone $input;
+        }
+
+        if (!in_array($inputVersion, array(Document::VCARD21, Document::VCARD30, Document::VCARD40))) {
+            throw new \InvalidArgumentException('Only vCard 2.1, 3.0 and 4.0 are supported for the input data');
+        }
+        if (!in_array($targetVersion, array(Document::VCARD30, Document::VCARD40))) {
+            throw new \InvalidArgumentException('You can only use vCard 3.0 or 4.0 for the target version');
+        }
+
+        $newVersion = $targetVersion===Document::VCARD40?'4.0':'3.0';
+
+        $output = new Component\VCard(array(
+            'VERSION' => $newVersion,
+        ));
+
+        foreach($input->children as $property) {
+
+            $this->convertProperty($input, $output, $property, $targetVersion);
+
+        }
+
+        return $output;
+
+    }
+
+    /**
+     * Handles conversion of a single property.
+     *
+     * @param Component\VCard $input
+     * @param Component\VCard $output
+     * @param Property $property
+     * @param int $targetVersion
+     * @return void
+     */
+    protected function convertProperty(Component\VCard $input, Component\VCard $output, Property $property, $targetVersion) {
+
+        // Skipping these, those are automatically added.
+        if (in_array($property->name, array('VERSION', 'PRODID'))) {
+            return;
+        }
+
+        $parameters = $property->parameters();
+        $valueType = null;
+        if (isset($parameters['VALUE'])) {
+            $valueType = $parameters['VALUE']->getValue();
+            unset($parameters['VALUE']);
+        }
+        if (!$valueType) {
+            $valueType = $property->getValueType();
+        }
+        $newProperty = $output->createProperty(
+            $property->name,
+            $property->getParts(),
+            array(), // parameters will get added a bit later.
+            $valueType
+        );
+
+
+        if ($targetVersion===Document::VCARD30) {
+
+            if ($property instanceof Property\Uri && in_array($property->name, array('PHOTO','LOGO','SOUND'))) {
+
+                $newProperty = $this->convertUriToBinary($output, $newProperty);
+
+            } elseif ($property instanceof Property\VCard\DateAndOrTime) {
+
+                // In vCard 4, the birth year may be optional. This is not the
+                // case for vCard 3. Apple has a workaround for this that
+                // allows applications that support Apple's extension still
+                // omit birthyears in vCard 3, but applications that do not
+                // support this, will just use a random birthyear. We're
+                // choosing 1604 for the birthyear, because that's what apple
+                // uses.
+                $parts = DateTimeParser::parseVCardDateTime($property->getValue());
+                if (is_null($parts['year'])) {
+                    $newValue = '1604-' . $parts['month'] . '-' . $parts['date'];
+                    $newProperty->setValue($newValue);
+                    $newProperty['X-APPLE-OMIT-YEAR'] = '1604';
+                }
+
+                if ($newProperty->name == 'ANNIVERSARY') {
+                    // Microsoft non-standard anniversary
+                    $newProperty->name = 'X-ANNIVERSARY';
+
+                    // We also need to add a new apple property for the same
+                    // purpose. This apple property needs a 'label' in the same
+                    // group, so we first need to find a groupname that doesn't
+                    // exist yet.
+                    $x = 1;
+                    while($output->select('ITEM' . $x . '.')) {
+                        $x++;
+                    }
+                    $output->add('ITEM' . $x . '.X-ABDATE', $newProperty->getValue(), array('VALUE' => 'DATE-AND-OR-TIME'));
+                    $output->add('ITEM' . $x . '.X-ABLABEL', '_$!<Anniversary>!$_');
+                }
+
+            } elseif ($property->name === 'KIND') {
+
+                switch(strtolower($property->getValue())) {
+                    case 'org' :
+                        // vCard 3.0 does not have an equivalent to KIND:ORG,
+                        // but apple has an extension that means the same
+                        // thing.
+                        $newProperty = $output->createProperty('X-ABSHOWAS','COMPANY');
+                        break;
+
+                    case 'individual' :
+                        // Individual is implicit, so we skip it.
+                        return;
+
+                    case 'group' :
+                        // OS X addressbook property
+                        $newProperty = $output->createProperty('X-ADDRESSBOOKSERVER-KIND','GROUP');
+                        break;
+                }
+
+
+            }
+
+        } elseif ($targetVersion===Document::VCARD40) {
+
+            // These properties were removed in vCard 4.0
+            if (in_array($property->name, array('NAME', 'MAILER', 'LABEL', 'CLASS'))) {
+                return;
+            }
+
+            if ($property instanceof Property\Binary) {
+
+                $newProperty = $this->convertBinaryToUri($output, $newProperty, $parameters);
+
+            } elseif ($property instanceof Property\VCard\DateAndOrTime && isset($parameters['X-APPLE-OMIT-YEAR'])) {
+
+                // If a property such as BDAY contained 'X-APPLE-OMIT-YEAR',
+                // then we're stripping the year from the vcard 4 value.
+                $parts = DateTimeParser::parseVCardDateTime($property->getValue());
+                if ($parts['year']===$property['X-APPLE-OMIT-YEAR']->getValue()) {
+                    $newValue = '--' . $parts['month'] . '-' . $parts['date'];
+                    $newProperty->setValue($newValue);
+                }
+
+                // Regardless if the year matched or not, we do need to strip
+                // X-APPLE-OMIT-YEAR.
+                unset($parameters['X-APPLE-OMIT-YEAR']);
+
+            }
+            switch($property->name) {
+                case 'X-ABSHOWAS' :
+                    if (strtoupper($property->getValue()) === 'COMPANY') {
+                        $newProperty = $output->createProperty('KIND','ORG');
+                    }
+                    break;
+                case 'X-ADDRESSBOOKSERVER-KIND' :
+                    if (strtoupper($property->getValue()) === 'GROUP') {
+                        $newProperty = $output->createProperty('KIND','GROUP');
+                    }
+                    break;
+                case 'X-ANNIVERSARY' :
+                    $newProperty->name = 'ANNIVERSARY';
+                    // If we already have an anniversary property with the same
+                    // value, ignore.
+                    foreach ($output->select('ANNIVERSARY') as $anniversary) {
+                        if ($anniversary->getValue() === $newProperty->getValue()) {
+                            return;
+                        }
+                    }
+                    break;
+                case 'X-ABDATE' :
+                    // Find out what the label was, if it exists.
+                    if (!$property->group) {
+                        break;
+                    }
+                    $label = $input->{$property->group . '.X-ABLABEL'};
+
+                    // We only support converting anniversaries.
+                    if (!$label || $label->getValue()!=='_$!<Anniversary>!$_') {
+                        break;
+                    }
+
+                    // If we already have an anniversary property with the same
+                    // value, ignore.
+                    foreach ($output->select('ANNIVERSARY') as $anniversary) {
+                        if ($anniversary->getValue() === $newProperty->getValue()) {
+                            return;
+                        }
+                    }
+                    $newProperty->name = 'ANNIVERSARY';
+                    break;
+                // Apple's per-property label system.
+                case 'X-ABLABEL' :
+                    if($newProperty->getValue() === '_$!<Anniversary>!$_') {
+                        // We can safely remove these, as they are converted to
+                        // ANNIVERSARY properties.
+                        return;
+                    }
+                    break;
+
+            }
+
+        }
+
+        // set property group
+        $newProperty->group = $property->group;
+
+        if ($targetVersion===Document::VCARD40) {
+            $this->convertParameters40($newProperty, $parameters);
+        } else {
+            $this->convertParameters30($newProperty, $parameters);
+        }
+
+        // Lastly, we need to see if there's a need for a VALUE parameter.
+        //
+        // We can do that by instantating a empty property with that name, and
+        // seeing if the default valueType is identical to the current one.
+        $tempProperty = $output->createProperty($newProperty->name);
+        if ($tempProperty->getValueType() !== $newProperty->getValueType()) {
+            $newProperty['VALUE'] = $newProperty->getValueType();
+        }
+
+        $output->add($newProperty);
+
+
+    }
+
+    /**
+     * Converts a BINARY property to a URI property.
+     *
+     * vCard 4.0 no longer supports BINARY properties.
+     *
+     * @param Component\VCard $output
+     * @param Property\Uri $property The input property.
+     * @param $parameters List of parameters that will eventually be added to
+     *                    the new property.
+     * @return Property\Uri
+     */
+    protected function convertBinaryToUri(Component\VCard $output, Property\Binary $newProperty, array &$parameters) {
+
+        $value = $newProperty->getValue();
+        $newProperty = $output->createProperty(
+            $newProperty->name,
+            null, // no value
+            array(), // no parameters yet
+            'URI' // Forcing the BINARY type
+        );
+
+        $mimeType = 'application/octet-stream';
+
+        // See if we can find a better mimetype.
+        if (isset($parameters['TYPE'])) {
+
+            $newTypes = array();
+            foreach($parameters['TYPE']->getParts() as $typePart) {
+                if (in_array(
+                    strtoupper($typePart),
+                    array('JPEG','PNG','GIF')
+                )) {
+                    $mimeType = 'image/' . strtolower($typePart);
+                } else {
+                    $newTypes[] = $typePart;
+                }
+            }
+
+            // If there were any parameters we're not converting to a
+            // mime-type, we need to keep them.
+            if ($newTypes) {
+                $parameters['TYPE']->setParts($newTypes);
+            } else {
+                unset($parameters['TYPE']);
+            }
+
+        }
+
+        $newProperty->setValue('data:' . $mimeType . ';base64,' . base64_encode($value));
+        return $newProperty;
+
+    }
+
+    /**
+     * Converts a URI property to a BINARY property.
+     *
+     * In vCard 4.0 attachments are encoded as data: uri. Even though these may
+     * be valid in vCard 3.0 as well, we should convert those to BINARY if
+     * possible, to improve compatibility.
+     *
+     * @param Component\VCard $output
+     * @param Property\Uri $property The input property.
+     * @return Property\Binary|null
+     */
+    protected function convertUriToBinary(Component\VCard $output, Property\Uri $newProperty) {
+
+        $value = $newProperty->getValue();
+
+        // Only converting data: uris
+        if (substr($value, 0, 5)!=='data:') {
+            return $newProperty;
+        }
+
+        $newProperty = $output->createProperty(
+            $newProperty->name,
+            null, // no value
+            array(), // no parameters yet
+            'BINARY'
+        );
+
+        $mimeType = substr($value, 5, strpos($value, ',')-5);
+        if (strpos($mimeType, ';')) {
+            $mimeType = substr($mimeType,0,strpos($mimeType, ';'));
+            $newProperty->setValue(base64_decode(substr($value, strpos($value,',')+1)));
+        } else {
+            $newProperty->setValue(substr($value, strpos($value,',')+1));
+        }
+        unset($value);
+
+        $newProperty['ENCODING'] = 'b';
+        switch($mimeType) {
+
+            case 'image/jpeg' :
+                $newProperty['TYPE'] = 'JPEG';
+                break;
+            case 'image/png' :
+                $newProperty['TYPE'] = 'PNG';
+                break;
+            case 'image/gif' :
+                $newProperty['TYPE'] = 'GIF';
+                break;
+
+        }
+
+
+        return $newProperty;
+
+    }
+
+    /**
+     * Adds parameters to a new property for vCard 4.0
+     *
+     * @param Property $newProperty
+     * @param array $parameters
+     * @return void
+     */
+    protected function convertParameters40(Property $newProperty, array $parameters) {
+
+        // Adding all parameters.
+        foreach($parameters as $param) {
+
+            // vCard 2.1 allowed parameters with no name
+            if ($param->noName) $param->noName = false;
+
+            switch($param->name) {
+
+                // We need to see if there's any TYPE=PREF, because in vCard 4
+                // that's now PREF=1.
+                case 'TYPE' :
+                    foreach($param->getParts() as $paramPart) {
+
+                        if (strtoupper($paramPart)==='PREF') {
+                            $newProperty->add('PREF','1');
+                        } else {
+                            $newProperty->add($param->name, $paramPart);
+                        }
+
+                    }
+                    break;
+                // These no longer exist in vCard 4
+                case 'ENCODING' :
+                case 'CHARSET' :
+                    break;
+
+                default :
+                    $newProperty->add($param->name, $param->getParts());
+                    break;
+
+            }
+
+        }
+
+    }
+
+    /**
+     * Adds parameters to a new property for vCard 3.0
+     *
+     * @param Property $newProperty
+     * @param array $parameters
+     * @return void
+     */
+    protected function convertParameters30(Property $newProperty, array $parameters) {
+
+        // Adding all parameters.
+        foreach($parameters as $param) {
+
+            // vCard 2.1 allowed parameters with no name
+            if ($param->noName) $param->noName = false;
+
+            switch($param->name) {
+
+                case 'ENCODING' :
+                    // This value only existed in vCard 2.1, and should be
+                    // removed for anything else.
+                    if (strtoupper($param->getValue())!=='QUOTED-PRINTABLE') {
+                        $newProperty->add($param->name, $param->getParts());
+                    }
+                    break;
+
+                /*
+                 * Converting PREF=1 to TYPE=PREF.
+                 *
+                 * Any other PREF numbers we'll drop.
+                 */
+                case 'PREF' :
+                    if ($param->getValue()=='1') {
+                        $newProperty->add('TYPE','PREF');
+                    }
+                    break;
+
+                default :
+                    $newProperty->add($param->name, $param->getParts());
+                    break;
+
+            }
+
+        }
+
+    }
+}
diff --git a/vendor/sabre/vobject/lib/Version.php b/vendor/sabre/vobject/lib/Version.php
new file mode 100644
index 0000000000000000000000000000000000000000..e8915872020c8d5ac2b7eb95a3342e848c5759a2
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Version.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * This class contains the version number for the VObject package
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+class Version {
+
+    /**
+     * Full version number
+     */
+    const VERSION = '3.5.3';
+
+}
diff --git a/vendor/sabre/vobject/lib/timezonedata/exchangezones.php b/vendor/sabre/vobject/lib/timezonedata/exchangezones.php
new file mode 100644
index 0000000000000000000000000000000000000000..9ff1d08bc82403f60a89fb651315dbfc4b957e4e
--- /dev/null
+++ b/vendor/sabre/vobject/lib/timezonedata/exchangezones.php
@@ -0,0 +1,93 @@
+<?php
+
+/**
+ * Microsoft exchange timezones
+ * Source:
+ * http://msdn.microsoft.com/en-us/library/ms988620%28v=exchg.65%29.aspx
+ *
+ * Correct timezones deduced with help from:
+ * http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+return array(
+    'Universal Coordinated Time' => 'UTC',
+    'Casablanca, Monrovia' => 'Africa/Casablanca',
+    'Greenwich Mean Time: Dublin, Edinburgh, Lisbon, London' => 'Europe/Lisbon',
+    'Greenwich Mean Time; Dublin, Edinburgh, London' =>  'Europe/London',
+    'Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna' => 'Europe/Berlin',
+    'Belgrade, Pozsony, Budapest, Ljubljana, Prague' => 'Europe/Prague',
+    'Brussels, Copenhagen, Madrid, Paris' => 'Europe/Paris',
+    'Paris, Madrid, Brussels, Copenhagen' => 'Europe/Paris',
+    'Prague, Central Europe' => 'Europe/Prague',
+    'Sarajevo, Skopje, Sofija, Vilnius, Warsaw, Zagreb' => 'Europe/Sarajevo',
+    'West Central Africa' => 'Africa/Luanda', // This was a best guess
+    'Athens, Istanbul, Minsk' => 'Europe/Athens',
+    'Bucharest' => 'Europe/Bucharest',
+    'Cairo' => 'Africa/Cairo',
+    'Harare, Pretoria' => 'Africa/Harare',
+    'Helsinki, Riga, Tallinn' => 'Europe/Helsinki',
+    'Israel, Jerusalem Standard Time' => 'Asia/Jerusalem',
+    'Baghdad' => 'Asia/Baghdad',
+    'Arab, Kuwait, Riyadh' => 'Asia/Kuwait',
+    'Moscow, St. Petersburg, Volgograd' => 'Europe/Moscow',
+    'East Africa, Nairobi' => 'Africa/Nairobi',
+    'Tehran' => 'Asia/Tehran',
+    'Abu Dhabi, Muscat' => 'Asia/Muscat', // Best guess
+    'Baku, Tbilisi, Yerevan' => 'Asia/Baku',
+    'Kabul' => 'Asia/Kabul',
+    'Ekaterinburg' => 'Asia/Yekaterinburg',
+    'Islamabad, Karachi, Tashkent' => 'Asia/Karachi',
+    'Kolkata, Chennai, Mumbai, New Delhi, India Standard Time' => 'Asia/Calcutta',
+    'Kathmandu, Nepal' => 'Asia/Kathmandu',
+    'Almaty, Novosibirsk, North Central Asia' => 'Asia/Almaty',
+    'Astana, Dhaka' => 'Asia/Dhaka',
+    'Sri Jayawardenepura, Sri Lanka' => 'Asia/Colombo',
+    'Rangoon' => 'Asia/Rangoon',
+    'Bangkok, Hanoi, Jakarta' => 'Asia/Bangkok',
+    'Krasnoyarsk' => 'Asia/Krasnoyarsk',
+    'Beijing, Chongqing, Hong Kong SAR, Urumqi' => 'Asia/Shanghai',
+    'Irkutsk, Ulaan Bataar' => 'Asia/Irkutsk',
+    'Kuala Lumpur, Singapore' => 'Asia/Singapore',
+    'Perth, Western Australia' => 'Australia/Perth',
+    'Taipei' => 'Asia/Taipei',
+    'Osaka, Sapporo, Tokyo' => 'Asia/Tokyo',
+    'Seoul, Korea Standard time' => 'Asia/Seoul',
+    'Yakutsk' => 'Asia/Yakutsk',
+    'Adelaide, Central Australia' => 'Australia/Adelaide',
+    'Darwin' => 'Australia/Darwin',
+    'Brisbane, East Australia' => 'Australia/Brisbane',
+    'Canberra, Melbourne, Sydney, Hobart (year 2000 only)' => 'Australia/Sydney',
+    'Guam, Port Moresby' => 'Pacific/Guam',
+    'Hobart, Tasmania' => 'Australia/Hobart',
+    'Vladivostok' => 'Asia/Vladivostok',
+    'Magadan, Solomon Is., New Caledonia' => 'Asia/Magadan',
+    'Auckland, Wellington' => 'Pacific/Auckland',
+    'Fiji Islands, Kamchatka, Marshall Is.' => 'Pacific/Fiji',
+    'Nuku\'alofa, Tonga' => 'Pacific/Tongatapu',
+    'Azores' => 'Atlantic/Azores',
+    'Cape Verde Is.' => 'Atlantic/Cape_Verde',
+    'Mid-Atlantic' => 'America/Noronha',
+    'Brasilia' => 'America/Sao_Paulo', // Best guess
+    'Buenos Aires' => 'America/Argentina/Buenos_Aires',
+    'Greenland' => 'America/Godthab',
+    'Newfoundland' => 'America/St_Johns',
+    'Atlantic Time (Canada)' => 'America/Halifax',
+    'Caracas, La Paz' => 'America/Caracas',
+    'Santiago' => 'America/Santiago',
+    'Bogota, Lima, Quito' => 'America/Bogota',
+    'Eastern Time (US & Canada)' => 'America/New_York',
+    'Indiana (East)' => 'America/Indiana/Indianapolis',
+    'Central America' => 'America/Guatemala',
+    'Central Time (US & Canada)' => 'America/Chicago',
+    'Mexico City, Tegucigalpa' => 'America/Mexico_City',
+    'Saskatchewan' => 'America/Edmonton',
+    'Arizona' => 'America/Phoenix',
+    'Mountain Time (US & Canada)' => 'America/Denver', // Best guess
+    'Pacific Time (US & Canada); Tijuana' => 'America/Los_Angeles', // Best guess
+    'Alaska' => 'America/Anchorage',
+    'Hawaii' => 'Pacific/Honolulu',
+    'Midway Island, Samoa' => 'Pacific/Midway',
+    'Eniwetok, Kwajalein, Dateline Time' => 'Pacific/Kwajalein',
+);
diff --git a/vendor/sabre/vobject/lib/timezonedata/lotuszones.php b/vendor/sabre/vobject/lib/timezonedata/lotuszones.php
new file mode 100644
index 0000000000000000000000000000000000000000..19b79f9082042f212568a17c52cc0c6ca9dbcc6b
--- /dev/null
+++ b/vendor/sabre/vobject/lib/timezonedata/lotuszones.php
@@ -0,0 +1,101 @@
+<?php
+
+/**
+ * The following list are timezone names that could be generated by
+ * Lotus / Domino
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+return array(
+    'Dateline'               => 'Etc/GMT-12',
+    'Samoa'                  => 'Pacific/Apia',
+    'Hawaiian'               => 'Pacific/Honolulu',
+    'Alaskan'                => 'America/Anchorage',
+    'Pacific'                => 'America/Los_Angeles',
+    'Pacific Standard Time'  => 'America/Los_Angeles',
+    'Mexico Standard Time 2' => 'America/Chihuahua',
+    'Mountain'               => 'America/Denver',
+    // 'Mountain Standard Time' => 'America/Chihuahua', // conflict with windows timezones.
+    'US Mountain'            => 'America/Phoenix',
+    'Canada Central'         => 'America/Edmonton',
+    'Central America'        => 'America/Guatemala',
+    'Central'                => 'America/Chicago',
+    // 'Central Standard Time'  => 'America/Mexico_City', // conflict with windows timezones.
+    'Mexico'                 => 'America/Mexico_City',
+    'Eastern'                => 'America/New_York',
+    'SA Pacific'             => 'America/Bogota',
+    'US Eastern'             => 'America/Indiana/Indianapolis',
+    'Venezuela'              => 'America/Caracas',
+    'Atlantic'               => 'America/Halifax',
+    'Central Brazilian'      => 'America/Manaus',
+    'Pacific SA'             => 'America/Santiago',
+    'SA Western'             => 'America/La_Paz',
+    'Newfoundland'           => 'America/St_Johns',
+    'Argentina'              => 'America/Argentina/Buenos_Aires',
+    'E. South America'       => 'America/Belem',
+    'Greenland'              => 'America/Godthab',
+    'Montevideo'             => 'America/Montevideo',
+    'SA Eastern'             => 'America/Belem',
+    // 'Mid-Atlantic'           => 'Etc/GMT-2', // conflict with windows timezones.
+    'Azores'                 => 'Atlantic/Azores',
+    'Cape Verde'             => 'Atlantic/Cape_Verde',
+    'Greenwich'              => 'Atlantic/Reykjavik', // No I'm serious.. Greenwich is not GMT.
+    'Morocco'                => 'Africa/Casablanca',
+    'Central Europe'         => 'Europe/Prague',
+    'Central European'       => 'Europe/Sarajevo',
+    'Romance'                => 'Europe/Paris',
+    'W. Central Africa'      => 'Africa/Lagos', // Best guess
+    'W. Europe'              => 'Europe/Amsterdam',
+    'E. Europe'              => 'Europe/Minsk',
+    'Egypt'                  => 'Africa/Cairo',
+    'FLE'                    => 'Europe/Helsinki',
+    'GTB'                    => 'Europe/Athens',
+    'Israel'                 => 'Asia/Jerusalem',
+    'Jordan'                 => 'Asia/Amman',
+    'Middle East'            => 'Asia/Beirut',
+    'Namibia'                => 'Africa/Windhoek',
+    'South Africa'           => 'Africa/Harare',
+    'Arab'                   => 'Asia/Kuwait',
+    'Arabic'                 => 'Asia/Baghdad',
+    'E. Africa'              => 'Africa/Nairobi',
+    'Georgian'               => 'Asia/Tbilisi',
+    'Russian'                => 'Europe/Moscow',
+    'Iran'                   => 'Asia/Tehran',
+    'Arabian'                => 'Asia/Muscat',
+    'Armenian'               => 'Asia/Yerevan',
+    'Azerbijan'              => 'Asia/Baku',
+    'Caucasus'               => 'Asia/Yerevan',
+    'Mauritius'              => 'Indian/Mauritius',
+    'Afghanistan'            => 'Asia/Kabul',
+    'Ekaterinburg'           => 'Asia/Yekaterinburg',
+    'Pakistan'               => 'Asia/Karachi',
+    'West Asia'              => 'Asia/Tashkent',
+    'India'                  => 'Asia/Calcutta',
+    'Sri Lanka'              => 'Asia/Colombo',
+    'Nepal'                  => 'Asia/Kathmandu',
+    'Central Asia'           => 'Asia/Dhaka',
+    'N. Central Asia'        => 'Asia/Almaty',
+    'Myanmar'                => 'Asia/Rangoon',
+    'North Asia'             => 'Asia/Krasnoyarsk',
+    'SE Asia'                => 'Asia/Bangkok',
+    'China'                  => 'Asia/Shanghai',
+    'North Asia East'        => 'Asia/Irkutsk',
+    'Singapore'              => 'Asia/Singapore',
+    'Taipei'                 => 'Asia/Taipei',
+    'W. Australia'           => 'Australia/Perth',
+    'Korea'                  => 'Asia/Seoul',
+    'Tokyo'                  => 'Asia/Tokyo',
+    'Yakutsk'                => 'Asia/Yakutsk',
+    'AUS Central'            => 'Australia/Darwin',
+    'Cen. Australia'         => 'Australia/Adelaide',
+    'AUS Eastern'            => 'Australia/Sydney',
+    'E. Australia'           => 'Australia/Brisbane',
+    'Tasmania'               => 'Australia/Hobart',
+    'Vladivostok'            => 'Asia/Vladivostok',
+    'West Pacific'           => 'Pacific/Guam',
+    'Central Pacific'        => 'Asia/Magadan',
+    'Fiji'                   => 'Pacific/Fiji',
+    'New Zealand'            => 'Pacific/Auckland',
+    'Tonga'                  => 'Pacific/Tongatapu',
+);
diff --git a/vendor/sabre/vobject/lib/timezonedata/php-bc.php b/vendor/sabre/vobject/lib/timezonedata/php-bc.php
new file mode 100644
index 0000000000000000000000000000000000000000..e9506cfb3c5f2692a995ddc4d270a4741012eb89
--- /dev/null
+++ b/vendor/sabre/vobject/lib/timezonedata/php-bc.php
@@ -0,0 +1,153 @@
+<?php
+/**
+ * A list of additional PHP timezones that are returned by
+ * DateTimeZone::listIdentifiers(DateTimeZone::ALL_WITH_BC)
+ * valid for new DateTimeZone()
+ *
+ * This list does not include those timezone identifiers that we have to map to
+ * a different identifier for some PHP versions (see php-workaround.php).
+ *
+ * Instead of using DateTimeZone::listIdentifiers(DateTimeZone::ALL_WITH_BC)
+ * directly, we use this file because DateTimeZone::ALL_WITH_BC is not properly
+ * supported by all PHP version and HHVM.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+return array(
+    'Africa/Asmera',
+    'Africa/Timbuktu',
+    'America/Argentina/ComodRivadavia',
+    'America/Atka',
+    'America/Buenos_Aires',
+    'America/Catamarca',
+    'America/Coral_Harbour',
+    'America/Cordoba',
+    'America/Ensenada',
+    'America/Fort_Wayne',
+    'America/Indianapolis',
+    'America/Jujuy',
+    'America/Knox_IN',
+    'America/Louisville',
+    'America/Mendoza',
+    'America/Montreal',
+    'America/Porto_Acre',
+    'America/Rosario',
+    'America/Shiprock',
+    'America/Virgin',
+    'Antarctica/South_Pole',
+    'Asia/Ashkhabad',
+    'Asia/Calcutta',
+    'Asia/Chungking',
+    'Asia/Dacca',
+    'Asia/Istanbul',
+    'Asia/Katmandu',
+    'Asia/Macao',
+    'Asia/Saigon',
+    'Asia/Tel_Aviv',
+    'Asia/Thimbu',
+    'Asia/Ujung_Pandang',
+    'Asia/Ulan_Bator',
+    'Atlantic/Faeroe',
+    'Atlantic/Jan_Mayen',
+    'Australia/ACT',
+    'Australia/Canberra',
+    'Australia/LHI',
+    'Australia/North',
+    'Australia/NSW',
+    'Australia/Queensland',
+    'Australia/South',
+    'Australia/Tasmania',
+    'Australia/Victoria',
+    'Australia/West',
+    'Australia/Yancowinna',
+    'Brazil/Acre',
+    'Brazil/DeNoronha',
+    'Brazil/East',
+    'Brazil/West',
+    'Canada/Atlantic',
+    'Canada/Central',
+    'Canada/East-Saskatchewan',
+    'Canada/Eastern',
+    'Canada/Mountain',
+    'Canada/Newfoundland',
+    'Canada/Pacific',
+    'Canada/Saskatchewan',
+    'Canada/Yukon',
+    'CET',
+    'Chile/Continental',
+    'Chile/EasterIsland',
+    'EET',
+    'EST',
+    'Etc/GMT',
+    'Etc/GMT+0',
+    'Etc/GMT+1',
+    'Etc/GMT+10',
+    'Etc/GMT+11',
+    'Etc/GMT+12',
+    'Etc/GMT+2',
+    'Etc/GMT+3',
+    'Etc/GMT+4',
+    'Etc/GMT+5',
+    'Etc/GMT+6',
+    'Etc/GMT+7',
+    'Etc/GMT+8',
+    'Etc/GMT+9',
+    'Etc/GMT-0',
+    'Etc/GMT-1',
+    'Etc/GMT-10',
+    'Etc/GMT-11',
+    'Etc/GMT-12',
+    'Etc/GMT-13',
+    'Etc/GMT-14',
+    'Etc/GMT-2',
+    'Etc/GMT-3',
+    'Etc/GMT-4',
+    'Etc/GMT-5',
+    'Etc/GMT-6',
+    'Etc/GMT-7',
+    'Etc/GMT-8',
+    'Etc/GMT-9',
+    'Etc/GMT0',
+    'Etc/Greenwich',
+    'Etc/UCT',
+    'Etc/Universal',
+    'Etc/UTC',
+    'Etc/Zulu',
+    'Europe/Belfast',
+    'Europe/Nicosia',
+    'Europe/Tiraspol',
+    'GB',
+    'GMT',
+    'GMT+0',
+    'GMT-0',
+    'HST',
+    'MET',
+    'Mexico/BajaNorte',
+    'Mexico/BajaSur',
+    'Mexico/General',
+    'MST',
+    'NZ',
+    'Pacific/Ponape',
+    'Pacific/Samoa',
+    'Pacific/Truk',
+    'Pacific/Yap',
+    'PRC',
+    'ROC',
+    'ROK',
+    'UCT',
+    'US/Alaska',
+    'US/Aleutian',
+    'US/Arizona',
+    'US/Central',
+    'US/East-Indiana',
+    'US/Eastern',
+    'US/Hawaii',
+    'US/Indiana-Starke',
+    'US/Michigan',
+    'US/Mountain',
+    'US/Pacific',
+    'US/Pacific-New',
+    'US/Samoa',
+    'WET',
+);
diff --git a/vendor/sabre/vobject/lib/timezonedata/php-workaround.php b/vendor/sabre/vobject/lib/timezonedata/php-workaround.php
new file mode 100644
index 0000000000000000000000000000000000000000..6f639a3ba65c4e27aacb3da242d6d4264432cf3a
--- /dev/null
+++ b/vendor/sabre/vobject/lib/timezonedata/php-workaround.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * A list of PHP timezones that were supported until 5.5.9, removed in
+ * PHP 5.5.10 and re-introduced in PHP 5.5.17
+ *
+ * DateTimeZone::listIdentifiers(DateTimeZone::ALL_WITH_BC) returns them,
+ * but they are invalid for new DateTimeZone(). Fixed in PHP 5.5.17.
+ * https://bugs.php.net/bug.php?id=66985
+ *
+ * Some more info here:
+ * http://evertpot.com/php-5-5-10-timezone-changes/
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+return array(
+    'CST6CDT'   => 'America/Chicago',
+    'Cuba'      => 'America/Havana',
+    'Egypt'     => 'Africa/Cairo',
+    'Eire'      => 'Europe/Dublin',
+    'EST5EDT'   => 'America/New_York',
+    'Factory'   => 'UTC',
+    'GB-Eire'   => 'Europe/London',
+    'GMT0'      => 'UTC',
+    'Greenwich' => 'UTC',
+    'Hongkong'  => 'Asia/Hong_Kong',
+    'Iceland'   => 'Atlantic/Reykjavik',
+    'Iran'      => 'Asia/Tehran',
+    'Israel'    => 'Asia/Jerusalem',
+    'Jamaica'   => 'America/Jamaica',
+    'Japan'     => 'Asia/Tokyo',
+    'Kwajalein' => 'Pacific/Kwajalein',
+    'Libya'     => 'Africa/Tripoli',
+    'MST7MDT'   => 'America/Denver',
+    'Navajo'    => 'America/Denver',
+    'NZ-CHAT'   => 'Pacific/Chatham',
+    'Poland'    => 'Europe/Warsaw',
+    'Portugal'  => 'Europe/Lisbon',
+    'PST8PDT'   => 'America/Los_Angeles',
+    'Singapore' => 'Asia/Singapore',
+    'Turkey'    => 'Europe/Istanbul',
+    'Universal' => 'UTC',
+    'W-SU'      => 'Europe/Moscow',
+    'Zulu'      => 'UTC',
+);
diff --git a/vendor/sabre/vobject/lib/timezonedata/windowszones.php b/vendor/sabre/vobject/lib/timezonedata/windowszones.php
new file mode 100644
index 0000000000000000000000000000000000000000..2d6dde68edb95d0962109f4e334c6dc4f75f0af2
--- /dev/null
+++ b/vendor/sabre/vobject/lib/timezonedata/windowszones.php
@@ -0,0 +1,118 @@
+<?php
+
+/**
+ * Automatically generated timezone file
+ *
+ * Last update: 2015-01-30T15:01:05-05:00
+ * Source: http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+
+return array (
+  'AUS Central Standard Time' => 'Australia/Darwin',
+  'AUS Eastern Standard Time' => 'Australia/Sydney',
+  'Afghanistan Standard Time' => 'Asia/Kabul',
+  'Alaskan Standard Time' => 'America/Anchorage',
+  'Arab Standard Time' => 'Asia/Riyadh',
+  'Arabian Standard Time' => 'Asia/Dubai',
+  'Arabic Standard Time' => 'Asia/Baghdad',
+  'Argentina Standard Time' => 'America/Buenos_Aires',
+  'Atlantic Standard Time' => 'America/Halifax',
+  'Azerbaijan Standard Time' => 'Asia/Baku',
+  'Azores Standard Time' => 'Atlantic/Azores',
+  'Bahia Standard Time' => 'America/Bahia',
+  'Bangladesh Standard Time' => 'Asia/Dhaka',
+  'Belarus Standard Time' => 'Europe/Minsk',
+  'Canada Central Standard Time' => 'America/Regina',
+  'Cape Verde Standard Time' => 'Atlantic/Cape_Verde',
+  'Caucasus Standard Time' => 'Asia/Yerevan',
+  'Cen. Australia Standard Time' => 'Australia/Adelaide',
+  'Central America Standard Time' => 'America/Guatemala',
+  'Central Asia Standard Time' => 'Asia/Almaty',
+  'Central Brazilian Standard Time' => 'America/Cuiaba',
+  'Central Europe Standard Time' => 'Europe/Budapest',
+  'Central European Standard Time' => 'Europe/Warsaw',
+  'Central Pacific Standard Time' => 'Pacific/Guadalcanal',
+  'Central Standard Time' => 'America/Chicago',
+  'Central Standard Time (Mexico)' => 'America/Mexico_City',
+  'China Standard Time' => 'Asia/Shanghai',
+  'Dateline Standard Time' => 'Etc/GMT+12',
+  'E. Africa Standard Time' => 'Africa/Nairobi',
+  'E. Australia Standard Time' => 'Australia/Brisbane',
+  'E. South America Standard Time' => 'America/Sao_Paulo',
+  'Eastern Standard Time' => 'America/New_York',
+  'Egypt Standard Time' => 'Africa/Cairo',
+  'Ekaterinburg Standard Time' => 'Asia/Yekaterinburg',
+  'FLE Standard Time' => 'Europe/Kiev',
+  'Fiji Standard Time' => 'Pacific/Fiji',
+  'GMT Standard Time' => 'Europe/London',
+  'GTB Standard Time' => 'Europe/Bucharest',
+  'Georgian Standard Time' => 'Asia/Tbilisi',
+  'Greenland Standard Time' => 'America/Godthab',
+  'Greenwich Standard Time' => 'Atlantic/Reykjavik',
+  'Hawaiian Standard Time' => 'Pacific/Honolulu',
+  'India Standard Time' => 'Asia/Calcutta',
+  'Iran Standard Time' => 'Asia/Tehran',
+  'Israel Standard Time' => 'Asia/Jerusalem',
+  'Jordan Standard Time' => 'Asia/Amman',
+  'Kaliningrad Standard Time' => 'Europe/Kaliningrad',
+  'Korea Standard Time' => 'Asia/Seoul',
+  'Libya Standard Time' => 'Africa/Tripoli',
+  'Line Islands Standard Time' => 'Pacific/Kiritimati',
+  'Magadan Standard Time' => 'Asia/Magadan',
+  'Mauritius Standard Time' => 'Indian/Mauritius',
+  'Middle East Standard Time' => 'Asia/Beirut',
+  'Montevideo Standard Time' => 'America/Montevideo',
+  'Morocco Standard Time' => 'Africa/Casablanca',
+  'Mountain Standard Time' => 'America/Denver',
+  'Mountain Standard Time (Mexico)' => 'America/Chihuahua',
+  'Myanmar Standard Time' => 'Asia/Rangoon',
+  'N. Central Asia Standard Time' => 'Asia/Novosibirsk',
+  'Namibia Standard Time' => 'Africa/Windhoek',
+  'Nepal Standard Time' => 'Asia/Katmandu',
+  'New Zealand Standard Time' => 'Pacific/Auckland',
+  'Newfoundland Standard Time' => 'America/St_Johns',
+  'North Asia East Standard Time' => 'Asia/Irkutsk',
+  'North Asia Standard Time' => 'Asia/Krasnoyarsk',
+  'Pacific SA Standard Time' => 'America/Santiago',
+  'Pacific Standard Time' => 'America/Los_Angeles',
+  'Pacific Standard Time (Mexico)' => 'America/Santa_Isabel',
+  'Pakistan Standard Time' => 'Asia/Karachi',
+  'Paraguay Standard Time' => 'America/Asuncion',
+  'Romance Standard Time' => 'Europe/Paris',
+  'Russia Time Zone 10' => 'Asia/Srednekolymsk',
+  'Russia Time Zone 11' => 'Asia/Kamchatka',
+  'Russia Time Zone 3' => 'Europe/Samara',
+  'Russian Standard Time' => 'Europe/Moscow',
+  'SA Eastern Standard Time' => 'America/Cayenne',
+  'SA Pacific Standard Time' => 'America/Bogota',
+  'SA Western Standard Time' => 'America/La_Paz',
+  'SE Asia Standard Time' => 'Asia/Bangkok',
+  'Samoa Standard Time' => 'Pacific/Apia',
+  'Singapore Standard Time' => 'Asia/Singapore',
+  'South Africa Standard Time' => 'Africa/Johannesburg',
+  'Sri Lanka Standard Time' => 'Asia/Colombo',
+  'Syria Standard Time' => 'Asia/Damascus',
+  'Taipei Standard Time' => 'Asia/Taipei',
+  'Tasmania Standard Time' => 'Australia/Hobart',
+  'Tokyo Standard Time' => 'Asia/Tokyo',
+  'Tonga Standard Time' => 'Pacific/Tongatapu',
+  'Turkey Standard Time' => 'Europe/Istanbul',
+  'US Eastern Standard Time' => 'America/Indianapolis',
+  'US Mountain Standard Time' => 'America/Phoenix',
+  'UTC' => 'Etc/GMT',
+  'UTC+12' => 'Etc/GMT-12',
+  'UTC-02' => 'Etc/GMT+2',
+  'UTC-11' => 'Etc/GMT+11',
+  'Ulaanbaatar Standard Time' => 'Asia/Ulaanbaatar',
+  'Venezuela Standard Time' => 'America/Caracas',
+  'Vladivostok Standard Time' => 'Asia/Vladivostok',
+  'W. Australia Standard Time' => 'Australia/Perth',
+  'W. Central Africa Standard Time' => 'Africa/Lagos',
+  'W. Europe Standard Time' => 'Europe/Berlin',
+  'West Asia Standard Time' => 'Asia/Tashkent',
+  'West Pacific Standard Time' => 'Pacific/Port_Moresby',
+  'Yakutsk Standard Time' => 'Asia/Yakutsk',
+);
diff --git a/vendor/sabre/vobject/tests/VObject/AttachIssueTest.php b/vendor/sabre/vobject/tests/VObject/AttachIssueTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..68c9872bb5bf0d37ae39add5d9d39e08e4827b8c
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/AttachIssueTest.php
@@ -0,0 +1,22 @@
+<?php
+
+namespace Sabre\VObject;
+
+class AttachIssueTest extends \PHPUnit_Framework_TestCase {
+
+    function testRead() {
+
+        $event = <<<ICS
+BEGIN:VCALENDAR\r
+BEGIN:VEVENT\r
+ATTACH;FMTTYPE=;ENCODING=:Zm9v\r
+END:VEVENT\r
+END:VCALENDAR\r
+
+ICS;
+        $obj = Reader::read($event);
+        $this->assertEquals($event, $obj->serialize());
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/CliTest.php b/vendor/sabre/vobject/tests/VObject/CliTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..9049c00b0c9192940e0e2aa2ce81452c2a53cfbc
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/CliTest.php
@@ -0,0 +1,650 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * Tests the cli.
+ *
+ * Warning: these tests are very rudimentary.
+ */
+class CliTest extends \PHPUnit_Framework_TestCase {
+
+    public function setUp() {
+
+        $this->cli = new CliMock();
+        $this->cli->stderr = fopen('php://memory','r+');
+        $this->cli->stdout = fopen('php://memory','r+');
+
+    }
+
+    public function testInvalidArg() {
+
+        $this->assertEquals(
+            1,
+            $this->cli->main(array('vobject', '--hi'))
+        );
+        rewind($this->cli->stderr);
+        $this->assertTrue(strlen(stream_get_contents($this->cli->stderr)) > 100);
+
+    }
+
+    public function testQuiet() {
+
+        $this->assertEquals(
+            1,
+            $this->cli->main(array('vobject', '-q'))
+        );
+        $this->assertTrue($this->cli->quiet);
+
+        rewind($this->cli->stderr);
+        $this->assertEquals(0, strlen(stream_get_contents($this->cli->stderr)));
+
+    }
+
+    public function testHelp() {
+
+        $this->assertEquals(
+            0,
+            $this->cli->main(array('vobject', '-h'))
+        );
+        rewind($this->cli->stderr);
+        $this->assertTrue(strlen(stream_get_contents($this->cli->stderr)) > 100);
+
+    }
+
+    public function testFormat() {
+
+        $this->assertEquals(
+            1,
+            $this->cli->main(array('vobject', '--format=jcard'))
+        );
+
+        rewind($this->cli->stderr);
+        $this->assertTrue(strlen(stream_get_contents($this->cli->stderr)) > 100);
+
+        $this->assertEquals('jcard', $this->cli->format);
+
+    }
+
+    public function testFormatInvalid() {
+
+        $this->assertEquals(
+            1,
+            $this->cli->main(array('vobject', '--format=foo'))
+        );
+
+        rewind($this->cli->stderr);
+        $this->assertTrue(strlen(stream_get_contents($this->cli->stderr)) > 100);
+
+        $this->assertNull($this->cli->format);
+
+    }
+
+    public function testInputFormatInvalid() {
+
+        $this->assertEquals(
+            1,
+            $this->cli->main(array('vobject', '--inputformat=foo'))
+        );
+
+        rewind($this->cli->stderr);
+        $this->assertTrue(strlen(stream_get_contents($this->cli->stderr)) > 100);
+
+        $this->assertNull($this->cli->format);
+
+    }
+
+
+    public function testNoInputFile() {
+
+        $this->assertEquals(
+            1,
+            $this->cli->main(array('vobject', 'color'))
+        );
+
+        rewind($this->cli->stderr);
+        $this->assertTrue(strlen(stream_get_contents($this->cli->stderr)) > 100);
+
+    }
+
+    public function testTooManyArgs() {
+
+        $this->assertEquals(
+            1,
+            $this->cli->main(array('vobject', 'color', 'a', 'b', 'c'))
+        );
+
+    }
+
+    public function testUnknownCommand() {
+
+        $this->assertEquals(
+            1,
+            $this->cli->main(array('vobject', 'foo', '-'))
+        );
+
+    }
+
+    public function testConvertJson() {
+
+        $inputStream = fopen('php://memory','r+');
+
+        fwrite($inputStream, <<<ICS
+BEGIN:VCARD
+VERSION:3.0
+FN:Cowboy Henk
+END:VCARD
+ICS
+    );
+        rewind($inputStream);
+        $this->cli->stdin = $inputStream;
+
+        $this->assertEquals(
+            0,
+            $this->cli->main(array('vobject', 'convert','--format=json', '-'))
+        );
+
+        rewind($this->cli->stdout);
+        $version = Version::VERSION;
+        $this->assertEquals(
+            '["vcard",[["version",{},"text","4.0"],["prodid",{},"text","-\/\/Sabre\/\/Sabre VObject '. $version .'\/\/EN"],["fn",{},"text","Cowboy Henk"]]]',
+            stream_get_contents($this->cli->stdout)
+        );
+
+    }
+
+    public function testConvertJCardPretty() {
+
+        if (version_compare(PHP_VERSION, '5.4.0') < 0) {
+            $this->markTestSkipped('This test required PHP 5.4.0');
+        }
+
+        $inputStream = fopen('php://memory','r+');
+
+        fwrite($inputStream, <<<ICS
+BEGIN:VCARD
+VERSION:3.0
+FN:Cowboy Henk
+END:VCARD
+ICS
+    );
+        rewind($inputStream);
+        $this->cli->stdin = $inputStream;
+
+        $this->assertEquals(
+            0,
+            $this->cli->main(array('vobject', 'convert','--format=jcard', '--pretty', '-'))
+        );
+
+        rewind($this->cli->stdout);
+        $version = Version::VERSION;
+
+        // PHP 5.5.12 changed the output
+
+        $expected = <<<JCARD
+[
+    "vcard",
+    [
+        [
+            "versi
+JCARD;
+
+          $this->assertStringStartsWith(
+            $expected,
+            stream_get_contents($this->cli->stdout)
+        );
+
+    }
+
+    public function testConvertJCalFail() {
+
+        $inputStream = fopen('php://memory','r+');
+
+        fwrite($inputStream, <<<ICS
+BEGIN:VCARD
+VERSION:3.0
+FN:Cowboy Henk
+END:VCARD
+ICS
+    );
+        rewind($inputStream);
+        $this->cli->stdin = $inputStream;
+
+        $this->assertEquals(
+            2,
+            $this->cli->main(array('vobject', 'convert','--format=jcal', '--inputformat=mimedir', '-'))
+        );
+
+    }
+
+    public function testConvertMimeDir() {
+
+        $inputStream = fopen('php://memory','r+');
+
+        fwrite($inputStream, <<<JCARD
+[
+    "vcard",
+    [
+        [
+            "version",
+            {
+
+            },
+            "text",
+            "4.0"
+        ],
+        [
+            "prodid",
+            {
+
+            },
+            "text",
+            "-\/\/Sabre\/\/Sabre VObject 3.1.0\/\/EN"
+        ],
+        [
+            "fn",
+            {
+
+            },
+            "text",
+            "Cowboy Henk"
+        ]
+    ]
+]
+JCARD
+    );
+        rewind($inputStream);
+        $this->cli->stdin = $inputStream;
+
+        $this->assertEquals(
+            0,
+            $this->cli->main(array('vobject', 'convert','--format=mimedir', '--inputformat=json', '--pretty', '-'))
+        );
+
+        rewind($this->cli->stdout);
+        $expected = <<<VCF
+BEGIN:VCARD
+VERSION:4.0
+PRODID:-//Sabre//Sabre VObject 3.1.0//EN
+FN:Cowboy Henk
+END:VCARD
+
+VCF;
+
+          $this->assertEquals(
+            strtr($expected, array("\n"=>"\r\n")),
+            stream_get_contents($this->cli->stdout)
+        );
+
+    }
+
+    public function testConvertDefaultFormats() {
+
+        $inputStream = fopen('php://memory','r+');
+        $outputFile = SABRE_TEMPDIR . 'bar.json';
+
+        $this->assertEquals(
+            2,
+            $this->cli->main(array('vobject', 'convert','foo.json',$outputFile))
+        );
+
+        $this->assertEquals('json', $this->cli->inputFormat);
+        $this->assertEquals('json', $this->cli->format);
+
+    }
+
+    public function testConvertDefaultFormats2() {
+
+        $outputFile = SABRE_TEMPDIR . 'bar.ics';
+
+        $this->assertEquals(
+            2,
+            $this->cli->main(array('vobject', 'convert','foo.ics',$outputFile))
+        );
+
+        $this->assertEquals('mimedir', $this->cli->inputFormat);
+        $this->assertEquals('mimedir', $this->cli->format);
+
+    }
+
+    public function testVCard3040() {
+
+        $inputStream = fopen('php://memory','r+');
+
+        fwrite($inputStream, <<<VCARD
+BEGIN:VCARD
+VERSION:3.0
+PRODID:-//Sabre//Sabre VObject 3.1.0//EN
+FN:Cowboy Henk
+END:VCARD
+
+VCARD
+    );
+        rewind($inputStream);
+        $this->cli->stdin = $inputStream;
+
+        $this->assertEquals(
+            0,
+            $this->cli->main(array('vobject', 'convert','--format=vcard40', '--pretty', '-'))
+        );
+
+        rewind($this->cli->stdout);
+
+        $version = Version::VERSION;
+        $expected = <<<VCF
+BEGIN:VCARD
+VERSION:4.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+FN:Cowboy Henk
+END:VCARD
+
+VCF;
+
+          $this->assertEquals(
+            strtr($expected, array("\n"=>"\r\n")),
+            stream_get_contents($this->cli->stdout)
+        );
+
+    }
+
+    public function testVCard4030() {
+
+        $inputStream = fopen('php://memory','r+');
+
+        fwrite($inputStream, <<<VCARD
+BEGIN:VCARD
+VERSION:4.0
+PRODID:-//Sabre//Sabre VObject 3.1.0//EN
+FN:Cowboy Henk
+END:VCARD
+
+VCARD
+    );
+        rewind($inputStream);
+        $this->cli->stdin = $inputStream;
+
+        $this->assertEquals(
+            0,
+            $this->cli->main(array('vobject', 'convert','--format=vcard30', '--pretty', '-'))
+        );
+
+        $version = Version::VERSION;
+
+        rewind($this->cli->stdout);
+        $expected = <<<VCF
+BEGIN:VCARD
+VERSION:3.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+FN:Cowboy Henk
+END:VCARD
+
+VCF;
+
+          $this->assertEquals(
+            strtr($expected, array("\n"=>"\r\n")),
+            stream_get_contents($this->cli->stdout)
+        );
+
+    }
+
+    public function testVCard4021() {
+
+        $inputStream = fopen('php://memory','r+');
+
+        fwrite($inputStream, <<<VCARD
+BEGIN:VCARD
+VERSION:4.0
+PRODID:-//Sabre//Sabre VObject 3.1.0//EN
+FN:Cowboy Henk
+END:VCARD
+
+VCARD
+    );
+        rewind($inputStream);
+        $this->cli->stdin = $inputStream;
+
+        // vCard 2.1 is not supported yet, so this returns a failure.
+        $this->assertEquals(
+            2,
+            $this->cli->main(array('vobject', 'convert','--format=vcard21', '--pretty', '-'))
+        );
+
+    }
+
+    function testValidate() {
+
+        $inputStream = fopen('php://memory','r+');
+
+        fwrite($inputStream, <<<VCARD
+BEGIN:VCARD
+VERSION:4.0
+PRODID:-//Sabre//Sabre VObject 3.1.0//EN
+UID:foo
+FN:Cowboy Henk
+END:VCARD
+
+VCARD
+    );
+        rewind($inputStream);
+        $this->cli->stdin = $inputStream;
+        $result = $this->cli->main(array('vobject', 'validate', '-'));
+
+        $this->assertEquals(
+            0,
+            $result
+        );
+
+    }
+
+    function testValidateFail() {
+
+        $inputStream = fopen('php://memory','r+');
+
+        fwrite($inputStream, <<<VCARD
+BEGIN:VCALENDAR
+VERSION:2.0
+END:VCARD
+
+VCARD
+    );
+        rewind($inputStream);
+        $this->cli->stdin = $inputStream;
+        // vCard 2.1 is not supported yet, so this returns a failure.
+        $this->assertEquals(
+            2,
+            $this->cli->main(array('vobject', 'validate', '-'))
+        );
+
+    }
+
+    function testValidateFail2() {
+
+        $inputStream = fopen('php://memory','r+');
+
+        fwrite($inputStream, <<<VCARD
+BEGIN:VCALENDAR
+VERSION:5.0
+END:VCALENDAR
+
+VCARD
+    );
+        rewind($inputStream);
+        $this->cli->stdin = $inputStream;
+        // vCard 2.1 is not supported yet, so this returns a failure.
+        $this->assertEquals(
+            2,
+            $this->cli->main(array('vobject', 'validate', '-'))
+        );
+
+    }
+
+    function testRepair() {
+
+        $inputStream = fopen('php://memory','r+');
+
+        fwrite($inputStream, <<<VCARD
+BEGIN:VCARD
+VERSION:5.0
+END:VCARD
+
+VCARD
+    );
+        rewind($inputStream);
+        $this->cli->stdin = $inputStream;
+        // vCard 2.1 is not supported yet, so this returns a failure.
+        $this->assertEquals(
+            2,
+            $this->cli->main(array('vobject', 'repair', '-'))
+        );
+
+        rewind($this->cli->stdout);
+        $this->assertRegExp("/^BEGIN:VCARD\r\nVERSION:2.1\r\nUID:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\r\nEND:VCARD\r\n$/", stream_get_contents($this->cli->stdout));
+    }
+
+    function testRepairNothing() {
+
+        $inputStream = fopen('php://memory','r+');
+
+        fwrite($inputStream, <<<VCARD
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject 3.1.0//EN
+BEGIN:VEVENT
+UID:foo
+DTSTAMP:20140122T233226Z
+DTSTART:20140101T120000Z
+END:VEVENT
+END:VCALENDAR
+
+VCARD
+    );
+        rewind($inputStream);
+        $this->cli->stdin = $inputStream;
+        // vCard 2.1 is not supported yet, so this returns a failure.
+
+        $result = $this->cli->main(array('vobject', 'repair', '-'));
+
+        rewind($this->cli->stderr);
+        $error = stream_get_contents($this->cli->stderr);
+
+        $this->assertEquals(
+            0,
+            $result,
+            "This should have been error free. stderr output:\n" . $error
+        );
+
+    }
+
+    /**
+     * Note: this is a very shallow test, doesn't dig into the actual output,
+     * but just makes sure there's no errors thrown.
+     *
+     * The colorizer is not a critical component, it's mostly a debugging tool.
+     */
+    function testColorCalendar() {
+
+        $inputStream = fopen('php://memory','r+');
+
+        $version = Version::VERSION;
+
+        /**
+         * This object is not valid, but it's designed to hit every part of the
+         * colorizer source.
+         */
+        fwrite($inputStream, <<<VCARD
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject {$version}//EN
+BEGIN:VTIMEZONE
+END:VTIMEZONE
+BEGIN:VEVENT
+ATTENDEE;RSVP=TRUE:mailto:foo@example.org
+REQUEST-STATUS:5;foo
+ATTACH:blabla
+END:VEVENT
+END:VCALENDAR
+
+VCARD
+    );
+        rewind($inputStream);
+        $this->cli->stdin = $inputStream;
+        // vCard 2.1 is not supported yet, so this returns a failure.
+
+        $result = $this->cli->main(array('vobject', 'color', '-'));
+
+        rewind($this->cli->stderr);
+        $error = stream_get_contents($this->cli->stderr);
+
+        $this->assertEquals(
+            0,
+            $result,
+            "This should have been error free. stderr output:\n" . $error
+        );
+
+    }
+
+    /**
+     * Note: this is a very shallow test, doesn't dig into the actual output,
+     * but just makes sure there's no errors thrown.
+     *
+     * The colorizer is not a critical component, it's mostly a debugging tool.
+     */
+    function testColorVCard() {
+
+        $inputStream = fopen('php://memory','r+');
+
+        $version = Version::VERSION;
+
+        /**
+         * This object is not valid, but it's designed to hit every part of the
+         * colorizer source.
+         */
+        fwrite($inputStream, <<<VCARD
+BEGIN:VCARD
+VERSION:4.0
+PRODID:-//Sabre//Sabre VObject {$version}//EN
+ADR:1;2;3;4a,4b;5;6
+group.TEL:123454768
+END:VCARD
+
+VCARD
+    );
+        rewind($inputStream);
+        $this->cli->stdin = $inputStream;
+        // vCard 2.1 is not supported yet, so this returns a failure.
+
+        $result = $this->cli->main(array('vobject', 'color', '-'));
+
+        rewind($this->cli->stderr);
+        $error = stream_get_contents($this->cli->stderr);
+
+        $this->assertEquals(
+            0,
+            $result,
+            "This should have been error free. stderr output:\n" . $error
+        );
+
+    }
+}
+
+class CliMock extends Cli {
+
+    public $log = array();
+
+    public $quiet = false;
+
+    public $format;
+
+    public $pretty;
+
+    public $stdin;
+
+    public $stdout;
+
+    public $stderr;
+
+    public $inputFormat;
+
+    public $outputFormat;
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Component/VAlarmTest.php b/vendor/sabre/vobject/tests/VObject/Component/VAlarmTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..76dd2e34f2b41782f123ff4d5e0e4dd8ede7c9a7
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Component/VAlarmTest.php
@@ -0,0 +1,179 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject\Component;
+use DateTime;
+use Sabre\VObject\Reader;
+
+class VAlarmTest extends \PHPUnit_Framework_TestCase {
+
+    /**
+     * @dataProvider timeRangeTestData
+     */
+    public function testInTimeRange(VAlarm $valarm,$start,$end,$outcome) {
+
+        $this->assertEquals($outcome, $valarm->isInTimeRange($start, $end));
+
+    }
+
+    public function timeRangeTestData() {
+
+        $tests = array();
+
+        $calendar = new VCalendar();
+
+        // Hard date and time
+        $valarm1 = $calendar->createComponent('VALARM');
+        $valarm1->add(
+            $calendar->createProperty('TRIGGER', '20120312T130000Z', array('VALUE' => 'DATE-TIME'))
+        );
+
+        $tests[] = array($valarm1, new DateTime('2012-03-01 01:00:00'), new DateTime('2012-04-01 01:00:00'), true);
+        $tests[] = array($valarm1, new DateTime('2012-03-01 01:00:00'), new DateTime('2012-03-10 01:00:00'), false);
+
+        // Relation to start time of event
+        $valarm2 = $calendar->createComponent('VALARM');
+        $valarm2->add(
+            $calendar->createProperty('TRIGGER', '-P1D', array('VALUE' => 'DURATION'))
+        );
+
+        $vevent2 = $calendar->createComponent('VEVENT');
+        $vevent2->DTSTART = '20120313T130000Z';
+        $vevent2->add($valarm2);
+
+        $tests[] = array($valarm2, new DateTime('2012-03-01 01:00:00'), new DateTime('2012-04-01 01:00:00'), true);
+        $tests[] = array($valarm2, new DateTime('2012-03-01 01:00:00'), new DateTime('2012-03-10 01:00:00'), false);
+
+        // Relation to end time of event
+        $valarm3 = $calendar->createComponent('VALARM');
+        $valarm3->add( $calendar->createProperty('TRIGGER', '-P1D', array('VALUE'=>'DURATION', 'RELATED' => 'END')) );
+
+        $vevent3 = $calendar->createComponent('VEVENT');
+        $vevent3->DTSTART = '20120301T130000Z';
+        $vevent3->DTEND = '20120401T130000Z';
+        $vevent3->add($valarm3);
+
+        $tests[] = array($valarm3, new DateTime('2012-02-25 01:00:00'), new DateTime('2012-03-05 01:00:00'), false);
+        $tests[] = array($valarm3, new DateTime('2012-03-25 01:00:00'), new DateTime('2012-04-05 01:00:00'), true);
+
+        // Relation to end time of todo 
+        $valarm4 = $calendar->createComponent('VALARM');
+        $valarm4->TRIGGER = '-P1D';
+        $valarm4->TRIGGER['VALUE'] = 'DURATION';
+        $valarm4->TRIGGER['RELATED']= 'END';
+
+        $vtodo4 = $calendar->createComponent('VTODO');
+        $vtodo4->DTSTART = '20120301T130000Z';
+        $vtodo4->DUE = '20120401T130000Z';
+        $vtodo4->add($valarm4);
+
+        $tests[] = array($valarm4, new DateTime('2012-02-25 01:00:00'), new DateTime('2012-03-05 01:00:00'), false);
+        $tests[] = array($valarm4, new DateTime('2012-03-25 01:00:00'), new DateTime('2012-04-05 01:00:00'), true);
+
+        // Relation to start time of event + repeat
+        $valarm5 = $calendar->createComponent('VALARM');
+        $valarm5->TRIGGER = '-P1D';
+        $valarm5->TRIGGER['VALUE'] = 'DURATION';
+        $valarm5->REPEAT = 10;
+        $valarm5->DURATION = 'P1D';
+
+        $vevent5 = $calendar->createComponent('VEVENT');
+        $vevent5->DTSTART = '20120301T130000Z';
+        $vevent5->add($valarm5);
+
+        $tests[] = array($valarm5, new DateTime('2012-03-09 01:00:00'), new DateTime('2012-03-10 01:00:00'), true);
+
+        // Relation to start time of event + duration, but no repeat
+        $valarm6 = $calendar->createComponent('VALARM');
+        $valarm6->TRIGGER = '-P1D';
+        $valarm6->TRIGGER['VALUE'] = 'DURATION';
+        $valarm6->DURATION = 'P1D';
+
+        $vevent6 = $calendar->createComponent('VEVENT');
+        $vevent6->DTSTART = '20120313T130000Z';
+        $vevent6->add($valarm6);
+
+        $tests[] = array($valarm6, new DateTime('2012-03-01 01:00:00'), new DateTime('2012-04-01 01:00:00'), true);
+        $tests[] = array($valarm6, new DateTime('2012-03-01 01:00:00'), new DateTime('2012-03-10 01:00:00'), false);
+
+
+        // Relation to end time of event (DURATION instead of DTEND)
+        $valarm7 = $calendar->createComponent('VALARM');
+        $valarm7->TRIGGER = '-P1D';
+        $valarm7->TRIGGER['VALUE'] = 'DURATION';
+        $valarm7->TRIGGER['RELATED']= 'END';
+
+        $vevent7 = $calendar->createComponent('VEVENT');
+        $vevent7->DTSTART = '20120301T130000Z';
+        $vevent7->DURATION = 'P30D';
+        $vevent7->add($valarm7);
+
+        $tests[] = array($valarm7, new DateTime('2012-02-25 01:00:00'), new DateTime('2012-03-05 01:00:00'), false);
+        $tests[] = array($valarm7, new DateTime('2012-03-25 01:00:00'), new DateTime('2012-04-05 01:00:00'), true);
+
+        // Relation to end time of event (No DTEND or DURATION)
+        $valarm7 = $calendar->createComponent('VALARM');
+        $valarm7->TRIGGER = '-P1D';
+        $valarm7->TRIGGER['VALUE'] = 'DURATION';
+        $valarm7->TRIGGER['RELATED']= 'END';
+
+        $vevent7 = $calendar->createComponent('VEVENT');
+        $vevent7->DTSTART = '20120301T130000Z';
+        $vevent7->add($valarm7);
+
+        $tests[] = array($valarm7, new DateTime('2012-02-25 01:00:00'), new DateTime('2012-03-05 01:00:00'), true);
+        $tests[] = array($valarm7, new DateTime('2012-03-25 01:00:00'), new DateTime('2012-04-05 01:00:00'), false);
+
+
+        return $tests;
+    }
+
+    /**
+     * @expectedException LogicException
+     */
+    public function testInTimeRangeInvalidComponent() {
+
+        $calendar = new VCalendar();
+        $valarm = $calendar->createComponent('VALARM');
+        $valarm->TRIGGER = '-P1D';
+        $valarm->TRIGGER['RELATED'] = 'END';
+
+        $vjournal = $calendar->createComponent('VJOURNAL');
+        $vjournal->add($valarm);
+
+        $valarm->isInTimeRange(new DateTime('2012-02-25 01:00:00'), new DateTime('2012-03-05 01:00:00'));
+
+    }
+
+    /**
+     * This bug was found and reported on the mailing list.
+     */
+    public function testInTimeRangeBuggy() {
+
+$input = <<<BLA
+BEGIN:VCALENDAR
+BEGIN:VTODO
+DTSTAMP:20121003T064931Z
+UID:b848cb9a7bb16e464a06c222ca1f8102@examle.com
+STATUS:NEEDS-ACTION
+DUE:20121005T000000Z
+SUMMARY:Task 1
+CATEGORIES:AlarmCategory
+BEGIN:VALARM
+TRIGGER:-PT10M
+ACTION:DISPLAY
+DESCRIPTION:Task 1
+END:VALARM
+END:VTODO
+END:VCALENDAR
+BLA;
+
+        $vobj = Reader::read($input);
+
+        $this->assertTrue($vobj->VTODO->VALARM->isInTimeRange(new \DateTime('2012-10-01 00:00:00'), new \DateTime('2012-11-01 00:00:00')));
+
+    }
+
+}
+
diff --git a/vendor/sabre/vobject/tests/VObject/Component/VAvailabilityTest.php b/vendor/sabre/vobject/tests/VObject/Component/VAvailabilityTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..979a8531151dcddc9dabaab20a962f19e7dba770
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Component/VAvailabilityTest.php
@@ -0,0 +1,385 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject;
+use Sabre\VObject\Reader;
+use Sabre\VObject\Component;
+use Sabre\VObject\Component\VAvailability;
+
+/**
+ * We use `RFCxxx` has a placeholder for the
+ * https://tools.ietf.org/html/draft-daboo-calendar-availability-05 name.
+ */
+class VAvailabilityTest extends \PHPUnit_Framework_TestCase {
+
+    function testVAvailabilityComponent() {
+
+        $vcal = <<<VCAL
+BEGIN:VCALENDAR
+BEGIN:VAVAILABILITY
+END:VAVAILABILITY
+END:VCALENDAR
+VCAL;
+        $document = Reader::read($vcal);
+
+        $this->assertInstanceOf(__NAMESPACE__ . '\VAvailability', $document->VAVAILABILITY);
+
+    }
+
+    function testRFCxxxSection3_1_availabilityprop_required() {
+
+        // UID and DTSTAMP are present.
+        $this->assertIsValid(Reader::read(
+<<<VCAL
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//id
+BEGIN:VAVAILABILITY
+UID:foo@test
+DTSTAMP:20111005T133225Z
+END:VAVAILABILITY
+END:VCALENDAR
+VCAL
+        ));
+
+        // UID and DTSTAMP are missing.
+        $this->assertIsNotValid(Reader::read(
+<<<VCAL
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//id
+BEGIN:VAVAILABILITY
+END:VAVAILABILITY
+END:VCALENDAR
+VCAL
+        ));
+
+        // DTSTAMP is missing.
+        $this->assertIsNotValid(Reader::read(
+<<<VCAL
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//id
+BEGIN:VAVAILABILITY
+UID:foo@test
+END:VAVAILABILITY
+END:VCALENDAR
+VCAL
+        ));
+
+        // UID is missing.
+        $this->assertIsNotValid(Reader::read(
+<<<VCAL
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//id
+BEGIN:VAVAILABILITY
+DTSTAMP:20111005T133225Z
+END:VAVAILABILITY
+END:VCALENDAR
+VCAL
+        ));
+
+    }
+
+    function testRFCxxxSection3_1_availabilityprop_optional_once() {
+
+        $properties = array(
+            'BUSYTYPE:BUSY',
+            'CLASS:PUBLIC',
+            'CREATED:20111005T135125Z',
+            'DESCRIPTION:Long bla bla',
+            'DTSTART:20111005T020000',
+            'LAST-MODIFIED:20111005T135325Z',
+            'ORGANIZER:mailto:foo@example.com',
+            'PRIORITY:1',
+            'SEQUENCE:0',
+            'SUMMARY:Bla bla',
+            'URL:http://example.org/'
+        );
+
+        // They are all present, only once.
+        $this->assertIsValid(Reader::read($this->template($properties)));
+
+        // We duplicate each one to see if it fails.
+        foreach ($properties as $property) {
+            $this->assertIsNotValid(Reader::read($this->template(array(
+                $property,
+                $property
+            ))));
+        }
+
+    }
+
+    function testRFCxxxSection3_1_availabilityprop_dtend_duration() {
+
+        // Only DTEND.
+        $this->assertIsValid(Reader::read($this->template(array(
+            'DTEND:21111005T133225Z'
+        ))));
+
+        // Only DURATION.
+        $this->assertIsValid(Reader::read($this->template(array(
+            'DURATION:PT1H'
+        ))));
+
+        // Both (not allowed).
+        $this->assertIsNotValid(Reader::read($this->template(array(
+            'DTEND:21111005T133225Z',
+            'DURATION:PT1H'
+        ))));
+    }
+
+    function testAvailableSubComponent() {
+
+        $vcal = <<<VCAL
+BEGIN:VCALENDAR
+BEGIN:VAVAILABILITY
+BEGIN:AVAILABLE
+END:AVAILABLE
+END:VAVAILABILITY
+END:VCALENDAR
+VCAL;
+        $document = Reader::read($vcal);
+
+        $this->assertInstanceOf(__NAMESPACE__, $document->VAVAILABILITY->AVAILABLE);
+
+    }
+
+    function testRFCxxxSection3_1_availableprop_required() {
+
+        // UID, DTSTAMP and DTSTART are present.
+        $this->assertIsValid(Reader::read(
+<<<VCAL
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//id
+BEGIN:VAVAILABILITY
+UID:foo@test
+DTSTAMP:20111005T133225Z
+BEGIN:AVAILABLE
+UID:foo@test
+DTSTAMP:20111005T133225Z
+DTSTART:20111005T133225Z
+END:AVAILABLE
+END:VAVAILABILITY
+END:VCALENDAR
+VCAL
+        ));
+
+        // UID, DTSTAMP and DTSTART are missing.
+        $this->assertIsNotValid(Reader::read(
+<<<VCAL
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//id
+BEGIN:VAVAILABILITY
+UID:foo@test
+DTSTAMP:20111005T133225Z
+BEGIN:AVAILABLE
+END:AVAILABLE
+END:VAVAILABILITY
+END:VCALENDAR
+VCAL
+        ));
+
+        // UID is missing.
+        $this->assertIsNotValid(Reader::read(
+<<<VCAL
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//id
+BEGIN:VAVAILABILITY
+UID:foo@test
+DTSTAMP:20111005T133225Z
+BEGIN:AVAILABLE
+DTSTAMP:20111005T133225Z
+DTSTART:20111005T133225Z
+END:AVAILABLE
+END:VAVAILABILITY
+END:VCALENDAR
+VCAL
+        ));
+
+        // DTSTAMP is missing.
+        $this->assertIsNotValid(Reader::read(
+<<<VCAL
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//id
+BEGIN:VAVAILABILITY
+UID:foo@test
+DTSTAMP:20111005T133225Z
+BEGIN:AVAILABLE
+UID:foo@test
+DTSTART:20111005T133225Z
+END:AVAILABLE
+END:VAVAILABILITY
+END:VCALENDAR
+VCAL
+        ));
+
+        // DTSTART is missing.
+        $this->assertIsNotValid(Reader::read(
+<<<VCAL
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//id
+BEGIN:VAVAILABILITY
+UID:foo@test
+DTSTAMP:20111005T133225Z
+BEGIN:AVAILABLE
+UID:foo@test
+DTSTAMP:20111005T133225Z
+END:AVAILABLE
+END:VAVAILABILITY
+END:VCALENDAR
+VCAL
+        ));
+
+    }
+
+    function testRFCxxxSection3_1_available_dtend_duration() {
+
+        // Only DTEND.
+        $this->assertIsValid(Reader::read($this->templateAvailable(array(
+            'DTEND:21111005T133225Z'
+        ))));
+
+        // Only DURATION.
+        $this->assertIsValid(Reader::read($this->templateAvailable(array(
+            'DURATION:PT1H'
+        ))));
+
+        // Both (not allowed).
+        $this->assertIsNotValid(Reader::read($this->templateAvailable(array(
+            'DTEND:21111005T133225Z',
+            'DURATION:PT1H'
+        ))));
+    }
+
+    function testRFCxxxSection3_1_available_optional_once() {
+
+        $properties = array(
+            'CREATED:20111005T135125Z',
+            'DESCRIPTION:Long bla bla',
+            'LAST-MODIFIED:20111005T135325Z',
+            'RECURRENCE-ID;RANGE=THISANDFUTURE:19980401T133000Z',
+            'RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR',
+            'SUMMARY:Bla bla'
+        );
+
+        // They are all present, only once.
+        $this->assertIsValid(Reader::read($this->templateAvailable($properties)));
+
+        // We duplicate each one to see if it fails.
+        foreach ($properties as $property) {
+            $this->assertIsNotValid(Reader::read($this->templateAvailable(array(
+                $property,
+                $property
+            ))));
+        }
+
+    }
+    function testRFCxxxSection3_2() {
+
+        $this->assertEquals(
+            'BUSY',
+            Reader::read($this->templateAvailable(array(
+                'BUSYTYPE:BUSY'
+            )))
+                ->VAVAILABILITY
+                ->AVAILABLE
+                ->BUSYTYPE
+                ->getValue()
+        );
+
+        $this->assertEquals(
+            'BUSY-UNAVAILABLE',
+            Reader::read($this->templateAvailable(array(
+                'BUSYTYPE:BUSY-UNAVAILABLE'
+            )))
+                ->VAVAILABILITY
+                ->AVAILABLE
+                ->BUSYTYPE
+                ->getValue()
+        );
+
+        $this->assertEquals(
+            'BUSY-TENTATIVE',
+            Reader::read($this->templateAvailable(array(
+                'BUSYTYPE:BUSY-TENTATIVE'
+            )))
+                ->VAVAILABILITY
+                ->AVAILABLE
+                ->BUSYTYPE
+                ->getValue()
+        );
+
+    }
+
+    protected function assertIsValid(VObject\Document $document) {
+
+        $this->assertEmpty($document->validate());
+
+    }
+
+    protected function assertIsNotValid(VObject\Document $document) {
+
+        $this->assertNotEmpty($document->validate());
+
+    }
+
+    protected function template(array $properties) {
+
+        return $this->_template(
+            <<<VCAL
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//id
+BEGIN:VAVAILABILITY
+UID:foo@test
+DTSTAMP:20111005T133225Z
+…
+END:VAVAILABILITY
+END:VCALENDAR
+VCAL
+,
+            $properties
+        );
+
+    }
+
+    protected function templateAvailable(array $properties) {
+
+        return $this->_template(
+            <<<VCAL
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//id
+BEGIN:VAVAILABILITY
+UID:foo@test
+DTSTAMP:20111005T133225Z
+BEGIN:AVAILABLE
+UID:foo@test
+DTSTAMP:20111005T133225Z
+DTSTART:20111005T133225Z
+…
+END:AVAILABLE
+END:VAVAILABILITY
+END:VCALENDAR
+VCAL
+,
+            $properties
+        );
+
+    }
+
+    protected function _template($template, array $properties) {
+
+        return str_replace('…', implode("\r\n", $properties), $template);
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Component/VCalendarTest.php b/vendor/sabre/vobject/tests/VObject/Component/VCalendarTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..f3ecfc21ce7d98ba5c93d54e72b75c22b18e81e7
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Component/VCalendarTest.php
@@ -0,0 +1,697 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use DateTimeZone;
+use Sabre\VObject;
+
+class VCalendarTest extends \PHPUnit_Framework_TestCase {
+
+    /**
+     * @dataProvider expandData
+     */
+    public function testExpand($input, $output, $timeZone = 'UTC', $start = '2011-12-01', $end = '2011-12-31') {
+
+        $vcal = VObject\Reader::read($input);
+
+        $timeZone = new DateTimeZone($timeZone);
+
+        $vcal->expand(
+            new \DateTime($start),
+            new \DateTime($end),
+            $timeZone
+        );
+
+        // This will normalize the output
+        $output = VObject\Reader::read($output)->serialize();
+
+        $this->assertEquals($output, $vcal->serialize());
+
+    }
+
+    public function expandData() {
+
+        $tests = array();
+
+        // No data
+        $input = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+END:VCALENDAR
+';
+
+        $output = $input;
+        $tests[] = array($input,$output);
+
+
+        // Simple events
+        $input = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VEVENT
+UID:bla
+SUMMARY:InExpand
+DTSTART;VALUE=DATE:20111202
+END:VEVENT
+BEGIN:VEVENT
+UID:bla2
+SUMMARY:NotInExpand
+DTSTART;VALUE=DATE:20120101
+END:VEVENT
+END:VCALENDAR
+';
+
+        $output = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VEVENT
+UID:bla
+SUMMARY:InExpand
+DTSTART;VALUE=DATE:20111202
+END:VEVENT
+END:VCALENDAR
+';
+
+        $tests[] = array($input, $output);
+
+        // Removing timezone info
+        $input = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:Europe/Paris
+END:VTIMEZONE
+BEGIN:VEVENT
+UID:bla4
+SUMMARY:RemoveTZ info
+DTSTART;TZID=Europe/Paris:20111203T130102
+END:VEVENT
+END:VCALENDAR
+';
+
+        $output = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VEVENT
+UID:bla4
+SUMMARY:RemoveTZ info
+DTSTART:20111203T120102Z
+END:VEVENT
+END:VCALENDAR
+';
+
+        $tests[] = array($input, $output);
+
+        // Recurrence rule
+        $input = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule
+DTSTART:20111125T120000Z
+DTEND:20111125T130000Z
+RRULE:FREQ=WEEKLY
+END:VEVENT
+END:VCALENDAR
+';
+
+        $output = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule
+DTSTART:20111202T120000Z
+DTEND:20111202T130000Z
+RECURRENCE-ID:20111202T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule
+DTSTART:20111209T120000Z
+DTEND:20111209T130000Z
+RECURRENCE-ID:20111209T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule
+DTSTART:20111216T120000Z
+DTEND:20111216T130000Z
+RECURRENCE-ID:20111216T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule
+DTSTART:20111223T120000Z
+DTEND:20111223T130000Z
+RECURRENCE-ID:20111223T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule
+DTSTART:20111230T120000Z
+DTEND:20111230T130000Z
+RECURRENCE-ID:20111230T120000Z
+END:VEVENT
+END:VCALENDAR
+';
+
+        $tests[] = array($input, $output);
+
+        // Recurrence rule + override
+        $input = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule2
+DTSTART:20111125T120000Z
+DTEND:20111125T130000Z
+RRULE:FREQ=WEEKLY
+END:VEVENT
+BEGIN:VEVENT
+UID:bla6
+RECURRENCE-ID:20111209T120000Z
+DTSTART:20111209T140000Z
+DTEND:20111209T150000Z
+SUMMARY:Override!
+END:VEVENT
+END:VCALENDAR
+';
+
+        $output = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule2
+DTSTART:20111202T120000Z
+DTEND:20111202T130000Z
+RECURRENCE-ID:20111202T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:bla6
+RECURRENCE-ID:20111209T120000Z
+DTSTART:20111209T140000Z
+DTEND:20111209T150000Z
+SUMMARY:Override!
+END:VEVENT
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule2
+DTSTART:20111216T120000Z
+DTEND:20111216T130000Z
+RECURRENCE-ID:20111216T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule2
+DTSTART:20111223T120000Z
+DTEND:20111223T130000Z
+RECURRENCE-ID:20111223T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule2
+DTSTART:20111230T120000Z
+DTEND:20111230T130000Z
+RECURRENCE-ID:20111230T120000Z
+END:VEVENT
+END:VCALENDAR
+';
+
+        $tests[] = array($input, $output);
+
+        // Floating dates and times.
+        $input = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:bla1
+DTSTART:20141112T195000
+END:VEVENT
+BEGIN:VEVENT
+UID:bla2
+DTSTART;VALUE=DATE:20141112
+END:VEVENT
+BEGIN:VEVENT
+UID:bla3
+DTSTART;VALUE=DATE:20141112
+RRULE:FREQ=DAILY;COUNT=2
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $output = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:bla1
+DTSTART:20141112T225000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:bla2
+DTSTART;VALUE=DATE:20141112
+END:VEVENT
+BEGIN:VEVENT
+UID:bla3
+DTSTART;VALUE=DATE:20141112
+RECURRENCE-ID;VALUE=DATE:20141112
+END:VEVENT
+BEGIN:VEVENT
+UID:bla3
+DTSTART;VALUE=DATE:20141113
+RECURRENCE-ID;VALUE=DATE:20141113
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $tests[] = array($input, $output, 'America/Argentina/Buenos_Aires', '2014-01-01', '2015-01-01');
+
+        // Recurrence rule with no valid instances
+        $input = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule3
+DTSTART:20111125T120000Z
+DTEND:20111125T130000Z
+RRULE:FREQ=WEEKLY;COUNT=1
+EXDATE:20111125T120000Z
+END:VEVENT
+END:VCALENDAR
+';
+
+        $output = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+END:VCALENDAR
+';
+
+        $tests[] = array($input, $output);
+        return $tests;
+
+    }
+
+    /**
+     * @expectedException LogicException
+     */
+    public function testBrokenEventExpand() {
+
+        $input = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VEVENT
+RRULE:FREQ=WEEKLY
+DTSTART;VALUE=DATE:20111202
+END:VEVENT
+END:VCALENDAR
+';
+        $vcal = VObject\Reader::read($input);
+        $vcal->expand(
+            new \DateTime('2011-12-01'),
+            new \DateTime('2011-12-31')
+        );
+
+    }
+
+    function testGetDocumentType() {
+
+        $vcard = new VCalendar();
+        $vcard->VERSION = '2.0';
+        $this->assertEquals(VCalendar::ICALENDAR20, $vcard->getDocumentType());
+
+    }
+
+    function testValidateCorrect() {
+
+        $input = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+PRODID:foo
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20111202
+DTSTAMP:20140122T233226Z
+UID:foo
+END:VEVENT
+END:VCALENDAR
+';
+
+        $vcal = VObject\Reader::read($input);
+        $this->assertEquals(array(), $vcal->validate(), 'Got an error');
+
+    }
+
+    function testValidateNoVersion() {
+
+        $input = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:foo
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20111202
+UID:foo
+DTSTAMP:20140122T234434Z
+END:VEVENT
+END:VCALENDAR
+';
+
+        $vcal = VObject\Reader::read($input);
+        $this->assertEquals(1, count($vcal->validate()));
+
+    }
+
+    function testValidateWrongVersion() {
+
+        $input = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:3.0
+PRODID:foo
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20111202
+UID:foo
+DTSTAMP:20140122T234434Z
+END:VEVENT
+END:VCALENDAR
+';
+
+        $vcal = VObject\Reader::read($input);
+        $this->assertEquals(1, count($vcal->validate()));
+
+    }
+
+    function testValidateNoProdId() {
+
+        $input = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20111202
+UID:foo
+DTSTAMP:20140122T234434Z
+END:VEVENT
+END:VCALENDAR
+';
+
+        $vcal = VObject\Reader::read($input);
+        $this->assertEquals(1, count($vcal->validate()));
+
+    }
+
+    function testValidateDoubleCalScale() {
+
+        $input = 'BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:foo
+CALSCALE:GREGORIAN
+CALSCALE:GREGORIAN
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20111202
+UID:foo
+DTSTAMP:20140122T234434Z
+END:VEVENT
+END:VCALENDAR
+';
+
+        $vcal = VObject\Reader::read($input);
+        $this->assertEquals(1, count($vcal->validate()));
+
+    }
+
+    function testValidateDoubleMethod() {
+
+        $input = 'BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:foo
+METHOD:REQUEST
+METHOD:REQUEST
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20111202
+UID:foo
+DTSTAMP:20140122T234434Z
+END:VEVENT
+END:VCALENDAR
+';
+
+        $vcal = VObject\Reader::read($input);
+        $this->assertEquals(1, count($vcal->validate()));
+
+    }
+
+    function testValidateTwoMasterEvents() {
+
+        $input = 'BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:foo
+METHOD:REQUEST
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20111202
+UID:foo
+DTSTAMP:20140122T234434Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20111202
+UID:foo
+DTSTAMP:20140122T234434Z
+END:VEVENT
+END:VCALENDAR
+';
+
+        $vcal = VObject\Reader::read($input);
+        $this->assertEquals(1, count($vcal->validate()));
+
+    }
+
+    function testValidateOneMasterEvent() {
+
+        $input = 'BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:foo
+METHOD:REQUEST
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20111202
+UID:foo
+DTSTAMP:20140122T234434Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20111202
+UID:foo
+DTSTAMP:20140122T234434Z
+RECURRENCE-ID;VALUE=DATE:20111202
+END:VEVENT
+END:VCALENDAR
+';
+
+        $vcal = VObject\Reader::read($input);
+        $this->assertEquals(0, count($vcal->validate()));
+
+    }
+
+    function testGetBaseComponent() {
+
+        $input = 'BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:foo
+METHOD:REQUEST
+BEGIN:VEVENT
+SUMMARY:test
+DTSTART;VALUE=DATE:20111202
+UID:foo
+DTSTAMP:20140122T234434Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20111202
+UID:foo
+DTSTAMP:20140122T234434Z
+RECURRENCE-ID;VALUE=DATE:20111202
+END:VEVENT
+END:VCALENDAR
+';
+
+        $vcal = VObject\Reader::read($input);
+
+        $result = $vcal->getBaseComponent();
+        $this->assertEquals('test', $result->SUMMARY->getValue());
+
+    }
+
+    function testGetBaseComponentNoResult() {
+
+        $input = 'BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:foo
+METHOD:REQUEST
+BEGIN:VEVENT
+SUMMARY:test
+RECURRENCE-ID;VALUE=DATE:20111202
+DTSTART;VALUE=DATE:20111202
+UID:foo
+DTSTAMP:20140122T234434Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20111202
+UID:foo
+DTSTAMP:20140122T234434Z
+RECURRENCE-ID;VALUE=DATE:20111202
+END:VEVENT
+END:VCALENDAR
+';
+
+        $vcal = VObject\Reader::read($input);
+
+        $result = $vcal->getBaseComponent();
+        $this->assertNull($result);
+
+    }
+
+    function testNoComponents() {
+
+        $input = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:vobject
+END:VCALENDAR
+ICS;
+
+        $this->assertValidate(
+            $input,
+            0,
+            3,
+           "An iCalendar object must have at least 1 component."
+        );
+
+    }
+
+    function testCalDAVNoComponents() {
+
+        $input = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:vobject
+BEGIN:VTIMEZONE
+TZID:America/Toronto
+END:VTIMEZONE
+END:VCALENDAR
+ICS;
+
+        $this->assertValidate(
+            $input,
+            VCalendar::PROFILE_CALDAV,
+            3,
+           "A calendar object on a CalDAV server must have at least 1 component (VTODO, VEVENT, VJOURNAL)."
+        );
+
+    }
+
+    function testCalDAVMultiUID() {
+
+        $input = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:vobject
+BEGIN:VEVENT
+UID:foo
+DTSTAMP:20150109T184500Z
+DTSTART:20150109T184500Z
+END:VEVENT
+BEGIN:VEVENT
+UID:bar
+DTSTAMP:20150109T184500Z
+DTSTART:20150109T184500Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $this->assertValidate(
+            $input,
+            VCalendar::PROFILE_CALDAV,
+            3,
+           "A calendar object on a CalDAV server may only have components with the same UID."
+        );
+
+    }
+
+    function testCalDAVMultiComponent() {
+
+        $input = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:vobject
+BEGIN:VEVENT
+UID:foo
+RECURRENCE-ID:20150109T185200Z
+DTSTAMP:20150109T184500Z
+DTSTART:20150109T184500Z
+END:VEVENT
+BEGIN:VTODO
+UID:foo
+DTSTAMP:20150109T184500Z
+DTSTART:20150109T184500Z
+END:VTODO
+END:VCALENDAR
+ICS;
+
+        $this->assertValidate(
+            $input,
+            VCalendar::PROFILE_CALDAV,
+            3,
+           "A calendar object on a CalDAV server may only have 1 type of component (VEVENT, VTODO or VJOURNAL)."
+        );
+
+    }
+
+    function testCalDAVMETHOD() {
+
+        $input = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+METHOD:PUBLISH
+PRODID:vobject
+BEGIN:VEVENT
+UID:foo
+RECURRENCE-ID:20150109T185200Z
+DTSTAMP:20150109T184500Z
+DTSTART:20150109T184500Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $this->assertValidate(
+            $input,
+            VCalendar::PROFILE_CALDAV,
+            3,
+           "A calendar object on a CalDAV server MUST NOT have a METHOD property."
+        );
+
+    }
+
+    function assertValidate($ics, $options, $expectedLevel, $expectedMessage = null) {
+
+        $vcal = VObject\Reader::read($ics);
+        $result = $vcal->validate($options);
+
+        $this->assertValidateResult($result, $expectedLevel, $expectedMessage);
+
+    }
+
+    function assertValidateResult($input, $expectedLevel, $expectedMessage = null) {
+
+        $messages = array();
+        foreach($input as $warning) {
+            $messages[] = $warning['message'];
+        }
+
+        if ($expectedLevel === 0) {
+            $this->assertEquals(0, count($input), 'No validation messages were expected. We got: ' . implode(', ', $messages));
+        } else {
+            $this->assertEquals(1, count($input), 'We expected exactly 1 validation message, We got: ' . implode(', ', $messages));
+
+            $this->assertEquals($expectedMessage, $input[0]['message']);
+            $this->assertEquals($expectedLevel, $input[0]['level']);
+        }
+
+    }
+
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Component/VCardTest.php b/vendor/sabre/vobject/tests/VObject/Component/VCardTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..d460ddc3a61a5db19defc67118321f8a7b9e1657
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Component/VCardTest.php
@@ -0,0 +1,288 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject;
+
+class VCardTest extends \PHPUnit_Framework_TestCase {
+
+    /**
+     * @dataProvider validateData
+     */
+    function testValidate($input, $expectedWarnings, $expectedRepairedOutput) {
+
+        $vcard = VObject\Reader::read($input);
+
+        $warnings = $vcard->validate();
+
+        $warnMsg = array();
+        foreach($warnings as $warning) {
+            $warnMsg[] = $warning['message'];
+        }
+
+        $this->assertEquals($expectedWarnings, $warnMsg);
+
+        $vcard->validate(VObject\Component::REPAIR);
+
+        $this->assertEquals(
+            $expectedRepairedOutput,
+            $vcard->serialize()
+        );
+
+    }
+
+    public function validateData() {
+
+        $tests = array();
+
+        // Correct
+        $tests[] = array(
+            "BEGIN:VCARD\r\nVERSION:4.0\r\nFN:John Doe\r\nUID:foo\r\nEND:VCARD\r\n",
+            array(),
+            "BEGIN:VCARD\r\nVERSION:4.0\r\nFN:John Doe\r\nUID:foo\r\nEND:VCARD\r\n",
+        );
+
+        // No VERSION
+        $tests[] = array(
+            "BEGIN:VCARD\r\nFN:John Doe\r\nUID:foo\r\nEND:VCARD\r\n",
+            array(
+                'VERSION MUST appear exactly once in a VCARD component',
+            ),
+            "BEGIN:VCARD\r\nVERSION:3.0\r\nFN:John Doe\r\nUID:foo\r\nEND:VCARD\r\n",
+        );
+
+        // Unknown version
+        $tests[] = array(
+            "BEGIN:VCARD\r\nVERSION:2.2\r\nFN:John Doe\r\nUID:foo\r\nEND:VCARD\r\n",
+            array(
+                'Only vcard version 4.0 (RFC6350), version 3.0 (RFC2426) or version 2.1 (icm-vcard-2.1) are supported.',
+            ),
+            "BEGIN:VCARD\r\nVERSION:2.1\r\nFN:John Doe\r\nUID:foo\r\nEND:VCARD\r\n",
+        );
+
+        // No FN
+        $tests[] = array(
+            "BEGIN:VCARD\r\nVERSION:4.0\r\nUID:foo\r\nEND:VCARD\r\n",
+            array(
+                'The FN property must appear in the VCARD component exactly 1 time',
+            ),
+            "BEGIN:VCARD\r\nVERSION:4.0\r\nUID:foo\r\nEND:VCARD\r\n",
+        );
+        // No FN, N fallback
+        $tests[] = array(
+            "BEGIN:VCARD\r\nVERSION:4.0\r\nUID:foo\r\nN:Doe;John;;;;;\r\nEND:VCARD\r\n",
+            array(
+                'The FN property must appear in the VCARD component exactly 1 time',
+            ),
+            "BEGIN:VCARD\r\nVERSION:4.0\r\nUID:foo\r\nN:Doe;John;;;;;\r\nFN:John Doe\r\nEND:VCARD\r\n",
+        );
+        // No FN, N fallback, no first name
+        $tests[] = array(
+            "BEGIN:VCARD\r\nVERSION:4.0\r\nUID:foo\r\nN:Doe;;;;;;\r\nEND:VCARD\r\n",
+            array(
+                'The FN property must appear in the VCARD component exactly 1 time',
+            ),
+            "BEGIN:VCARD\r\nVERSION:4.0\r\nUID:foo\r\nN:Doe;;;;;;\r\nFN:Doe\r\nEND:VCARD\r\n",
+        );
+
+        // No FN, ORG fallback
+        $tests[] = array(
+            "BEGIN:VCARD\r\nVERSION:4.0\r\nUID:foo\r\nORG:Acme Co.\r\nEND:VCARD\r\n",
+            array(
+                'The FN property must appear in the VCARD component exactly 1 time',
+            ),
+            "BEGIN:VCARD\r\nVERSION:4.0\r\nUID:foo\r\nORG:Acme Co.\r\nFN:Acme Co.\r\nEND:VCARD\r\n",
+        );
+        return $tests;
+
+    }
+
+    function testGetDocumentType() {
+
+        $vcard = new VCard(array(), false);
+        $vcard->VERSION = '2.1';
+        $this->assertEquals(VCard::VCARD21, $vcard->getDocumentType());
+
+        $vcard = new VCard(array(), false);
+        $vcard->VERSION = '3.0';
+        $this->assertEquals(VCard::VCARD30, $vcard->getDocumentType());
+
+        $vcard = new VCard(array(), false);
+        $vcard->VERSION = '4.0';
+        $this->assertEquals(VCard::VCARD40, $vcard->getDocumentType());
+
+        $vcard = new VCard(array(), false);
+        $this->assertEquals(VCard::UNKNOWN, $vcard->getDocumentType());
+    }
+
+    function testPreferredNoPref() {
+
+        $vcard = <<<VCF
+BEGIN:VCARD
+VERSION:3.0
+EMAIL:1@example.org
+EMAIL:2@example.org
+END:VCARD
+VCF;
+
+        $vcard = VObject\Reader::read($vcard);
+        $this->assertEquals('1@example.org', $vcard->preferred('EMAIL')->getValue());
+
+    }
+
+    function testPreferredWithPref() {
+
+        $vcard = <<<VCF
+BEGIN:VCARD
+VERSION:3.0
+EMAIL:1@example.org
+EMAIL;TYPE=PREF:2@example.org
+END:VCARD
+VCF;
+
+        $vcard = VObject\Reader::read($vcard);
+        $this->assertEquals('2@example.org', $vcard->preferred('EMAIL')->getValue());
+
+    }
+
+    function testPreferredWith40Pref() {
+
+        $vcard = <<<VCF
+BEGIN:VCARD
+VERSION:4.0
+EMAIL:1@example.org
+EMAIL;PREF=3:2@example.org
+EMAIL;PREF=2:3@example.org
+END:VCARD
+VCF;
+
+        $vcard = VObject\Reader::read($vcard);
+        $this->assertEquals('3@example.org', $vcard->preferred('EMAIL')->getValue());
+
+    }
+
+    function testPreferredNotFound() {
+
+        $vcard = <<<VCF
+BEGIN:VCARD
+VERSION:4.0
+END:VCARD
+VCF;
+
+        $vcard = VObject\Reader::read($vcard);
+        $this->assertNull($vcard->preferred('EMAIL'));
+
+    }
+
+    function testNoUIDCardDAV() {
+
+        $vcard = <<<VCF
+BEGIN:VCARD
+VERSION:4.0
+FN:John Doe
+END:VCARD
+VCF;
+        $this->assertValidate(
+            $vcard,
+            VCARD::PROFILE_CARDDAV,
+            3,
+            'vCards on CardDAV servers MUST have a UID property.'
+        );
+
+    }
+
+    function testNoUIDNoCardDAV() {
+
+        $vcard = <<<VCF
+BEGIN:VCARD
+VERSION:4.0
+FN:John Doe
+END:VCARD
+VCF;
+        $this->assertValidate(
+            $vcard,
+            0,
+            2,
+            'Adding a UID to a vCard property is recommended.'
+        );
+
+    }
+    function testNoUIDNoCardDAVRepair() {
+
+        $vcard = <<<VCF
+BEGIN:VCARD
+VERSION:4.0
+FN:John Doe
+END:VCARD
+VCF;
+        $this->assertValidate(
+            $vcard,
+            VCARD::REPAIR,
+            1,
+            'Adding a UID to a vCard property is recommended.'
+        );
+
+    }
+
+    function testVCard21CardDAV() {
+
+        $vcard = <<<VCF
+BEGIN:VCARD
+VERSION:2.1
+FN:John Doe
+UID:foo
+END:VCARD
+VCF;
+        $this->assertValidate(
+            $vcard,
+            VCARD::PROFILE_CARDDAV,
+            3,
+            'CardDAV servers are not allowed to accept vCard 2.1.'
+        );
+
+    }
+
+    function testVCard21NoCardDAV() {
+
+        $vcard = <<<VCF
+BEGIN:VCARD
+VERSION:2.1
+FN:John Doe
+UID:foo
+END:VCARD
+VCF;
+        $this->assertValidate(
+            $vcard,
+            0,
+            0
+        );
+
+    }
+
+    function assertValidate($vcf, $options, $expectedLevel, $expectedMessage = null) {
+
+        $vcal = VObject\Reader::read($vcf);
+        $result = $vcal->validate($options);
+
+        $this->assertValidateResult($result, $expectedLevel, $expectedMessage);
+
+    }
+
+    function assertValidateResult($input, $expectedLevel, $expectedMessage = null) {
+
+        $messages = array();
+        foreach($input as $warning) {
+            $messages[] = $warning['message'];
+        }
+
+        if ($expectedLevel === 0) {
+            $this->assertEquals(0, count($input), 'No validation messages were expected. We got: ' . implode(', ', $messages));
+        } else {
+            $this->assertEquals(1, count($input), 'We expected exactly 1 validation message, We got: ' . implode(', ', $messages));
+
+            $this->assertEquals($expectedMessage, $input[0]['message']);
+            $this->assertEquals($expectedLevel, $input[0]['level']);
+        }
+
+    }
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Component/VEventTest.php b/vendor/sabre/vobject/tests/VObject/Component/VEventTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b3eec3ef95ce60001cd3012e11b167bc526b3054
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Component/VEventTest.php
@@ -0,0 +1,90 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject;
+
+class VEventTest extends \PHPUnit_Framework_TestCase {
+
+    /**
+     * @dataProvider timeRangeTestData
+     */
+    public function testInTimeRange(VEvent $vevent,$start,$end,$outcome) {
+
+        $this->assertEquals($outcome, $vevent->isInTimeRange($start, $end));
+
+    }
+
+    public function timeRangeTestData() {
+
+        $tests = array();
+
+        $calendar = new VCalendar();
+
+        $vevent = $calendar->createComponent('VEVENT');
+        $vevent->DTSTART = '20111223T120000Z';
+        $tests[] = array($vevent, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+        $tests[] = array($vevent, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+        $vevent2 = clone $vevent;
+        $vevent2->DTEND = '20111225T120000Z';
+        $tests[] = array($vevent2, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+        $tests[] = array($vevent2, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+        $vevent3 = clone $vevent;
+        $vevent3->DURATION = 'P1D';
+        $tests[] = array($vevent3, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+        $tests[] = array($vevent3, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+        $vevent4 = clone $vevent;
+        $vevent4->DTSTART = '20111225';
+        $vevent4->DTSTART['VALUE'] = 'DATE';
+        $tests[] = array($vevent4, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+        $tests[] = array($vevent4, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+        // Event with no end date should be treated as lasting the entire day.
+        $tests[] = array($vevent4, new \DateTime('2011-12-25 16:00:00'), new \DateTime('2011-12-25 17:00:00'), true);
+        // DTEND is non inclusive so all day events should not be returned on the next day.
+        $tests[] = array($vevent4, new \DateTime('2011-12-26 00:00:00'), new \DateTime('2011-12-26 17:00:00'), false);
+        // The timezone of timerange in question also needs to be considered.
+        $tests[] = array($vevent4, new \DateTime('2011-12-26 00:00:00', new \DateTimeZone('Europe/Berlin')), new \DateTime('2011-12-26 17:00:00', new \DateTimeZone('Europe/Berlin')), false);
+
+        $vevent5 = clone $vevent;
+        $vevent5->DURATION = 'P1D';
+        $vevent5->RRULE = 'FREQ=YEARLY';
+        $tests[] = array($vevent5, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+        $tests[] = array($vevent5, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+        $tests[] = array($vevent5, new \DateTime('2013-12-01'), new \DateTime('2013-12-31'), true);
+
+        $vevent6 = clone $vevent;
+        $vevent6->DTSTART = '20111225';
+        $vevent6->DTSTART['VALUE'] = 'DATE';
+        $vevent6->DTEND   = '20111225';
+        $vevent6->DTEND['VALUE'] = 'DATE';
+
+        $tests[] = array($vevent6, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+        $tests[] = array($vevent6, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+        // Added this test to ensure that recurrence rules with no DTEND also 
+        // get checked for the entire day.
+        $vevent7 = clone $vevent;
+        $vevent7->DTSTART = '20120101';
+        $vevent7->DTSTART['VALUE'] = 'DATE';
+        $vevent7->RRULE = 'FREQ=MONTHLY';
+        $tests[] = array($vevent7, new \DateTime('2012-02-01 15:00:00'), new \DateTime('2012-02-02'), true);
+        // The timezone of timerange in question should also be considered.
+
+        // Added this test to check recurring events that have no instances.
+        $vevent8 = clone $vevent;
+        $vevent8->DTSTART = '20130329T140000';
+        $vevent8->DTEND = '20130329T153000';
+        $vevent8->RRULE = array('FREQ' => 'WEEKLY', 'BYDAY' => array('FR'), 'UNTIL' => '20130412T115959Z');
+        $vevent8->add('EXDATE', '20130405T140000');
+        $vevent8->add('EXDATE', '20130329T140000');
+        $tests[] = array($vevent8, new \DateTime('2013-03-01'), new \DateTime('2013-04-01'), false);
+
+        return $tests;
+
+    }
+
+}
+
diff --git a/vendor/sabre/vobject/tests/VObject/Component/VFreeBusyTest.php b/vendor/sabre/vobject/tests/VObject/Component/VFreeBusyTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..46acc69fc8457e9a7e32e7528f298bbb64105e3b
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Component/VFreeBusyTest.php
@@ -0,0 +1,66 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject;
+use Sabre\VObject\Reader;
+
+class VFreeBusyTest extends \PHPUnit_Framework_TestCase {
+
+    function testIsFree() {
+
+        $input = <<<BLA
+BEGIN:VCALENDAR
+BEGIN:VFREEBUSY
+FREEBUSY;FBTYPE=FREE:20120912T000500Z/PT1H
+FREEBUSY;FBTYPE=BUSY:20120912T010000Z/20120912T020000Z
+FREEBUSY;FBTYPE=BUSY-TENTATIVE:20120912T020000Z/20120912T030000Z
+FREEBUSY;FBTYPE=BUSY-UNAVAILABLE:20120912T030000Z/20120912T040000Z
+FREEBUSY;FBTYPE=BUSY:20120912T050000Z/20120912T060000Z,20120912T080000Z/20120912T090000Z
+FREEBUSY;FBTYPE=BUSY:20120912T100000Z/PT1H
+END:VFREEBUSY
+END:VCALENDAR
+BLA;
+
+        $obj = VObject\Reader::read($input);
+        $vfb = $obj->VFREEBUSY;
+
+        $tz = new \DateTimeZone('UTC');
+
+        $this->assertFalse($vfb->isFree(new \DateTime('2012-09-12 01:15:00', $tz), new \DateTime('2012-09-12 01:45:00', $tz)));
+        $this->assertFalse($vfb->isFree(new \DateTime('2012-09-12 08:05:00', $tz), new \DateTime('2012-09-12 08:10:00', $tz)));
+        $this->assertFalse($vfb->isFree(new \DateTime('2012-09-12 10:15:00', $tz), new \DateTime('2012-09-12 10:45:00', $tz)));
+
+        // Checking whether the end time is treated as non-inclusive
+        $this->assertTrue($vfb->isFree(new \DateTime('2012-09-12 09:00:00', $tz), new \DateTime('2012-09-12 09:15:00', $tz)));
+        $this->assertTrue($vfb->isFree(new \DateTime('2012-09-12 09:45:00', $tz), new \DateTime('2012-09-12 10:00:00', $tz)));
+        $this->assertTrue($vfb->isFree(new \DateTime('2012-09-12 11:00:00', $tz), new \DateTime('2012-09-12 12:00:00', $tz)));
+
+    }
+
+    public function testValidate() {
+
+        $input = <<<HI
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:YoYo
+BEGIN:VFREEBUSY
+UID:some-random-id
+DTSTAMP:20140402T180200Z
+END:VFREEBUSY
+END:VCALENDAR
+HI;
+
+        $obj = Reader::read($input);
+
+        $warnings = $obj->validate();
+        $messages = array();
+        foreach($warnings as $warning) {
+            $messages[] = $warning['message'];
+        }
+
+        $this->assertEquals(array(), $messages);
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Component/VJournalTest.php b/vendor/sabre/vobject/tests/VObject/Component/VJournalTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..10fc49fd433d31ed2ffe58fec8a06712d8fb0bac
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Component/VJournalTest.php
@@ -0,0 +1,101 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject\Component;
+use Sabre\VObject\Reader;
+
+class VJournalTest extends \PHPUnit_Framework_TestCase {
+
+    /**
+     * @dataProvider timeRangeTestData
+     */
+    public function testInTimeRange(VJournal $vtodo,$start,$end,$outcome) {
+
+        $this->assertEquals($outcome, $vtodo->isInTimeRange($start, $end));
+
+    }
+
+    public function testValidate() {
+
+        $input = <<<HI
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:YoYo
+BEGIN:VJOURNAL
+UID:12345678
+DTSTAMP:20140402T174100Z
+END:VJOURNAL
+END:VCALENDAR
+HI;
+
+        $obj = Reader::read($input);
+
+        $warnings = $obj->validate();
+        $messages = array();
+        foreach($warnings as $warning) {
+            $messages[] = $warning['message'];
+        }
+
+        $this->assertEquals(array(), $messages);
+
+    }
+
+    public function testValidateBroken() {
+
+        $input = <<<HI
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:YoYo
+BEGIN:VJOURNAL
+UID:12345678
+DTSTAMP:20140402T174100Z
+URL:http://example.org/
+URL:http://example.com/
+END:VJOURNAL
+END:VCALENDAR
+HI;
+
+        $obj = Reader::read($input);
+
+        $warnings = $obj->validate();
+        $messages = array();
+        foreach($warnings as $warning) {
+            $messages[] = $warning['message'];
+        }
+
+        $this->assertEquals(
+            array("URL MUST NOT appear more than once in a VJOURNAL component"),
+            $messages
+        );
+
+    }
+
+    public function timeRangeTestData() {
+
+        $calendar = new VCalendar();
+
+        $tests = array();
+
+        $vjournal = $calendar->createComponent('VJOURNAL');
+        $vjournal->DTSTART = '20111223T120000Z';
+        $tests[] = array($vjournal, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+        $tests[] = array($vjournal, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+        $vjournal2 = $calendar->createComponent('VJOURNAL');
+        $vjournal2->DTSTART = '20111223';
+        $vjournal2->DTSTART['VALUE'] = 'DATE';
+        $tests[] = array($vjournal2, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+        $tests[] = array($vjournal2, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+        $vjournal3 = $calendar->createComponent('VJOURNAL');
+        $tests[] = array($vjournal3, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), false);
+        $tests[] = array($vjournal3, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+        return $tests;
+    }
+
+
+
+}
+
diff --git a/vendor/sabre/vobject/tests/VObject/Component/VTimeZoneTest.php b/vendor/sabre/vobject/tests/VObject/Component/VTimeZoneTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..92d07f880b267c4f809ec8b04ec50757c4787c19
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Component/VTimeZoneTest.php
@@ -0,0 +1,57 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject;
+use Sabre\VObject\Reader;
+
+class VTimeZoneTest extends \PHPUnit_Framework_TestCase {
+
+    function testValidate() {
+
+        $input = <<<HI
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:YoYo
+BEGIN:VTIMEZONE
+TZID:America/Toronto
+END:VTIMEZONE
+END:VCALENDAR
+HI;
+
+        $obj = Reader::read($input);
+
+        $warnings = $obj->validate();
+        $messages = array();
+        foreach($warnings as $warning) {
+            $messages[] = $warning['message'];
+        }
+
+        $this->assertEquals(array(), $messages);
+
+    }
+
+    function testGetTimeZone() {
+
+        $input = <<<HI
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:YoYo
+BEGIN:VTIMEZONE
+TZID:America/Toronto
+END:VTIMEZONE
+END:VCALENDAR
+HI;
+
+        $obj = Reader::read($input);
+
+        $tz = new \DateTimeZone('America/Toronto');
+
+        $this->assertEquals(
+            $tz,
+            $obj->VTIMEZONE->getTimeZone()
+        );
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Component/VTodoTest.php b/vendor/sabre/vobject/tests/VObject/Component/VTodoTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..e536e7bf76eeb0ef48ebb87cd8284bc63600bce1
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Component/VTodoTest.php
@@ -0,0 +1,180 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use
+    Sabre\VObject\Component,
+    Sabre\VObject\Reader;
+
+class VTodoTest extends \PHPUnit_Framework_TestCase {
+
+    /**
+     * @dataProvider timeRangeTestData
+     */
+    public function testInTimeRange(VTodo $vtodo,$start,$end,$outcome) {
+
+        $this->assertEquals($outcome, $vtodo->isInTimeRange($start, $end));
+
+    }
+
+    public function timeRangeTestData() {
+
+        $tests = array();
+
+        $calendar = new VCalendar();
+
+        $vtodo = $calendar->createComponent('VTODO');
+        $vtodo->DTSTART = '20111223T120000Z';
+        $tests[] = array($vtodo, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+        $tests[] = array($vtodo, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+        $vtodo2 = clone $vtodo;
+        $vtodo2->DURATION = 'P1D';
+        $tests[] = array($vtodo2, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+        $tests[] = array($vtodo2, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+        $vtodo3 = clone $vtodo;
+        $vtodo3->DUE = '20111225';
+        $tests[] = array($vtodo3, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+        $tests[] = array($vtodo3, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+        $vtodo4 = $calendar->createComponent('VTODO');
+        $vtodo4->DUE = '20111225';
+        $tests[] = array($vtodo4, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+        $tests[] = array($vtodo4, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+        $vtodo5 = $calendar->createComponent('VTODO');
+        $vtodo5->COMPLETED = '20111225';
+        $tests[] = array($vtodo5, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+        $tests[] = array($vtodo5, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+        $vtodo6 = $calendar->createComponent('VTODO');
+        $vtodo6->CREATED = '20111225';
+        $tests[] = array($vtodo6, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+        $tests[] = array($vtodo6, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+        $vtodo7 = $calendar->createComponent('VTODO');
+        $vtodo7->CREATED = '20111225';
+        $vtodo7->COMPLETED = '20111226';
+        $tests[] = array($vtodo7, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+        $tests[] = array($vtodo7, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+        $vtodo7 = $calendar->createComponent('VTODO');
+        $tests[] = array($vtodo7, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+        $tests[] = array($vtodo7, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), true);
+
+        return $tests;
+
+    }
+
+    public function testValidate() {
+
+        $input = <<<HI
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:YoYo
+BEGIN:VTODO
+UID:1234-21355-123156
+DTSTAMP:20140402T183400Z
+END:VTODO
+END:VCALENDAR
+HI;
+
+        $obj = Reader::read($input);
+
+        $warnings = $obj->validate();
+        $messages = array();
+        foreach($warnings as $warning) {
+            $messages[] = $warning['message'];
+        }
+
+        $this->assertEquals(array(), $messages);
+
+    }
+
+    public function testValidateInvalid() {
+
+        $input = <<<HI
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:YoYo
+BEGIN:VTODO
+END:VTODO
+END:VCALENDAR
+HI;
+
+        $obj = Reader::read($input);
+
+        $warnings = $obj->validate();
+        $messages = array();
+        foreach($warnings as $warning) {
+            $messages[] = $warning['message'];
+        }
+
+        $this->assertEquals(array(
+            "UID MUST appear exactly once in a VTODO component",
+            "DTSTAMP MUST appear exactly once in a VTODO component",
+        ), $messages);
+
+    }
+
+    public function testValidateDUEDTSTARTMisMatch() {
+
+        $input = <<<HI
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:YoYo
+BEGIN:VTODO
+UID:FOO
+DTSTART;VALUE=DATE-TIME:20140520T131600Z
+DUE;VALUE=DATE:20140520
+DTSTAMP;VALUE=DATE-TIME:20140520T131600Z
+END:VTODO
+END:VCALENDAR
+HI;
+
+        $obj = Reader::read($input);
+
+        $warnings = $obj->validate();
+        $messages = array();
+        foreach($warnings as $warning) {
+            $messages[] = $warning['message'];
+        }
+
+        $this->assertEquals(array(
+            "The value type (DATE or DATE-TIME) must be identical for DUE and DTSTART",
+        ), $messages);
+
+    }
+
+    public function testValidateDUEbeforeDTSTART() {
+
+        $input = <<<HI
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:YoYo
+BEGIN:VTODO
+UID:FOO
+DTSTART;VALUE=DATE:20140520
+DUE;VALUE=DATE:20140518
+DTSTAMP;VALUE=DATE-TIME:20140520T131600Z
+END:VTODO
+END:VCALENDAR
+HI;
+
+        $obj = Reader::read($input);
+
+        $warnings = $obj->validate();
+        $messages = array();
+        foreach($warnings as $warning) {
+            $messages[] = $warning['message'];
+        }
+
+        $this->assertEquals(array(
+            "DUE must occur after DTSTART",
+        ), $messages);
+
+    }
+
+}
+
diff --git a/vendor/sabre/vobject/tests/VObject/ComponentTest.php b/vendor/sabre/vobject/tests/VObject/ComponentTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..3bbe4d866d7201962d84a34b9988de01fd228e52
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/ComponentTest.php
@@ -0,0 +1,528 @@
+<?php
+
+namespace Sabre\VObject;
+
+use
+    Sabre\VObject\Component\VCalendar,
+    Sabre\VObject\Component\VCard;
+
+class ComponentTest extends \PHPUnit_Framework_TestCase {
+
+    function testIterate() {
+
+        $comp = new VCalendar(array(), false);
+
+        $sub = $comp->createComponent('VEVENT');
+        $comp->add($sub);
+
+        $sub = $comp->createComponent('VTODO');
+        $comp->add($sub);
+
+        $count = 0;
+        foreach($comp->children() as $key=>$subcomponent) {
+
+           $count++;
+           $this->assertInstanceOf('Sabre\\VObject\\Component',$subcomponent);
+
+        }
+        $this->assertEquals(2,$count);
+        $this->assertEquals(1,$key);
+
+    }
+
+    function testMagicGet() {
+
+        $comp = new VCalendar(array(), false);
+
+        $sub = $comp->createComponent('VEVENT');
+        $comp->add($sub);
+
+        $sub = $comp->createComponent('VTODO');
+        $comp->add($sub);
+
+        $event = $comp->vevent;
+        $this->assertInstanceOf('Sabre\\VObject\\Component', $event);
+        $this->assertEquals('VEVENT', $event->name);
+
+        $this->assertInternalType('null', $comp->vjournal);
+
+    }
+
+    function testMagicGetGroups() {
+
+        $comp = new VCard();
+
+        $sub = $comp->createProperty('GROUP1.EMAIL','1@1.com');
+        $comp->add($sub);
+
+        $sub = $comp->createProperty('GROUP2.EMAIL','2@2.com');
+        $comp->add($sub);
+
+        $sub = $comp->createProperty('EMAIL','3@3.com');
+        $comp->add($sub);
+
+        $emails = $comp->email;
+        $this->assertEquals(3, count($emails));
+
+        $email1 = $comp->{"group1.email"};
+        $this->assertEquals('EMAIL', $email1[0]->name);
+        $this->assertEquals('GROUP1', $email1[0]->group);
+
+        $email3 = $comp->{".email"};
+        $this->assertEquals('EMAIL', $email3[0]->name);
+        $this->assertEquals(null, $email3[0]->group);
+
+    }
+
+    function testMagicIsset() {
+
+        $comp = new VCalendar();
+
+        $sub = $comp->createComponent('VEVENT');
+        $comp->add($sub);
+
+        $sub = $comp->createComponent('VTODO');
+        $comp->add($sub);
+
+        $this->assertTrue(isset($comp->vevent));
+        $this->assertTrue(isset($comp->vtodo));
+        $this->assertFalse(isset($comp->vjournal));
+
+    }
+
+    function testMagicSetScalar() {
+
+        $comp = new VCalendar();
+        $comp->myProp = 'myValue';
+
+        $this->assertInstanceOf('Sabre\\VObject\\Property',$comp->MYPROP);
+        $this->assertEquals('myValue',(string)$comp->MYPROP);
+
+
+    }
+
+    function testMagicSetScalarTwice() {
+
+        $comp = new VCalendar(array(), false);
+        $comp->myProp = 'myValue';
+        $comp->myProp = 'myValue';
+
+        $this->assertEquals(1,count($comp->children()));
+        $this->assertInstanceOf('Sabre\\VObject\\Property',$comp->MYPROP);
+        $this->assertEquals('myValue',(string)$comp->MYPROP);
+
+    }
+
+    function testMagicSetArray() {
+
+        $comp = new VCalendar();
+        $comp->ORG = array('Acme Inc', 'Section 9');
+
+        $this->assertInstanceOf('Sabre\\VObject\\Property',$comp->ORG);
+        $this->assertEquals(array('Acme Inc', 'Section 9'),$comp->ORG->getParts());
+
+    }
+
+    function testMagicSetComponent() {
+
+        $comp = new VCalendar();
+
+        // Note that 'myProp' is ignored here.
+        $comp->myProp = $comp->createComponent('VEVENT');
+
+        $this->assertEquals(1, count($comp));
+
+        $this->assertEquals('VEVENT',$comp->VEVENT->name);
+
+    }
+
+    function testMagicSetTwice() {
+
+        $comp = new VCalendar(array(), false);
+
+        $comp->VEVENT = $comp->createComponent('VEVENT');
+        $comp->VEVENT = $comp->createComponent('VEVENT');
+
+        $this->assertEquals(1, count($comp->children()));
+
+        $this->assertEquals('VEVENT',$comp->VEVENT->name);
+
+    }
+
+    function testArrayAccessGet() {
+
+        $comp = new VCalendar(array(), false);
+
+        $event = $comp->createComponent('VEVENT');
+        $event->summary = 'Event 1';
+
+        $comp->add($event);
+
+        $event2 = clone $event;
+        $event2->summary = 'Event 2';
+
+        $comp->add($event2);
+
+        $this->assertEquals(2,count($comp->children()));
+        $this->assertTrue($comp->vevent[1] instanceof Component);
+        $this->assertEquals('Event 2', (string)$comp->vevent[1]->summary);
+
+    }
+
+    function testArrayAccessExists() {
+
+        $comp = new VCalendar();
+
+        $event = $comp->createComponent('VEVENT');
+        $event->summary = 'Event 1';
+
+        $comp->add($event);
+
+        $event2 = clone $event;
+        $event2->summary = 'Event 2';
+
+        $comp->add($event2);
+
+        $this->assertTrue(isset($comp->vevent[0]));
+        $this->assertTrue(isset($comp->vevent[1]));
+
+    }
+
+    /**
+     * @expectedException LogicException
+     */
+    function testArrayAccessSet() {
+
+        $comp = new VCalendar();
+        $comp['hey'] = 'hi there';
+
+    }
+    /**
+     * @expectedException LogicException
+     */
+    function testArrayAccessUnset() {
+
+        $comp = new VCalendar();
+        unset($comp[0]);
+
+    }
+
+    function testAddScalar() {
+
+        $comp = new VCalendar(array(), false);
+
+        $comp->add('myprop','value');
+
+        $this->assertEquals(1, count($comp->children()));
+
+        $bla = $comp->children[0];
+
+        $this->assertTrue($bla instanceof Property);
+        $this->assertEquals('MYPROP',$bla->name);
+        $this->assertEquals('value',(string)$bla);
+
+    }
+
+    function testAddScalarParams() {
+
+        $comp = new VCalendar(array(), false);
+
+        $comp->add('myprop','value',array('param1'=>'value1'));
+
+        $this->assertEquals(1, count($comp->children()));
+
+        $bla = $comp->children[0];
+
+        $this->assertInstanceOf('Sabre\\VObject\\Property', $bla);
+        $this->assertEquals('MYPROP',$bla->name);
+        $this->assertEquals('value', (string)$bla);
+
+        $this->assertEquals(1, count($bla->parameters()));
+
+        $this->assertEquals('PARAM1',$bla->parameters['PARAM1']->name);
+        $this->assertEquals('value1',$bla->parameters['PARAM1']->getValue());
+
+    }
+
+
+    function testAddComponent() {
+
+        $comp = new VCalendar(array(), false);
+
+        $comp->add($comp->createComponent('VEVENT'));
+
+        $this->assertEquals(1, count($comp->children()));
+
+        $this->assertEquals('VEVENT',$comp->VEVENT->name);
+
+    }
+
+    function testAddComponentTwice() {
+
+        $comp = new VCalendar(array(), false);
+
+        $comp->add($comp->createComponent('VEVENT'));
+        $comp->add($comp->createComponent('VEVENT'));
+
+        $this->assertEquals(2, count($comp->children()));
+
+        $this->assertEquals('VEVENT',$comp->VEVENT->name);
+
+    }
+
+    /**
+     * @expectedException InvalidArgumentException
+     */
+    function testAddArgFail() {
+
+        $comp = new VCalendar();
+        $comp->add($comp->createComponent('VEVENT'),'hello');
+
+    }
+
+    /**
+     * @expectedException InvalidArgumentException
+     */
+    function testAddArgFail2() {
+
+        $comp = new VCalendar();
+        $comp->add(array());
+
+    }
+
+    function testMagicUnset() {
+
+        $comp = new VCalendar(array(), false);
+        $comp->add($comp->createComponent('VEVENT'));
+
+        unset($comp->vevent);
+
+        $this->assertEquals(0, count($comp->children()));
+
+    }
+
+
+    function testCount() {
+
+        $comp = new VCalendar();
+        $this->assertEquals(1,$comp->count());
+
+    }
+
+    function testChildren() {
+
+        $comp = new VCalendar(array(), false);
+
+        // Note that 'myProp' is ignored here.
+        $comp->add($comp->createComponent('VEVENT'));
+        $comp->add($comp->createComponent('VTODO'));
+
+        $r = $comp->children();
+        $this->assertInternalType('array', $r);
+        $this->assertEquals(2,count($r));
+    }
+
+    function testGetComponents() {
+
+        $comp = new VCalendar();
+
+        $comp->add($comp->createProperty('FOO','BAR'));
+        $comp->add($comp->createComponent('VTODO'));
+
+        $r = $comp->getComponents();
+        $this->assertInternalType('array', $r);
+        $this->assertEquals(1, count($r));
+        $this->assertEquals('VTODO', $r[0]->name);
+    }
+
+    function testSerialize() {
+
+        $comp = new VCalendar(array(), false);
+        $this->assertEquals("BEGIN:VCALENDAR\r\nEND:VCALENDAR\r\n", $comp->serialize());
+
+    }
+
+    function testSerializeChildren() {
+
+        $comp = new VCalendar(array(), false);
+        $event = $comp->add($comp->createComponent('VEVENT'));
+        unset($event->DTSTAMP, $event->UID);
+        $comp->add($comp->createComponent('VTODO'));
+
+        $str = $comp->serialize();
+
+        $this->assertEquals("BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nEND:VEVENT\r\nBEGIN:VTODO\r\nEND:VTODO\r\nEND:VCALENDAR\r\n", $str);
+
+    }
+
+    function testSerializeOrderCompAndProp() {
+
+        $comp = new VCalendar(array(), false);
+        $comp->add($event = $comp->createComponent('VEVENT'));
+        $comp->add('PROP1','BLABLA');
+        $comp->add('VERSION','2.0');
+        $comp->add($comp->createComponent('VTIMEZONE'));
+
+        unset($event->DTSTAMP, $event->UID);
+        $str = $comp->serialize();
+
+        $this->assertEquals("BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPROP1:BLABLA\r\nBEGIN:VTIMEZONE\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", $str);
+
+    }
+
+    function testAnotherSerializeOrderProp() {
+
+        $prop4s=array('1', '2', '3', '4', '5', '6', '7', '8', '9', '10');
+
+        $comp = new VCard(array(), false);
+
+        $comp->__set('SOMEPROP','FOO');
+        $comp->__set('ANOTHERPROP','FOO');
+        $comp->__set('THIRDPROP','FOO');
+        foreach ($prop4s as $prop4) {
+            $comp->add('PROP4', 'FOO '.$prop4);
+        }
+        $comp->__set('PROPNUMBERFIVE', 'FOO');
+        $comp->__set('PROPNUMBERSIX', 'FOO');
+        $comp->__set('PROPNUMBERSEVEN', 'FOO');
+        $comp->__set('PROPNUMBEREIGHT', 'FOO');
+        $comp->__set('PROPNUMBERNINE', 'FOO');
+        $comp->__set('PROPNUMBERTEN', 'FOO');
+        $comp->__set('VERSION','2.0');
+        $comp->__set('UID', 'FOO');
+
+        $str = $comp->serialize();
+
+        $this->assertEquals("BEGIN:VCARD\r\nVERSION:2.0\r\nSOMEPROP:FOO\r\nANOTHERPROP:FOO\r\nTHIRDPROP:FOO\r\nPROP4:FOO 1\r\nPROP4:FOO 2\r\nPROP4:FOO 3\r\nPROP4:FOO 4\r\nPROP4:FOO 5\r\nPROP4:FOO 6\r\nPROP4:FOO 7\r\nPROP4:FOO 8\r\nPROP4:FOO 9\r\nPROP4:FOO 10\r\nPROPNUMBERFIVE:FOO\r\nPROPNUMBERSIX:FOO\r\nPROPNUMBERSEVEN:FOO\r\nPROPNUMBEREIGHT:FOO\r\nPROPNUMBERNINE:FOO\r\nPROPNUMBERTEN:FOO\r\nUID:FOO\r\nEND:VCARD\r\n", $str);
+
+    }
+
+    function testInstantiateWithChildren() {
+
+        $comp = new VCard(array(
+            'ORG' => array('Acme Inc.', 'Section 9'),
+            'FN' => 'Finn The Human',
+        ));
+
+        $this->assertEquals(array('Acme Inc.', 'Section 9'), $comp->ORG->getParts());
+        $this->assertEquals('Finn The Human', $comp->FN->getValue());
+
+    }
+
+    function testInstantiateSubComponent() {
+
+        $comp = new VCalendar();
+        $event = $comp->createComponent('VEVENT', array(
+            $comp->createProperty('UID', '12345'),
+        ));
+        $comp->add($event);
+
+        $this->assertEquals('12345', $comp->VEVENT->UID->getValue());
+
+    }
+
+    function testRemoveByName() {
+
+        $comp = new VCalendar(array(), false);
+        $comp->add('prop1','val1');
+        $comp->add('prop2','val2');
+        $comp->add('prop2','val2');
+
+        $comp->remove('prop2');
+        $this->assertFalse(isset($comp->prop2));
+        $this->assertTrue(isset($comp->prop1));
+
+    }
+
+    function testRemoveByObj() {
+
+        $comp = new VCalendar(array(), false);
+        $comp->add('prop1','val1');
+        $prop = $comp->add('prop2','val2');
+
+        $comp->remove($prop);
+        $this->assertFalse(isset($comp->prop2));
+        $this->assertTrue(isset($comp->prop1));
+
+    }
+
+    /**
+     * @expectedException InvalidArgumentException
+     */
+    function testRemoveNotFound() {
+
+        $comp = new VCalendar(array(), false);
+        $prop = $comp->createProperty('A','B');
+        $comp->remove($prop);
+
+    }
+
+    /**
+     * @dataProvider ruleData
+     */
+    function testValidateRules($componentList, $errorCount) {
+
+        $vcard = new Component\VCard();
+
+        $component = new FakeComponent($vcard,'Hi', array(), $defaults = false );
+        foreach($componentList as $v) {
+            $component->add($v,'Hello.');
+        }
+
+        $this->assertEquals($errorCount, count($component->validate()));
+
+    }
+
+    function testValidateRepair() {
+
+        $vcard = new Component\VCard();
+
+        $component = new FakeComponent($vcard,'Hi', array(), $defaults = false );
+        $component->validate(Component::REPAIR);
+        $this->assertEquals('yow', $component->BAR->getValue());
+
+    }
+
+    function ruleData() {
+
+        return array(
+
+            array(array(), 2),
+            array(array('FOO'), 3),
+            array(array('BAR'), 1),
+            array(array('BAZ'), 1),
+            array(array('BAR','BAZ'), 0),
+            array(array('BAR','BAZ','ZIM',), 0),
+            array(array('BAR','BAZ','ZIM','GIR'), 0),
+            array(array('BAR','BAZ','ZIM','GIR','GIR'), 1),
+
+        );
+
+    }
+
+}
+
+class FakeComponent extends Component {
+
+    public function getValidationRules() {
+
+        return array(
+            'FOO' => '0',
+            'BAR' => '1',
+            'BAZ' => '+',
+            'ZIM' => '*',
+            'GIR' => '?',
+        );
+
+    }
+
+    public function getDefaults() {
+
+        return array(
+            'BAR' => 'yow',
+        );
+
+    }
+
+}
+
diff --git a/vendor/sabre/vobject/tests/VObject/DateTimeParserTest.php b/vendor/sabre/vobject/tests/VObject/DateTimeParserTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..4b90d8781cc509f5203e9f028956cb3f5410e4c2
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/DateTimeParserTest.php
@@ -0,0 +1,417 @@
+<?php
+
+namespace Sabre\VObject;
+
+use DateTime;
+use DateTimeZone;
+use DateInterval;
+
+class DateTimeParserTest extends \PHPUnit_Framework_TestCase {
+
+    function testParseICalendarDuration() {
+
+        $this->assertEquals('+1 weeks', DateTimeParser::parseDuration('P1W',true));
+        $this->assertEquals('+5 days',  DateTimeParser::parseDuration('P5D',true));
+        $this->assertEquals('+5 days 3 hours 50 minutes 12 seconds', DateTimeParser::parseDuration('P5DT3H50M12S',true));
+        $this->assertEquals('-1 weeks 50 minutes', DateTimeParser::parseDuration('-P1WT50M',true));
+        $this->assertEquals('+50 days 3 hours 2 seconds', DateTimeParser::parseDuration('+P50DT3H2S',true));
+        $this->assertEquals('+0 seconds', DateTimeParser::parseDuration('+PT0S',true));
+        $this->assertEquals(new DateInterval('PT0S'), DateTimeParser::parseDuration('PT0S'));
+
+    }
+
+    function testParseICalendarDurationDateInterval() {
+
+        $expected = new DateInterval('P7D');
+        $this->assertEquals($expected, DateTimeParser::parseDuration('P1W'));
+        $this->assertEquals($expected, DateTimeParser::parse('P1W'));
+
+        $expected = new DateInterval('PT3M');
+        $expected->invert = true;
+        $this->assertEquals($expected, DateTimeParser::parseDuration('-PT3M'));
+
+    }
+
+    /**
+     * @expectedException LogicException
+     */
+    function testParseICalendarDurationFail() {
+
+        DateTimeParser::parseDuration('P1X',true);
+
+    }
+
+    function testParseICalendarDateTime() {
+
+        $dateTime = DateTimeParser::parseDateTime('20100316T141405');
+
+        $compare = new DateTime('2010-03-16 14:14:05',new DateTimeZone('UTC'));
+
+        $this->assertEquals($compare, $dateTime);
+
+    }
+
+    /**
+     * @depends testParseICalendarDateTime
+     * @expectedException LogicException
+     */
+    function testParseICalendarDateTimeBadFormat() {
+
+        $dateTime = DateTimeParser::parseDateTime('20100316T141405 ');
+
+    }
+
+    /**
+     * @depends testParseICalendarDateTime
+     */
+    function testParseICalendarDateTimeUTC() {
+
+        $dateTime = DateTimeParser::parseDateTime('20100316T141405Z');
+
+        $compare = new DateTime('2010-03-16 14:14:05',new DateTimeZone('UTC'));
+        $this->assertEquals($compare, $dateTime);
+
+    }
+
+    /**
+     * @depends testParseICalendarDateTime
+     */
+    function testParseICalendarDateTimeUTC2() {
+
+        $dateTime = DateTimeParser::parseDateTime('20101211T160000Z');
+
+        $compare = new DateTime('2010-12-11 16:00:00',new DateTimeZone('UTC'));
+        $this->assertEquals($compare, $dateTime);
+
+    }
+
+    /**
+     * @depends testParseICalendarDateTime
+     */
+    function testParseICalendarDateTimeCustomTimeZone() {
+
+        $dateTime = DateTimeParser::parseDateTime('20100316T141405', new DateTimeZone('Europe/Amsterdam'));
+
+        $compare = new DateTime('2010-03-16 14:14:05',new DateTimeZone('Europe/Amsterdam'));
+        $this->assertEquals($compare, $dateTime);
+
+    }
+
+    function testParseICalendarDate() {
+
+        $dateTime = DateTimeParser::parseDate('20100316');
+
+        $expected = new DateTime('2010-03-16 00:00:00',new DateTimeZone('UTC'));
+
+        $this->assertEquals($expected, $dateTime);
+
+        $dateTime = DateTimeParser::parse('20100316');
+        $this->assertEquals($expected, $dateTime);
+
+    }
+
+    /**
+     * TCheck if a date with year > 4000 will not throw an exception. iOS seems to use 45001231 in yearly recurring events
+     */
+    function testParseICalendarDateGreaterThan4000() {
+
+        $dateTime = DateTimeParser::parseDate('45001231');
+
+        $expected = new DateTime('4500-12-31 00:00:00',new DateTimeZone('UTC'));
+
+        $this->assertEquals($expected, $dateTime);
+
+        $dateTime = DateTimeParser::parse('45001231');
+        $this->assertEquals($expected, $dateTime);
+
+    }
+
+    /**
+     * Check if a datetime with year > 4000 will not throw an exception. iOS seems to use 45001231T235959 in yearly recurring events
+     */
+    function testParseICalendarDateTimeGreaterThan4000() {
+
+        $dateTime = DateTimeParser::parseDateTime('45001231T235959');
+
+        $expected = new DateTime('4500-12-31 23:59:59',new DateTimeZone('UTC'));
+
+        $this->assertEquals($expected, $dateTime);
+
+        $dateTime = DateTimeParser::parse('45001231T235959');
+        $this->assertEquals($expected, $dateTime);
+
+    }
+
+    /**
+     * @depends testParseICalendarDate
+     * @expectedException LogicException
+     */
+    function testParseICalendarDateBadFormat() {
+
+        $dateTime = DateTimeParser::parseDate('20100316T141405');
+
+    }
+
+    /**
+     * @dataProvider vcardDates
+     */
+    function testVCardDate($input, $output) {
+
+        $this->assertEquals(
+            $output,
+            DateTimeParser::parseVCardDateTime($input)
+        );
+
+    }
+
+    /**
+     * @dataProvider vcardDates
+     * @expectedException \InvalidArgumentException
+     */
+    function testBadVCardDate() {
+
+        DateTimeParser::parseVCardDateTime('1985---01');
+
+    }
+
+    /**
+     * @dataProvider vcardDates
+     * @expectedException \InvalidArgumentException
+     */
+    function testBadVCardTime() {
+
+        DateTimeParser::parseVCardTime('23:12:166');
+
+    }
+
+    function vcardDates() {
+
+        return array(
+            array(
+                "19961022T140000",
+                array(
+                    "year" => 1996,
+                    "month" => 10,
+                    "date" => 22,
+                    "hour" => 14,
+                    "minute" => 00,
+                    "second" => 00,
+                    "timezone" => null
+                ),
+            ),
+            array(
+                "--1022T1400",
+                array(
+                    "year" => null,
+                    "month" => 10,
+                    "date" => 22,
+                    "hour" => 14,
+                    "minute" => 00,
+                    "second" => null,
+                    "timezone" => null
+                ),
+            ),
+            array(
+                "---22T14",
+                array(
+                    "year" => null,
+                    "month" => null,
+                    "date" => 22,
+                    "hour" => 14,
+                    "minute" => null,
+                    "second" => null,
+                    "timezone" => null
+                ),
+            ),
+            array(
+                "19850412",
+                array(
+                    "year" => 1985,
+                    "month" => 4,
+                    "date" => 12,
+                    "hour" => null,
+                    "minute" => null,
+                    "second" => null,
+                    "timezone" => null
+                ),
+            ),
+            array(
+                "1985-04",
+                array(
+                    "year" => 1985,
+                    "month" => 04,
+                    "date" => null,
+                    "hour" => null,
+                    "minute" => null,
+                    "second" => null,
+                    "timezone" => null
+                ),
+            ),
+            array(
+                "1985",
+                array(
+                    "year" => 1985,
+                    "month" => null,
+                    "date" => null,
+                    "hour" => null,
+                    "minute" => null,
+                    "second" => null,
+                    "timezone" => null
+                ),
+            ),
+            array(
+                "--0412",
+                array(
+                    "year" => null,
+                    "month" => 4,
+                    "date" => 12,
+                    "hour" => null,
+                    "minute" => null,
+                    "second" => null,
+                    "timezone" => null
+                ),
+            ),
+            array(
+                "---12",
+                array(
+                    "year" => null,
+                    "month" => null,
+                    "date" => 12,
+                    "hour" => null,
+                    "minute" => null,
+                    "second" => null,
+                    "timezone" => null
+                ),
+            ),
+            array(
+                "T102200",
+                array(
+                    "year" => null,
+                    "month" => null,
+                    "date" => null,
+                    "hour" => 10,
+                    "minute" => 22,
+                    "second" => 0,
+                    "timezone" => null
+                ),
+            ),
+            array(
+                "T1022",
+                array(
+                    "year" => null,
+                    "month" => null,
+                    "date" => null,
+                    "hour" => 10,
+                    "minute" => 22,
+                    "second" => null,
+                    "timezone" => null
+                ),
+            ),
+            array(
+                "T10",
+                array(
+                    "year" => null,
+                    "month" => null,
+                    "date" => null,
+                    "hour" => 10,
+                    "minute" => null,
+                    "second" => null,
+                    "timezone" => null
+                ),
+            ),
+            array(
+                "T-2200",
+                array(
+                    "year" => null,
+                    "month" => null,
+                    "date" => null,
+                    "hour" => null,
+                    "minute" => 22,
+                    "second" => 00,
+                    "timezone" => null
+                ),
+            ),
+            array(
+                "T--00",
+                array(
+                    "year" => null,
+                    "month" => null,
+                    "date" => null,
+                    "hour" => null,
+                    "minute" => null,
+                    "second" => 00,
+                    "timezone" => null
+                ),
+            ),
+            array(
+                "T102200Z",
+                array(
+                    "year" => null,
+                    "month" => null,
+                    "date" => null,
+                    "hour" => 10,
+                    "minute" => 22,
+                    "second" => 00,
+                    "timezone" => 'Z'
+                ),
+            ),
+            array(
+                "T102200-0800",
+                array(
+                    "year" => null,
+                    "month" => null,
+                    "date" => null,
+                    "hour" => 10,
+                    "minute" => 22,
+                    "second" => 00,
+                    "timezone" => '-0800'
+                ),
+            ),
+
+            // extended format
+            array(
+                "2012-11-29T15:10:53Z",
+                array(
+                    "year" => 2012,
+                    "month" => 11,
+                    "date" => 29,
+                    "hour" => 15,
+                    "minute" => 10,
+                    "second" => 53,
+                    "timezone" => 'Z'
+                ),
+            ),
+
+            // with milliseconds
+            array(
+                "20121129T151053.123Z",
+                array(
+                    "year" => 2012,
+                    "month" => 11,
+                    "date" => 29,
+                    "hour" => 15,
+                    "minute" => 10,
+                    "second" => 53,
+                    "timezone" => 'Z'
+                ),
+            ),
+
+            // extended format with milliseconds
+            array(
+                "2012-11-29T15:10:53.123Z",
+                array(
+                    "year" => 2012,
+                    "month" => 11,
+                    "date" => 29,
+                    "hour" => 15,
+                    "minute" => 10,
+                    "second" => 53,
+                    "timezone" => 'Z'
+                ),
+            ),
+
+        );
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/DocumentTest.php b/vendor/sabre/vobject/tests/VObject/DocumentTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..d019b39639de8a3d449f539d7b72a40881254709
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/DocumentTest.php
@@ -0,0 +1,70 @@
+<?php
+
+namespace Sabre\VObject;
+
+class DocumentTest extends \PHPUnit_Framework_TestCase {
+
+    function testGetDocumentType() {
+
+        $doc = new MockDocument();
+        $this->assertEquals(Document::UNKNOWN, $doc->getDocumentType());
+
+    }
+
+    function testConstruct() {
+
+        $doc = new MockDocument('VLIST');
+        $this->assertEquals('VLIST', $doc->name);
+
+    }
+
+    function testCreateComponent() {
+
+        $vcal = new Component\VCalendar(array(), false);
+
+        $event = $vcal->createComponent('VEVENT');
+
+        $this->assertInstanceOf('Sabre\VObject\Component\VEvent', $event);
+        $vcal->add($event);
+
+        $prop = $vcal->createProperty('X-PROP','1234256',array('X-PARAM' => '3'));
+        $this->assertInstanceOf('Sabre\VObject\Property', $prop);
+
+        $event->add($prop);
+
+        unset(
+            $event->DTSTAMP,
+            $event->UID
+        );
+
+        $out = $vcal->serialize();
+        $this->assertEquals("BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nX-PROP;X-PARAM=3:1234256\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", $out);
+
+    }
+
+    function testCreate() {
+
+        $vcal = new Component\VCalendar(array(), false);
+
+        $event = $vcal->create('VEVENT');
+        $this->assertInstanceOf('Sabre\VObject\Component\VEvent', $event);
+
+        $event = $vcal->create('CALSCALE');
+        $this->assertInstanceOf('Sabre\VObject\Property\Text', $event);
+
+    }
+
+    function testGetClassNameForPropertyValue() {
+
+        $vcal = new Component\VCalendar(array(), false);
+        $this->assertEquals('Sabre\\VObject\\Property\\Text', $vcal->getClassNameForPropertyValue('TEXT'));
+        $this->assertNull($vcal->getClassNameForPropertyValue('FOO'));
+
+    }
+
+}
+
+
+class MockDocument extends Document {
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/ElementListTest.php b/vendor/sabre/vobject/tests/VObject/ElementListTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..48cea36d451a0520bf65c9cd2681185b39abb953
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/ElementListTest.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace Sabre\VObject;
+
+class ElementListTest extends \PHPUnit_Framework_TestCase {
+
+    function testIterate() {
+
+        $cal = new Component\VCalendar();
+        $sub = $cal->createComponent('VEVENT');
+
+        $elems = array(
+            $sub,
+            clone $sub,
+            clone $sub
+        );
+
+        $elemList = new ElementList($elems);
+
+        $count = 0;
+        foreach($elemList as $key=>$subcomponent) {
+
+           $count++;
+           $this->assertInstanceOf('Sabre\\VObject\\Component',$subcomponent);
+
+        }
+        $this->assertEquals(3,$count);
+        $this->assertEquals(2,$key);
+
+    }
+
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/EmClientTest.php b/vendor/sabre/vobject/tests/VObject/EmClientTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..69d410fe7fb63cb9e2c3fdcecf6936875b779688
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/EmClientTest.php
@@ -0,0 +1,55 @@
+<?php
+
+namespace Sabre\VObject;
+
+class EmClientTest extends \PHPUnit_Framework_TestCase {
+
+    function testParseTz() {
+
+        $str = 'BEGIN:VCALENDAR
+X-WR-CALNAME:Blackhawks Schedule 2011-12
+X-APPLE-CALENDAR-COLOR:#E51717
+X-WR-TIMEZONE:America/Chicago
+CALSCALE:GREGORIAN
+PRODID:-//eM Client/4.0.13961.0
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:America/Chicago
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
+DTSTART:20070311T020000
+TZNAME:CDT
+TZOFFSETTO:-0500
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
+DTSTART:20071104T020000
+TZNAME:CST
+TZOFFSETTO:-0600
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+CREATED:20110624T181236Z
+UID:be3bbfff-96e8-4c66-9908-ab791a62231d
+DTEND;TZID="America/Chicago":20111008T223000
+TRANSP:OPAQUE
+SUMMARY:Stars @ Blackhawks (Home Opener)
+DTSTART;TZID="America/Chicago":20111008T193000
+DTSTAMP:20120330T013232Z
+SEQUENCE:2
+X-MICROSOFT-CDO-BUSYSTATUS:BUSY
+LAST-MODIFIED:20120330T013237Z
+CLASS:PUBLIC
+END:VEVENT
+END:VCALENDAR';
+
+        $vObject = Reader::read($str);
+        $dt = $vObject->VEVENT->DTSTART->getDateTime();
+        $this->assertEquals(new \DateTime('2011-10-08 19:30:00', new \DateTimeZone('America/Chicago')), $dt);
+
+    }
+
+}
+
diff --git a/vendor/sabre/vobject/tests/VObject/EmptyParameterTest.php b/vendor/sabre/vobject/tests/VObject/EmptyParameterTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..0dc1d696d4615f47d9cbb913e7d774ea6348efbc
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/EmptyParameterTest.php
@@ -0,0 +1,69 @@
+<?php
+
+namespace Sabre\VObject;
+
+class IssueEmptyParameterTest extends \PHPUnit_Framework_TestCase {
+
+    function testRead() {
+
+        $input = <<<VCF
+BEGIN:VCARD
+VERSION:2.1
+N:Doe;Jon;;;
+FN:Jon Doe
+EMAIL;X-INTERN:foo@example.org
+UID:foo
+END:VCARD
+VCF;
+
+        $vcard = Reader::read($input);
+
+        $this->assertInstanceOf('Sabre\\VObject\\Component\\VCard', $vcard);
+        $vcard = $vcard->convert(\Sabre\VObject\Document::VCARD30);
+        $vcard = $vcard->serialize();
+
+        $converted = Reader::read($vcard);
+        $converted->validate();
+
+        $this->assertTrue(isset($converted->EMAIL['X-INTERN']));
+
+        $version = Version::VERSION;
+
+        $expected = <<<VCF
+BEGIN:VCARD
+VERSION:3.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+N:Doe;Jon;;;
+FN:Jon Doe
+EMAIL;X-INTERN=:foo@example.org
+UID:foo
+END:VCARD
+
+VCF;
+
+        $this->assertEquals($expected, str_replace("\r","", $vcard));
+
+    }
+
+    function testVCard21Parameter() {
+
+        $vcard = new Component\VCard(array(), false);
+        $vcard->VERSION = '2.1';
+        $vcard->PHOTO = 'random_stuff';
+        $vcard->PHOTO->add(null,'BASE64');
+        $vcard->UID = 'foo-bar';
+
+        $result = $vcard->serialize();
+        $expected = array(
+            "BEGIN:VCARD",
+            "VERSION:2.1",
+            "PHOTO;BASE64:" . base64_encode('random_stuff'),
+            "UID:foo-bar",
+            "END:VCARD",
+            "",
+        );
+
+        $this->assertEquals(implode("\r\n", $expected), $result);
+
+    }
+}
diff --git a/vendor/sabre/vobject/tests/VObject/EmptyValueIssueTest.php b/vendor/sabre/vobject/tests/VObject/EmptyValueIssueTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..1f993ea4b8f7420af1df37849dc46a2e47633728
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/EmptyValueIssueTest.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * This test is written for Issue 68:
+ *
+ * https://github.com/fruux/sabre-vobject/issues/68 
+ */
+class EmptyValueIssueTest extends \PHPUnit_Framework_TestCase {
+
+    function testDecodeValue() {
+
+        $input = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+DESCRIPTION:This is a descpription\\nwith a linebreak and a \\; \\, and :
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $vobj = Reader::read($input);
+
+        // Before this bug was fixed, getValue() would return nothing.
+        $this->assertEquals("This is a descpription\nwith a linebreak and a ; , and :", $vobj->VEVENT->DESCRIPTION->getValue());
+
+    }
+
+}
+
diff --git a/vendor/sabre/vobject/tests/VObject/FreeBusyGeneratorTest.php b/vendor/sabre/vobject/tests/VObject/FreeBusyGeneratorTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..d01ef3aaf145276d6e077fff23a1206db7f5b8c1
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/FreeBusyGeneratorTest.php
@@ -0,0 +1,394 @@
+<?php
+
+namespace Sabre\VObject;
+
+class FreeBusyGeneratorTest extends \PHPUnit_Framework_TestCase {
+
+    function getInput() {
+
+        $tests = array();
+
+        $blob = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foobar
+DTSTART:20110101T120000Z
+DTEND:20110101T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $tests[] = array(
+            $blob,
+            "20110101T120000Z/20110101T130000Z"
+        );
+
+        // opaque, shows up
+        $blob = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foobar2
+TRANSP:OPAQUE
+DTSTART:20110101T130000Z
+DTEND:20110101T140000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $tests[] = array(
+            $blob,
+            "20110101T130000Z/20110101T140000Z"
+        );
+
+        // transparent, hidden
+        $blob = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foobar3
+TRANSP:TRANSPARENT
+DTSTART:20110101T140000Z
+DTEND:20110101T150000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $tests[] = array(
+            $blob,
+            null,
+        );
+
+        // cancelled, hidden
+        $blob = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foobar4
+STATUS:CANCELLED
+DTSTART:20110101T160000Z
+DTEND:20110101T170000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $tests[] = array(
+            $blob,
+            null,
+        );
+
+        // tentative, shows up
+        $blob = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foobar5
+STATUS:TENTATIVE
+DTSTART:20110101T180000Z
+DTEND:20110101T190000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $tests[] = array(
+            $blob,
+            '20110101T180000Z/20110101T190000Z',
+        );
+
+        // outside of time-range, hidden
+        $blob = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foobar6
+DTSTART:20110101T090000Z
+DTEND:20110101T100000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $tests[] = array(
+            $blob,
+            null,
+        );
+
+        // outside of time-range, hidden
+        $blob = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foobar7
+DTSTART:20110104T090000Z
+DTEND:20110104T100000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $tests[] = array(
+            $blob,
+            null,
+        );
+
+        // using duration, shows up
+        $blob = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foobar8
+DTSTART:20110101T190000Z
+DURATION:PT1H
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $tests[] = array(
+            $blob,
+            '20110101T190000Z/20110101T200000Z',
+        );
+
+        // Day-long event, shows up
+        $blob = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foobar9
+DTSTART;VALUE=DATE:20110102
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $tests[] = array(
+            $blob,
+            '20110102T000000Z/20110103T000000Z',
+        );
+
+
+        // No duration, does not show up
+        $blob = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foobar10
+DTSTART:20110101T200000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $tests[] = array(
+            $blob,
+            null,
+        );
+
+        // encoded as object, shows up
+        $blob = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foobar11
+DTSTART:20110101T210000Z
+DURATION:PT1H
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $tests[] = array(
+            Reader::read($blob),
+            '20110101T210000Z/20110101T220000Z',
+        );
+
+        // Freebusy. Some parts show up
+        $blob = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VFREEBUSY
+FREEBUSY:20110103T010000Z/20110103T020000Z
+FREEBUSY;FBTYPE=FREE:20110103T020000Z/20110103T030000Z
+FREEBUSY:20110103T030000Z/20110103T040000Z,20110103T040000Z/20110103T050000Z
+FREEBUSY:20120101T000000Z/20120101T010000Z
+FREEBUSY:20110103T050000Z/PT1H
+END:VFREEBUSY
+END:VCALENDAR
+ICS;
+
+        $tests[] = array(
+            Reader::read($blob),
+            array(
+                '20110103T010000Z/20110103T020000Z',
+                '20110103T030000Z/20110103T040000Z',
+                '20110103T040000Z/20110103T050000Z',
+                '20110103T050000Z/20110103T060000Z',
+            )
+        );
+
+
+        // Yearly recurrence rule, shows up
+        $blob = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foobar13
+DTSTART:20100101T220000Z
+DTEND:20100101T230000Z
+RRULE:FREQ=YEARLY
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $tests[] = array(
+            Reader::read($blob),
+            '20110101T220000Z/20110101T230000Z',
+        );
+
+
+        // Yearly recurrence rule + duration, shows up
+        $blob = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foobar14
+DTSTART:20100101T230000Z
+DURATION:PT1H
+RRULE:FREQ=YEARLY
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $tests[] = array(
+            Reader::read($blob),
+            '20110101T230000Z/20110102T000000Z',
+        );
+
+        // Floating time, no timezone
+        $blob = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foobar
+DTSTART:20110101T120000
+DTEND:20110101T130000
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $tests[] = array(
+            $blob,
+            "20110101T120000Z/20110101T130000Z"
+        );
+
+        // Floating time + reference timezone
+        $blob = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foobar
+DTSTART:20110101T120000
+DTEND:20110101T130000
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $tests[] = array(
+            $blob,
+            "20110101T170000Z/20110101T180000Z",
+            new \DateTimeZone('America/Toronto')
+        );
+
+        // All-day event
+        $blob = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foobar
+DTSTART;VALUE=DATE:20110101
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $tests[] = array(
+            $blob,
+            "20110101T000000Z/20110102T000000Z"
+        );
+
+        // All-day event + reference timezone
+        $blob = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foobar
+DTSTART;VALUE=DATE:20110101
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $tests[] = array(
+            $blob,
+            "20110101T050000Z/20110102T050000Z",
+            new \DateTimeZone('America/Toronto')
+        );
+
+        // Recurrence rule with no valid instances
+        $blob = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foobar
+DTSTART:20110101T100000Z
+DTEND:20110103T120000Z
+RRULE:FREQ=WEEKLY;COUNT=1
+EXDATE:20110101T100000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $tests[] = array(
+            $blob,
+            array()
+            );
+        return $tests;
+
+    }
+
+    /**
+     * @dataProvider getInput
+     */
+    function testGenerator($input, $expected, $timeZone = null) {
+
+        $gen = new FreeBusyGenerator(
+            new \DateTime('20110101T110000Z', new \DateTimeZone('UTC')),
+            new \DateTime('20110103T110000Z', new \DateTimeZone('UTC')),
+            $input,
+            $timeZone
+        );
+
+        $result = $gen->getResult();
+
+        $expected = (array)$expected;
+
+        $freebusy = $result->VFREEBUSY->select('FREEBUSY');
+
+        foreach($freebusy as $fb) {
+
+            $this->assertContains((string)$fb, $expected, "$fb did not appear in our list of expected freebusy strings. This is concerning!");
+
+            $k = array_search((string)$fb, $expected);
+            unset($expected[$k]);
+
+        }
+        $this->assertTrue(
+            count($expected) === 0,
+            'There were elements in the expected array that were not found in the output: ' . "\n"  . print_r($expected,true) . "\n" . $result->serialize()
+        );
+
+    }
+
+    function testGeneratorBaseObject() {
+
+        $obj = new Component\VCalendar();
+        $obj->METHOD = 'PUBLISH';
+
+        $gen = new FreeBusyGenerator();
+        $gen->setObjects(array());
+        $gen->setBaseObject($obj);
+
+        $result = $gen->getResult();
+
+        $this->assertEquals('PUBLISH', $result->METHOD->getValue());
+
+    }
+
+    /**
+     * @expectedException InvalidArgumentException
+     */
+    function testInvalidArg() {
+
+        $gen = new FreeBusyGenerator(
+            new \DateTime('2012-01-01'),
+            new \DateTime('2012-12-31'),
+            new \StdClass()
+        );
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/GoogleColonEscapingTest.php b/vendor/sabre/vobject/tests/VObject/GoogleColonEscapingTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..0961ec1bd77108f4470d1deaf816906d16814a48
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/GoogleColonEscapingTest.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * Google produces vcards with a weird escaping of urls.
+ *
+ * VObject will provide a workaround for this, so end-user still get expected
+ * values.
+ */
+class GoogleColonEscaping extends \PHPUnit_Framework_TestCase {
+
+    function testDecode() {
+
+        $vcard = <<<VCF
+BEGIN:VCARD
+VERSION:3.0
+FN:Evert Pot
+N:Pot;Evert;;;
+EMAIL;TYPE=INTERNET;TYPE=WORK:evert@fruux.com
+BDAY:1985-04-07
+item7.URL:http\://www.rooftopsolutions.nl/
+END:VCARD
+VCF;
+
+        $vobj = Reader::read($vcard);
+        $this->assertEquals('http://www.rooftopsolutions.nl/', $vobj->URL->getValue());
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/ICalendar/AttachParseTest.php b/vendor/sabre/vobject/tests/VObject/ICalendar/AttachParseTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..0c4fc8790e5770314bd2da326e5f2d2eda4eeca5
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/ICalendar/AttachParseTest.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Sabre\VObject\ICalendar;
+
+use Sabre\VObject\Reader;
+
+class AttachParseTest extends \PHPUnit_Framework_TestCase {
+
+    /**
+     * See issue #128 for more info.
+     */
+    function testParseAttach() {
+
+        $vcal = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+ATTACH;FMTTYPE=application/postscript:ftp://example.com/pub/reports/r-960812.ps
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $vcal = Reader::read($vcal);
+        $prop = $vcal->VEVENT->ATTACH;
+
+        $this->assertInstanceOf('Sabre\\VObject\\Property\\URI', $prop);
+        $this->assertEquals('ftp://example.com/pub/reports/r-960812.ps', $prop->getValue());
+
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/ITip/BrokerAttendeeReplyTest.php b/vendor/sabre/vobject/tests/VObject/ITip/BrokerAttendeeReplyTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..6fb03670f3894afb34b9f6c3bef975799567a17a
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/ITip/BrokerAttendeeReplyTest.php
@@ -0,0 +1,1130 @@
+<?php
+
+namespace Sabre\VObject\ITip;
+
+class BrokerAttendeeReplyTest extends BrokerTester {
+
+    function testAccepted() {
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SUMMARY:B-day party
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+DTSTART:20140716T120000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+        $newMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SUMMARY:B-day party
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=ACCEPTED;CN=One:mailto:one@example.org
+DTSTART:20140716T120000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+
+        $expected = array(
+            array(
+                'uid' => 'foobar',
+                'method' => 'REPLY',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:one@example.org',
+                'senderName' => 'One',
+                'recipient' => 'mailto:strunk@example.org',
+                'recipientName' => 'Strunk',
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:REPLY
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART:20140716T120000Z
+SUMMARY:B-day party
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=ACCEPTED;CN=One:mailto:one@example.org
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+
+        );
+
+        $result = $this->parse($oldMessage, $newMessage, $expected);
+
+    }
+
+    function testRecurringReply() {
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+DTSTART:20140724T120000Z
+SUMMARY:Daily sprint
+RRULE;FREQ=DAILY
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+        $newMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=NEEDS-ACTION;CN=One:mailto:one@example.org
+DTSTART:20140724T120000Z
+SUMMARY:Daily sprint
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=ACCEPTED;CN=One:mailto:one@example.org
+DTSTART:20140726T120000Z
+RECURRENCE-ID:20140726T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=DECLINED;CN=One:mailto:one@example.org
+DTSTART:20140724T120000Z
+RECURRENCE-ID:20140724T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=TENTATIVE;CN=One:mailto:one@example.org
+DTSTART:20140728T120000Z
+RECURRENCE-ID:20140728T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=ACCEPTED;CN=One:mailto:one@example.org
+DTSTART:20140729T120000Z
+RECURRENCE-ID:20140729T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=DECLINED;CN=One:mailto:one@example.org
+DTSTART:20140725T120000Z
+RECURRENCE-ID:20140725T120000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+
+        $expected = array(
+            array(
+                'uid' => 'foobar',
+                'method' => 'REPLY',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:one@example.org',
+                'senderName' => 'One',
+                'recipient' => 'mailto:strunk@example.org',
+                'recipientName' => 'Strunk',
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:REPLY
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART:20140726T120000Z
+SUMMARY:Daily sprint
+RECURRENCE-ID:20140726T120000Z
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=ACCEPTED;CN=One:mailto:one@example.org
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART:20140724T120000Z
+SUMMARY:Daily sprint
+RECURRENCE-ID:20140724T120000Z
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=DECLINED;CN=One:mailto:one@example.org
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART:20140728T120000Z
+SUMMARY:Daily sprint
+RECURRENCE-ID:20140728T120000Z
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=TENTATIVE;CN=One:mailto:one@example.org
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART:20140729T120000Z
+SUMMARY:Daily sprint
+RECURRENCE-ID:20140729T120000Z
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=ACCEPTED;CN=One:mailto:one@example.org
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART:20140725T120000Z
+SUMMARY:Daily sprint
+RECURRENCE-ID:20140725T120000Z
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=DECLINED;CN=One:mailto:one@example.org
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+
+        );
+
+        $result = $this->parse($oldMessage, $newMessage, $expected);
+
+    }
+
+    function testRecurringAllDay() {
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+DTSTART;VALUE=DATE:20140724
+RRULE;FREQ=DAILY
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+    $newMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=NEEDS-ACTION;CN=One:mailto:one@example.org
+DTSTART;VALUE=DATE:20140724
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=ACCEPTED;CN=One:mailto:one@example.org
+DTSTART;VALUE=DATE:20140726
+RECURRENCE-ID;VALUE=DATE:20140726
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=DECLINED;CN=One:mailto:one@example.org
+DTSTART;VALUE=DATE:20140724
+RECURRENCE-ID;VALUE=DATE:20140724
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=TENTATIVE;CN=One:mailto:one@example.org
+DTSTART;VALUE=DATE:20140728
+RECURRENCE-ID;VALUE=DATE:20140728
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=ACCEPTED;CN=One:mailto:one@example.org
+DTSTART;VALUE=DATE:20140729
+RECURRENCE-ID;VALUE=DATE:20140729
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=DECLINED;CN=One:mailto:one@example.org
+DTSTART;VALUE=DATE:20140725
+RECURRENCE-ID;VALUE=DATE:20140725
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+    $version = \Sabre\VObject\Version::VERSION;
+
+    $expected = array(
+        array(
+            'uid' => 'foobar',
+            'method' => 'REPLY',
+            'component' => 'VEVENT',
+            'sender' => 'mailto:one@example.org',
+            'senderName' => 'One',
+            'recipient' => 'mailto:strunk@example.org',
+            'recipientName' => 'Strunk',
+            'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:REPLY
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART;VALUE=DATE:20140726
+RECURRENCE-ID;VALUE=DATE:20140726
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=ACCEPTED;CN=One:mailto:one@example.org
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART;VALUE=DATE:20140724
+RECURRENCE-ID;VALUE=DATE:20140724
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=DECLINED;CN=One:mailto:one@example.org
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART;VALUE=DATE:20140728
+RECURRENCE-ID;VALUE=DATE:20140728
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=TENTATIVE;CN=One:mailto:one@example.org
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART;VALUE=DATE:20140729
+RECURRENCE-ID;VALUE=DATE:20140729
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=ACCEPTED;CN=One:mailto:one@example.org
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART;VALUE=DATE:20140725
+RECURRENCE-ID;VALUE=DATE:20140725
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=DECLINED;CN=One:mailto:one@example.org
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+
+        );
+
+        $result = $this->parse($oldMessage, $newMessage, $expected);
+
+    }
+
+    function testNoChange() {
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+DTSTART:20140716T120000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+        $newMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=NEEDS-ACTION;CN=One:mailto:one@example.org
+DTSTART:20140716T120000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+        $expected = array();
+        $result = $this->parse($oldMessage, $newMessage, $expected);
+
+    }
+
+    function testNoChangeForceSend() {
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+DTSTART:20140716T120000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+        $newMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;SCHEDULE-FORCE-SEND=REPLY;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=NEEDS-ACTION;CN=One:mailto:one@example.org
+DTSTART:20140716T120000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+        $expected = array(
+            array(
+                'uid' => 'foobar',
+                'method' => 'REPLY',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:one@example.org',
+                'senderName' => 'One',
+                'recipient' => 'mailto:strunk@example.org',
+                'recipientName' => 'Strunk',
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:REPLY
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART:20140716T120000Z
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=NEEDS-ACTION;CN=One:mailto:one@example.org
+END:VEVENT
+END:VCALENDAR
+ICS
+            )
+
+        );
+        $result = $this->parse($oldMessage, $newMessage, $expected);
+
+    }
+
+    function testNoRelevantAttendee() {
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Two:mailto:two@example.org
+DTSTART:20140716T120000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+        $newMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=ACCEPTED;CN=Two:mailto:two@example.org
+DTSTART:20140716T120000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $expected = array();
+        $result = $this->parse($oldMessage, $newMessage, $expected);
+
+    }
+
+    /**
+     * In this test, an event exists in an attendees calendar. The event
+     * is recurring, and the attendee deletes 1 instance of the event.
+     * This instance shows up in EXDATE
+     *
+     * This should automatically generate a DECLINED message for that
+     * specific instance.
+     */
+    function testCreateReplyByException() {
+
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART:20140811T200000Z
+RRULE:FREQ=WEEKLY
+ORGANIZER:mailto:organizer@example.org
+ATTENDEE:mailto:one@example.org
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $newMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART:20140811T200000Z
+RRULE:FREQ=WEEKLY
+ORGANIZER:mailto:organizer@example.org
+ATTENDEE:mailto:one@example.org
+EXDATE:20140818T200000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+        $expected = array(
+            array(
+                'uid' => 'foobar',
+                'method' => 'REPLY',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:one@example.org',
+                'senderName' => null,
+                'recipient' => 'mailto:organizer@example.org',
+                'recipientName' => null,
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:REPLY
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART:20140818T200000Z
+RECURRENCE-ID:20140818T200000Z
+ORGANIZER:mailto:organizer@example.org
+ATTENDEE;PARTSTAT=DECLINED:mailto:one@example.org
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+        );
+        $result = $this->parse($oldMessage, $newMessage, $expected);
+
+    }
+
+    /**
+     * This test is identical to the last, but now we're working with
+     * timezones.
+     *
+     * @depends testCreateReplyByException
+     */
+    function testCreateReplyByExceptionTz() {
+
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART;TZID=America/Toronto:20140811T200000
+RRULE:FREQ=WEEKLY
+ORGANIZER:mailto:organizer@example.org
+ATTENDEE:mailto:one@example.org
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $newMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART;TZID=America/Toronto:20140811T200000
+RRULE:FREQ=WEEKLY
+ORGANIZER:mailto:organizer@example.org
+ATTENDEE:mailto:one@example.org
+EXDATE;TZID=America/Toronto:20140818T200000
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+        $expected = array(
+            array(
+                'uid' => 'foobar',
+                'method' => 'REPLY',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:one@example.org',
+                'senderName' => null,
+                'recipient' => 'mailto:organizer@example.org',
+                'recipientName' => null,
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:REPLY
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART;TZID=America/Toronto:20140818T200000
+RECURRENCE-ID;TZID=America/Toronto:20140818T200000
+ORGANIZER:mailto:organizer@example.org
+ATTENDEE;PARTSTAT=DECLINED:mailto:one@example.org
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+        );
+        $result = $this->parse($oldMessage, $newMessage, $expected);
+
+    }
+
+    /**
+     * @depends testCreateReplyByException
+     */
+    function testCreateReplyByExceptionAllDay() {
+
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+SUMMARY:Weekly meeting
+UID:foobar
+SEQUENCE:1
+DTSTART;VALUE=DATE:20140811
+RRULE:FREQ=WEEKLY
+ORGANIZER:mailto:organizer@example.org
+ATTENDEE:mailto:one@example.org
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $newMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+SUMMARY:Weekly meeting
+UID:foobar
+SEQUENCE:1
+DTSTART;VALUE=DATE:20140811
+RRULE:FREQ=WEEKLY
+ORGANIZER:mailto:organizer@example.org
+ATTENDEE:mailto:one@example.org
+EXDATE;VALUE=DATE:20140818
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+        $expected = array(
+            array(
+                'uid' => 'foobar',
+                'method' => 'REPLY',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:one@example.org',
+                'senderName' => null,
+                'recipient' => 'mailto:organizer@example.org',
+                'recipientName' => null,
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:REPLY
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART;VALUE=DATE:20140818
+SUMMARY:Weekly meeting
+RECURRENCE-ID;VALUE=DATE:20140818
+ORGANIZER:mailto:organizer@example.org
+ATTENDEE;PARTSTAT=DECLINED:mailto:one@example.org
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+        );
+        $result = $this->parse($oldMessage, $newMessage, $expected);
+
+    }
+
+    function testDeclined() {
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+DTSTART:20140716T120000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+        $newMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=DECLINED;CN=One:mailto:one@example.org
+DTSTART:20140716T120000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+
+        $expected = array(
+            array(
+                'uid' => 'foobar',
+                'method' => 'REPLY',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:one@example.org',
+                'senderName' => 'One',
+                'recipient' => 'mailto:strunk@example.org',
+                'recipientName' => 'Strunk',
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:REPLY
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART:20140716T120000Z
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=DECLINED;CN=One:mailto:one@example.org
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+
+        );
+
+        $result = $this->parse($oldMessage, $newMessage, $expected);
+
+    }
+
+    function testDeclinedCancelledEvent() {
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+STATUS:CANCELLED
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+DTSTART:20140716T120000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+        $newMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+STATUS:CANCELLED
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=DECLINED;CN=One:mailto:one@example.org
+DTSTART:20140716T120000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+
+        $expected = array();
+
+        $result = $this->parse($oldMessage, $newMessage, $expected);
+
+    }
+
+    /**
+     * In this test, a new exception is created by an attendee as well.
+     *
+     * Except in this case, there was already an overridden event, and the
+     * overridden event was marked as cancelled by the attendee.
+     *
+     * For any other attendence status, the new status would have been
+     * declined, but for this, no message should we sent.
+     */
+    function testDontCreateReplyWhenEventWasDeclined() {
+
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART:20140811T200000Z
+RRULE:FREQ=WEEKLY
+ORGANIZER:mailto:organizer@example.org
+ATTENDEE:mailto:one@example.org
+END:VEVENT
+BEGIN:VEVENT
+RECURRENCE-ID:20140818T200000Z
+UID:foobar
+SEQUENCE:1
+DTSTART:20140818T200000Z
+RRULE:FREQ=WEEKLY
+ORGANIZER:mailto:organizer@example.org
+ATTENDEE;PARTSTAT=DECLINED:mailto:one@example.org
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $newMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART:20140811T200000Z
+RRULE:FREQ=WEEKLY
+ORGANIZER:mailto:organizer@example.org
+ATTENDEE:mailto:one@example.org
+EXDATE:20140818T200000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+        $expected = array();
+
+        $result = $this->parse($oldMessage, $newMessage, $expected);
+
+    }
+
+    function testScheduleAgentOnOrganizer() {
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+DTSTART:20140716T120000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+        $newMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;SCHEDULE-AGENT=CLIENT;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=ACCEPTED;CN=One:mailto:one@example.org
+DTSTART:20140716T120000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+
+        $expected = array();
+        $result = $this->parse($oldMessage, $newMessage, $expected);
+
+    }
+
+    function testAcceptedAllDay() {
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+DTSTART;VALUE=DATE:20140716
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+        $newMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=ACCEPTED;CN=One:mailto:one@example.org
+DTSTART;VALUE=DATE:20140716
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+
+        $expected = array(
+            array(
+                'uid' => 'foobar',
+                'method' => 'REPLY',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:one@example.org',
+                'senderName' => 'One',
+                'recipient' => 'mailto:strunk@example.org',
+                'recipientName' => 'Strunk',
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:REPLY
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART;VALUE=DATE:20140716
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=ACCEPTED;CN=One:mailto:one@example.org
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+
+        );
+
+        $result = $this->parse($oldMessage, $newMessage, $expected);
+
+    }
+
+    /**
+     * This function tests an attendee updating their status to an event where
+     * they don't have the master event of.
+     *
+     * This is possible in cases an organizer created a recurring event, and
+     * invited an attendee for one instance of the event.
+     */
+    function testReplyNoMasterEvent() {
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+RECURRENCE-ID:20140724T120000Z
+DTSTART:20140724T120000Z
+SUMMARY:Daily sprint
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+        $newMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=ACCEPTED;CN=One:mailto:one@example.org
+RECURRENCE-ID:20140724T120000Z
+DTSTART:20140724T120000Z
+SUMMARY:Daily sprint
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+
+        $expected = array(
+            array(
+                'uid' => 'foobar',
+                'method' => 'REPLY',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:one@example.org',
+                'senderName' => 'One',
+                'recipient' => 'mailto:strunk@example.org',
+                'recipientName' => 'Strunk',
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+CALSCALE:GREGORIAN
+METHOD:REPLY
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART:20140724T120000Z
+SUMMARY:Daily sprint
+RECURRENCE-ID:20140724T120000Z
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=ACCEPTED;CN=One:mailto:one@example.org
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+
+        );
+
+        $result = $this->parse($oldMessage, $newMessage, $expected);
+
+    }
+
+    /**
+     * A party crasher is an attendee that accepted an event, but was not in
+     * any original invite.
+     *
+     * @depends testAccepted
+     */
+    function testPartyCrasher() {
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SUMMARY:B-day party
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+DTSTART:20140716T120000Z
+RRULE:FREQ=DAILY
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+RECURRENCE-ID:20140717T120000Z
+SUMMARY:B-day party
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+DTSTART:20140717T120000Z
+RRULE:FREQ=DAILY
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+        $newMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SUMMARY:B-day party
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+DTSTART:20140716T120000Z
+RRULE:FREQ=DAILY
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+RECURRENCE-ID:20140717T120000Z
+SUMMARY:B-day party
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=ACCEPTED;CN=One:mailto:one@example.org
+DTSTART:20140717T120000Z
+RRULE:FREQ=DAILY
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+
+        $expected = array(
+            array(
+                'uid' => 'foobar',
+                'method' => 'REPLY',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:one@example.org',
+                'senderName' => 'One',
+                'recipient' => 'mailto:strunk@example.org',
+                'recipientName' => 'Strunk',
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+CALSCALE:GREGORIAN
+METHOD:REPLY
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART:20140717T120000Z
+SUMMARY:B-day party
+RECURRENCE-ID:20140717T120000Z
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=ACCEPTED;CN=One:mailto:one@example.org
+END:VEVENT
+END:VCALENDAR
+
+ICS
+
+            ),
+
+        );
+
+        $result = $this->parse($oldMessage, $newMessage, $expected);
+
+    }
+}
diff --git a/vendor/sabre/vobject/tests/VObject/ITip/BrokerDeleteEventTest.php b/vendor/sabre/vobject/tests/VObject/ITip/BrokerDeleteEventTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..3d483b8ca3f55de34fd163883414b8b91e2e6e0f
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/ITip/BrokerDeleteEventTest.php
@@ -0,0 +1,340 @@
+<?php
+
+namespace Sabre\VObject\ITip;
+
+class BrokerDeleteEventTest extends BrokerTester {
+
+    function testOrganizerDeleteWithDtend() {
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+SUMMARY:foo
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+ATTENDEE;CN=Two:mailto:two@example.org
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+        $newMessage = null;
+
+        $version = \Sabre\VObject\Version::VERSION;
+
+        $expected = array(
+            array(
+                'uid' => 'foobar',
+                'method' => 'CANCEL',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:strunk@example.org',
+                'senderName' => 'Strunk',
+                'recipient' => 'mailto:one@example.org',
+                'recipientName' => 'One',
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:CANCEL
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:2
+SUMMARY:foo
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+END:VEVENT
+END:VCALENDAR
+ICS
+            ),
+
+            array(
+                'uid' => 'foobar',
+                'method' => 'CANCEL',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:strunk@example.org',
+                'senderName' => 'Strunk',
+                'recipient' => 'mailto:two@example.org',
+                'recipientName' => 'Two',
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:CANCEL
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:2
+SUMMARY:foo
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Two:mailto:two@example.org
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+        );
+
+        $result = $this->parse($oldMessage, $newMessage, $expected, 'mailto:strunk@example.org');
+
+    }
+
+    function testOrganizerDeleteWithDuration() {
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+SUMMARY:foo
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+ATTENDEE;CN=Two:mailto:two@example.org
+DTSTART:20140716T120000Z
+DURATION:PT1H
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+        $newMessage = null;
+
+        $version = \Sabre\VObject\Version::VERSION;
+
+        $expected = array(
+            array(
+                'uid'           => 'foobar',
+                'method'        => 'CANCEL',
+                'component'     => 'VEVENT',
+                'sender'        => 'mailto:strunk@example.org',
+                'senderName'    => 'Strunk',
+                'recipient'     => 'mailto:one@example.org',
+                'recipientName' => 'One',
+                'message'       => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:CANCEL
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:2
+SUMMARY:foo
+DTSTART:20140716T120000Z
+DURATION:PT1H
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+END:VEVENT
+END:VCALENDAR
+ICS
+            ),
+
+            array(
+                'uid'           => 'foobar',
+                'method'        => 'CANCEL',
+                'component'     => 'VEVENT',
+                'sender'        => 'mailto:strunk@example.org',
+                'senderName'    => 'Strunk',
+                'recipient'     => 'mailto:two@example.org',
+                'recipientName' => 'Two',
+                'message'       => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:CANCEL
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:2
+SUMMARY:foo
+DTSTART:20140716T120000Z
+DURATION:PT1H
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Two:mailto:two@example.org
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+        );
+
+        $result = $this->parse($oldMessage, $newMessage, $expected, 'mailto:strunk@example.org');
+
+    }
+
+    function testAttendeeDeleteWithDtend() {
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+SUMMARY:foo
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+ATTENDEE;CN=Two:mailto:two@example.org
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+        $newMessage = null;
+
+        $version = \Sabre\VObject\Version::VERSION;
+
+        $expected = array(
+            array(
+                'uid'           => 'foobar',
+                'method'        => 'REPLY',
+                'component'     => 'VEVENT',
+                'sender'        => 'mailto:one@example.org',
+                'senderName'    => 'One',
+                'recipient'     => 'mailto:strunk@example.org',
+                'recipientName' => 'Strunk',
+                'message'       => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:REPLY
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+SUMMARY:foo
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=DECLINED;CN=One:mailto:one@example.org
+END:VEVENT
+END:VCALENDAR
+ICS
+            ),
+        );
+
+        $result = $this->parse($oldMessage, $newMessage, $expected, 'mailto:one@example.org');
+
+
+    }
+
+    function testAttendeeDeleteWithDuration() {
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+SUMMARY:foo
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+ATTENDEE;CN=Two:mailto:two@example.org
+DTSTART:20140716T120000Z
+DURATION:PT1H
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+        $newMessage = null;
+
+        $version = \Sabre\VObject\Version::VERSION;
+
+        $expected = array(
+            array(
+                'uid' => 'foobar',
+                'method' => 'REPLY',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:one@example.org',
+                'senderName' => 'One',
+                'recipient' => 'mailto:strunk@example.org',
+                'recipientName' => 'Strunk',
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:REPLY
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART:20140716T120000Z
+DURATION:PT1H
+SUMMARY:foo
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;PARTSTAT=DECLINED;CN=One:mailto:one@example.org
+END:VEVENT
+END:VCALENDAR
+ICS
+            ),
+        );
+
+        $result = $this->parse($oldMessage, $newMessage, $expected, 'mailto:one@example.org');
+
+
+    }
+
+    function testAttendeeDeleteCancelledEvent() {
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+STATUS:CANCELLED
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+ATTENDEE;CN=Two:mailto:two@example.org
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+        $newMessage = null;
+
+        $version = \Sabre\VObject\Version::VERSION;
+
+        $expected = array();
+
+        $result = $this->parse($oldMessage, $newMessage, $expected, 'mailto:one@example.org');
+
+
+    }
+
+    function testNoCalendar() {
+
+        $this->parse(null, null, array(), 'mailto:one@example.org');
+
+    }
+
+    function testVTodo() {
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VTODO
+UID:foobar
+SEQUENCE:1
+END:VTODO
+END:VCALENDAR
+ICS;
+        $this->parse($oldMessage, null, array(), 'mailto:one@example.org');
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/ITip/BrokerNewEventTest.php b/vendor/sabre/vobject/tests/VObject/ITip/BrokerNewEventTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..e37bee6ede426815542da7b5dac5a675ffcb0a76
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/ITip/BrokerNewEventTest.php
@@ -0,0 +1,528 @@
+<?php
+
+namespace Sabre\VObject\ITip;
+
+class BrokerNewEventTest extends \PHPUnit_Framework_TestCase {
+
+    function testNoAttendee() {
+
+        $message = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foobar
+DTSTART:20140811T220000Z
+DTEND:20140811T230000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $result = $this->parse($message);
+
+    }
+
+    function testVTODO() {
+
+        $message = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VTODO
+UID:foobar
+END:VTODO
+END:VCALENDAR
+ICS;
+
+        $result = $this->parse($message);
+
+    }
+
+    function testSimpleInvite() {
+
+        $message = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+DTSTART:20140811T220000Z
+DTEND:20140811T230000Z
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=White:mailto:white@example.org
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+        $expectedMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:REQUEST
+BEGIN:VEVENT
+UID:foobar
+DTSTART:20140811T220000Z
+DTEND:20140811T230000Z
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=White;PARTSTAT=NEEDS-ACTION:mailto:white@example.org
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $expected = array(
+            array(
+                'uid' => 'foobar',
+                'method' => 'REQUEST',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:strunk@example.org',
+                'senderName' => 'Strunk',
+                'recipient' => 'mailto:white@example.org',
+                'recipientName' => 'White',
+                'message' => $expectedMessage,
+            ),
+        );
+
+        $result = $this->parse($message, $expected);
+
+    }
+
+    /**
+     * @expectedException \Sabre\VObject\ITip\ITipException
+     */
+    function testBrokenEventUIDMisMatch() {
+
+        $message = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=White:mailto:white@example.org
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar2
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=White:mailto:white@example.org
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $expected = array();
+        $this->parse($message, array());
+
+    }
+    /**
+     * @expectedException \Sabre\VObject\ITip\ITipException
+     */
+    function testBrokenEventOrganizerMisMatch() {
+
+        $message = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=White:mailto:white@example.org
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+ORGANIZER:mailto:foo@example.org
+ATTENDEE;CN=White:mailto:white@example.org
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $expected = array();
+        $this->parse($message, array());
+
+    }
+
+    function testRecurrenceInvite() {
+
+        $message = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+ATTENDEE;CN=Two:mailto:two@example.org
+DTSTART:20140716T120000Z
+DURATION:PT1H
+RRULE:FREQ=DAILY
+EXDATE:20140717T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+RECURRENCE-ID:20140718T120000Z
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Two:mailto:two@example.org
+ATTENDEE;CN=Three:mailto:three@example.org
+DTSTART:20140718T120000Z
+DURATION:PT1H
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+
+        $expected = array(
+            array(
+                'uid' => 'foobar',
+                'method' => 'REQUEST',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:strunk@example.org',
+                'senderName' => 'Strunk',
+                'recipient' => 'mailto:one@example.org',
+                'recipientName' => 'One',
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:REQUEST
+BEGIN:VEVENT
+UID:foobar
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One;PARTSTAT=NEEDS-ACTION:mailto:one@example.org
+ATTENDEE;CN=Two;PARTSTAT=NEEDS-ACTION:mailto:two@example.org
+DTSTART:20140716T120000Z
+DURATION:PT1H
+RRULE:FREQ=DAILY
+EXDATE:20140717T120000Z,20140718T120000Z
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+            array(
+                'uid' => 'foobar',
+                'method' => 'REQUEST',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:strunk@example.org',
+                'senderName' => 'Strunk',
+                'recipient' => 'mailto:two@example.org',
+                'recipientName' => 'Two',
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:REQUEST
+BEGIN:VEVENT
+UID:foobar
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One;PARTSTAT=NEEDS-ACTION:mailto:one@example.org
+ATTENDEE;CN=Two;PARTSTAT=NEEDS-ACTION:mailto:two@example.org
+DTSTART:20140716T120000Z
+DURATION:PT1H
+RRULE:FREQ=DAILY
+EXDATE:20140717T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+RECURRENCE-ID:20140718T120000Z
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Two:mailto:two@example.org
+ATTENDEE;CN=Three:mailto:three@example.org
+DTSTART:20140718T120000Z
+DURATION:PT1H
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+            array(
+                'uid' => 'foobar',
+                'method' => 'REQUEST',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:strunk@example.org',
+                'senderName' => 'Strunk',
+                'recipient' => 'mailto:three@example.org',
+                'recipientName' => 'Three',
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:REQUEST
+BEGIN:VEVENT
+UID:foobar
+RECURRENCE-ID:20140718T120000Z
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Two:mailto:two@example.org
+ATTENDEE;CN=Three:mailto:three@example.org
+DTSTART:20140718T120000Z
+DURATION:PT1H
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+        );
+
+        $result = $this->parse($message, $expected);
+
+    }
+
+    function testRecurrenceInvite2() {
+
+        // This method tests a nearly identical path, but in this case the
+        // master event does not have an EXDATE.
+        $message = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+ATTENDEE;CN=Two:mailto:two@example.org
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+RRULE:FREQ=DAILY
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+RECURRENCE-ID:20140718T120000Z
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Two:mailto:two@example.org
+ATTENDEE;CN=Three:mailto:three@example.org
+DTSTART:20140718T120000Z
+DTEND:20140718T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+
+        $expected = array(
+            array(
+                'uid' => 'foobar',
+                'method' => 'REQUEST',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:strunk@example.org',
+                'senderName' => 'Strunk',
+                'recipient' => 'mailto:one@example.org',
+                'recipientName' => 'One',
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:REQUEST
+BEGIN:VEVENT
+UID:foobar
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One;PARTSTAT=NEEDS-ACTION:mailto:one@example.org
+ATTENDEE;CN=Two;PARTSTAT=NEEDS-ACTION:mailto:two@example.org
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+RRULE:FREQ=DAILY
+EXDATE:20140718T120000Z
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+            array(
+                'uid' => 'foobar',
+                'method' => 'REQUEST',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:strunk@example.org',
+                'senderName' => 'Strunk',
+                'recipient' => 'mailto:two@example.org',
+                'recipientName' => 'Two',
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:REQUEST
+BEGIN:VEVENT
+UID:foobar
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One;PARTSTAT=NEEDS-ACTION:mailto:one@example.org
+ATTENDEE;CN=Two;PARTSTAT=NEEDS-ACTION:mailto:two@example.org
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+RRULE:FREQ=DAILY
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+RECURRENCE-ID:20140718T120000Z
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Two:mailto:two@example.org
+ATTENDEE;CN=Three:mailto:three@example.org
+DTSTART:20140718T120000Z
+DTEND:20140718T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+            array(
+                'uid' => 'foobar',
+                'method' => 'REQUEST',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:strunk@example.org',
+                'senderName' => 'Strunk',
+                'recipient' => 'mailto:three@example.org',
+                'recipientName' => 'Three',
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:REQUEST
+BEGIN:VEVENT
+UID:foobar
+RECURRENCE-ID:20140718T120000Z
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Two:mailto:two@example.org
+ATTENDEE;CN=Three:mailto:three@example.org
+DTSTART:20140718T120000Z
+DTEND:20140718T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+        );
+
+        $result = $this->parse($message, $expected);
+
+    }
+
+    function testScheduleAgentClient() {
+
+        $message = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+DTSTART:20140811T220000Z
+DTEND:20140811T230000Z
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=White;SCHEDULE-AGENT=CLIENT:mailto:white@example.org
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+
+        $expected = array();
+        $result = $this->parse($message, $expected);
+
+    }
+
+    /**
+     * @expectedException Sabre\VObject\ITip\ITipException
+     */
+    function testMultipleUID() {
+
+        $message = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+ATTENDEE;CN=Two:mailto:two@example.org
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+RRULE:FREQ=DAILY
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar2
+RECURRENCE-ID:20140718T120000Z
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Two:mailto:two@example.org
+ATTENDEE;CN=Three:mailto:three@example.org
+DTSTART:20140718T120000Z
+DTEND:20140718T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+        $result = $this->parse($message, array());
+
+    }
+
+    /**
+     * @expectedException Sabre\VObject\ITip\SameOrganizerForAllComponentsException
+     *
+     */
+    function testChangingOrganizers() {
+
+        $message = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+ATTENDEE;CN=Two:mailto:two@example.org
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+RRULE:FREQ=DAILY
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+RECURRENCE-ID:20140718T120000Z
+ORGANIZER;CN=Strunk:mailto:ew@example.org
+ATTENDEE;CN=Two:mailto:two@example.org
+ATTENDEE;CN=Three:mailto:three@example.org
+DTSTART:20140718T120000Z
+DTEND:20140718T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+        $result = $this->parse($message, array());
+
+    }
+    function testNoOrganizerHasAttendee() {
+
+        $message = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foobar
+DTSTART:20140811T220000Z
+DTEND:20140811T230000Z
+ATTENDEE;CN=Two:mailto:two@example.org
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $this->parse($message, array());
+
+    }
+
+    function parse($message, $expected = array()) {
+
+        $broker = new Broker();
+        $result = $broker->parseEvent($message, 'mailto:strunk@example.org');
+
+        $this->assertEquals(count($expected), count($result));
+
+        foreach($expected as $index=>$ex) {
+
+            $message = $result[$index];
+
+            foreach($ex as $key=>$val) {
+
+                if ($key==='message') {
+                    $this->assertEquals(
+                        str_replace("\n", "\r\n", $val),
+                        rtrim($message->message->serialize(), "\r\n")
+                    );
+                } else {
+                    $this->assertEquals($val, $message->$key);
+                }
+
+            }
+
+        }
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/ITip/BrokerProcessMessageTest.php b/vendor/sabre/vobject/tests/VObject/ITip/BrokerProcessMessageTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..649df987e80d2bfde8621c039bb03aea739cc01b
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/ITip/BrokerProcessMessageTest.php
@@ -0,0 +1,168 @@
+<?php
+
+namespace Sabre\VObject\ITip;
+
+class BrokerProcessMessageTest extends BrokerTester {
+
+    function testRequestNew() {
+
+        $itip = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+METHOD:REQUEST
+BEGIN:VEVENT
+SEQUENCE:1
+UID:foobar
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $expected = <<<ICS
+BEGIN:VCALENDAR
+%foo%
+BEGIN:VEVENT
+SEQUENCE:1
+UID:foobar
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $result = $this->process($itip, null, $expected);
+
+    }
+
+    function testRequestUpdate() {
+
+        $itip = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+METHOD:REQUEST
+BEGIN:VEVENT
+SEQUENCE:2
+UID:foobar
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $old = <<<ICS
+BEGIN:VCALENDAR
+%foo%
+BEGIN:VEVENT
+SEQUENCE:1
+UID:foobar
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $expected = <<<ICS
+BEGIN:VCALENDAR
+%foo%
+BEGIN:VEVENT
+SEQUENCE:2
+UID:foobar
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $result = $this->process($itip, $old, $expected);
+
+    }
+
+    function testCancel() {
+
+        $itip = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+METHOD:CANCEL
+BEGIN:VEVENT
+SEQUENCE:2
+UID:foobar
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $old = <<<ICS
+BEGIN:VCALENDAR
+%foo%
+BEGIN:VEVENT
+SEQUENCE:1
+UID:foobar
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $expected = <<<ICS
+BEGIN:VCALENDAR
+%foo%
+BEGIN:VEVENT
+SEQUENCE:2
+UID:foobar
+STATUS:CANCELLED
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $result = $this->process($itip, $old, $expected);
+
+    }
+
+    function testCancelNoExistingEvent() {
+
+        $itip = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+METHOD:CANCEL
+BEGIN:VEVENT
+SEQUENCE:2
+UID:foobar
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $old = null;
+        $expected = null;
+
+        $result = $this->process($itip, $old, $expected);
+
+    }
+
+    function testUnsupportedComponent() {
+
+        $itip = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VTODO
+SEQUENCE:2
+UID:foobar
+END:VTODO
+END:VCALENDAR
+ICS;
+
+        $old = null;
+        $expected = null;
+
+        $result = $this->process($itip, $old, $expected);
+
+    }
+
+    function testUnsupportedMethod() {
+
+        $itip = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+METHOD:PUBLISH
+BEGIN:VEVENT
+SEQUENCE:2
+UID:foobar
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $old = null;
+        $expected = null;
+
+        $result = $this->process($itip, $old, $expected);
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/ITip/BrokerProcessReplyTest.php b/vendor/sabre/vobject/tests/VObject/ITip/BrokerProcessReplyTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..533fdce151280f9d94faccebe72e6d9c4159aa24
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/ITip/BrokerProcessReplyTest.php
@@ -0,0 +1,496 @@
+<?php
+
+namespace Sabre\VObject\ITip;
+
+class BrokerProcessReplyTest extends BrokerTester {
+
+    function testReplyNoOriginal() {
+
+        $itip = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+METHOD:REPLY
+BEGIN:VEVENT
+SEQUENCE:2
+UID:foobar
+ATTENDEE;PARTSTAT=ACCEPTED:mailto:foo@example.org
+ORGANIZER:mailto:bar@example.org
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $old = null;
+        $expected = null;
+
+        $result = $this->process($itip, $old, $expected);
+
+    }
+
+    function testReplyAccept() {
+
+        $itip = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+METHOD:REPLY
+BEGIN:VEVENT
+ATTENDEE;PARTSTAT=ACCEPTED:mailto:foo@example.org
+ORGANIZER:mailto:bar@example.org
+SEQUENCE:2
+UID:foobar
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $old = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+SEQUENCE:2
+UID:foobar
+ATTENDEE:mailto:foo@example.org
+ORGANIZER:mailto:bar@example.org
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $expected = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+SEQUENCE:2
+UID:foobar
+ATTENDEE;PARTSTAT=ACCEPTED;SCHEDULE-STATUS=2.0:mailto:foo@example.org
+ORGANIZER:mailto:bar@example.org
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $result = $this->process($itip, $old, $expected);
+
+    }
+
+    function testReplyRequestStatus() {
+
+        $itip = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+METHOD:REPLY
+BEGIN:VEVENT
+UID:foobar
+REQUEST-STATUS:2.3;foo-bar!
+ATTENDEE;PARTSTAT=ACCEPTED:mailto:foo@example.org
+ORGANIZER:mailto:bar@example.org
+SEQUENCE:2
+UID:foobar
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $old = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:2
+ATTENDEE:mailto:foo@example.org
+ORGANIZER:mailto:bar@example.org
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $expected = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:2
+ATTENDEE;PARTSTAT=ACCEPTED;SCHEDULE-STATUS=2.3:mailto:foo@example.org
+ORGANIZER:mailto:bar@example.org
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $result = $this->process($itip, $old, $expected);
+
+    }
+
+
+    function testReplyPartyCrasher() {
+
+        $itip = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+METHOD:REPLY
+BEGIN:VEVENT
+ATTENDEE;PARTSTAT=ACCEPTED:mailto:crasher@example.org
+ORGANIZER:mailto:bar@example.org
+SEQUENCE:2
+UID:foobar
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $old = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+SEQUENCE:2
+UID:foobar
+ATTENDEE:mailto:foo@example.org
+ORGANIZER:mailto:bar@example.org
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $expected = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+SEQUENCE:2
+UID:foobar
+ATTENDEE:mailto:foo@example.org
+ORGANIZER:mailto:bar@example.org
+ATTENDEE;PARTSTAT=ACCEPTED:mailto:crasher@example.org
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $result = $this->process($itip, $old, $expected);
+
+    }
+
+    function testReplyNewException() {
+
+        // This is a reply to 1 instance of a recurring event. This should
+        // automatically create an exception.
+        $itip = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+METHOD:REPLY
+BEGIN:VEVENT
+ATTENDEE;PARTSTAT=ACCEPTED:mailto:foo@example.org
+ORGANIZER:mailto:bar@example.org
+SEQUENCE:2
+RECURRENCE-ID:20140725T000000Z
+UID:foobar
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $old = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+SEQUENCE:2
+UID:foobar
+RRULE:FREQ=DAILY
+DTSTART:20140724T000000Z
+DTEND:20140724T010000Z
+ATTENDEE:mailto:foo@example.org
+ORGANIZER:mailto:bar@example.org
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $expected = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+SEQUENCE:2
+UID:foobar
+RRULE:FREQ=DAILY
+DTSTART:20140724T000000Z
+DTEND:20140724T010000Z
+ATTENDEE:mailto:foo@example.org
+ORGANIZER:mailto:bar@example.org
+END:VEVENT
+BEGIN:VEVENT
+SEQUENCE:2
+UID:foobar
+DTSTART:20140725T000000Z
+DTEND:20140725T010000Z
+ATTENDEE;PARTSTAT=ACCEPTED:mailto:foo@example.org
+ORGANIZER:mailto:bar@example.org
+RECURRENCE-ID:20140725T000000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $result = $this->process($itip, $old, $expected);
+
+    }
+
+    function testReplyNewExceptionTz() {
+
+        // This is a reply to 1 instance of a recurring event. This should
+        // automatically create an exception.
+        $itip = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+METHOD:REPLY
+BEGIN:VEVENT
+ATTENDEE;PARTSTAT=ACCEPTED:mailto:foo@example.org
+ORGANIZER:mailto:bar@example.org
+SEQUENCE:2
+RECURRENCE-ID;TZID=America/Toronto:20140725T000000
+UID:foobar
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $old = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+SEQUENCE:2
+UID:foobar
+RRULE:FREQ=DAILY
+DTSTART;TZID=America/Toronto:20140724T000000
+DTEND;TZID=America/Toronto:20140724T010000
+ATTENDEE:mailto:foo@example.org
+ORGANIZER:mailto:bar@example.org
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $expected = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+SEQUENCE:2
+UID:foobar
+RRULE:FREQ=DAILY
+DTSTART;TZID=America/Toronto:20140724T000000
+DTEND;TZID=America/Toronto:20140724T010000
+ATTENDEE:mailto:foo@example.org
+ORGANIZER:mailto:bar@example.org
+END:VEVENT
+BEGIN:VEVENT
+SEQUENCE:2
+UID:foobar
+DTSTART;TZID=America/Toronto:20140725T000000
+DTEND;TZID=America/Toronto:20140725T010000
+ATTENDEE;PARTSTAT=ACCEPTED:mailto:foo@example.org
+ORGANIZER:mailto:bar@example.org
+RECURRENCE-ID;TZID=America/Toronto:20140725T000000
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $result = $this->process($itip, $old, $expected);
+
+    }
+
+    function testReplyPartyCrashCreateExcepton() {
+
+        // IN this test there's a recurring event that has an exception. The
+        // exception is missing the attendee.
+        //
+        // The attendee party crashes the instance, so it should show up in the
+        // resulting object.
+        $itip = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+METHOD:REPLY
+BEGIN:VEVENT
+ATTENDEE;PARTSTAT=ACCEPTED;CN=Crasher!:mailto:crasher@example.org
+ORGANIZER:mailto:bar@example.org
+SEQUENCE:2
+RECURRENCE-ID:20140725T000000Z
+UID:foobar
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $old = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+SEQUENCE:2
+UID:foobar
+RRULE:FREQ=DAILY
+DTSTART:20140724T000000Z
+DTEND:20140724T010000Z
+ORGANIZER:mailto:bar@example.org
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $expected = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+SEQUENCE:2
+UID:foobar
+RRULE:FREQ=DAILY
+DTSTART:20140724T000000Z
+DTEND:20140724T010000Z
+ORGANIZER:mailto:bar@example.org
+END:VEVENT
+BEGIN:VEVENT
+SEQUENCE:2
+UID:foobar
+DTSTART:20140725T000000Z
+DTEND:20140725T010000Z
+ORGANIZER:mailto:bar@example.org
+RECURRENCE-ID:20140725T000000Z
+ATTENDEE;PARTSTAT=ACCEPTED;CN=Crasher!:mailto:crasher@example.org
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $result = $this->process($itip, $old, $expected);
+
+    }
+
+    function testReplyNewExceptionNoMasterEvent() {
+
+        /**
+         * This iTip message would normally create a new exception, but the
+         * server is not able to create this new instance, because there's no
+         * master event to clone from.
+         *
+         * This test checks if the message is ignored.
+         */
+        $itip = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+METHOD:REPLY
+BEGIN:VEVENT
+ATTENDEE;PARTSTAT=ACCEPTED;CN=Crasher!:mailto:crasher@example.org
+ORGANIZER:mailto:bar@example.org
+SEQUENCE:2
+RECURRENCE-ID:20140725T000000Z
+UID:foobar
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $old = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+SEQUENCE:2
+UID:foobar
+RRULE:FREQ=DAILY
+DTSTART:20140724T000000Z
+DTEND:20140724T010000Z
+RECURRENCE-ID:20140724T000000Z
+ORGANIZER:mailto:bar@example.org
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $expected = null;
+        $result = $this->process($itip, $old, $expected);
+
+    }
+
+    /**
+     * @depends testReplyAccept
+     */
+    function testReplyAcceptUpdateRSVP() {
+
+        $itip = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+METHOD:REPLY
+BEGIN:VEVENT
+ATTENDEE;PARTSTAT=ACCEPTED:mailto:foo@example.org
+ORGANIZER:mailto:bar@example.org
+SEQUENCE:2
+UID:foobar
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $old = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+SEQUENCE:2
+UID:foobar
+ATTENDEE;RSVP=TRUE:mailto:foo@example.org
+ORGANIZER:mailto:bar@example.org
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $expected = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+SEQUENCE:2
+UID:foobar
+ATTENDEE;PARTSTAT=ACCEPTED;SCHEDULE-STATUS=2.0:mailto:foo@example.org
+ORGANIZER:mailto:bar@example.org
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $result = $this->process($itip, $old, $expected);
+
+    }
+
+    function testReplyNewExceptionFirstOccurence() {
+
+        // This is a reply to 1 instance of a recurring event. This should
+        // automatically create an exception.
+        $itip = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+METHOD:REPLY
+BEGIN:VEVENT
+ATTENDEE;PARTSTAT=ACCEPTED:mailto:foo@example.org
+ORGANIZER:mailto:bar@example.org
+SEQUENCE:2
+RECURRENCE-ID:20140724T000000Z
+UID:foobar
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $old = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+SEQUENCE:2
+UID:foobar
+RRULE:FREQ=DAILY
+DTSTART:20140724T000000Z
+DTEND:20140724T010000Z
+ATTENDEE:mailto:foo@example.org
+ORGANIZER:mailto:bar@example.org
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $expected = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+SEQUENCE:2
+UID:foobar
+RRULE:FREQ=DAILY
+DTSTART:20140724T000000Z
+DTEND:20140724T010000Z
+ATTENDEE:mailto:foo@example.org
+ORGANIZER:mailto:bar@example.org
+END:VEVENT
+BEGIN:VEVENT
+SEQUENCE:2
+UID:foobar
+DTSTART:20140724T000000Z
+DTEND:20140724T010000Z
+ATTENDEE;PARTSTAT=ACCEPTED:mailto:foo@example.org
+ORGANIZER:mailto:bar@example.org
+RECURRENCE-ID:20140724T000000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $result = $this->process($itip, $old, $expected);
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/ITip/BrokerTester.php b/vendor/sabre/vobject/tests/VObject/ITip/BrokerTester.php
new file mode 100644
index 0000000000000000000000000000000000000000..54c17029a5569220caa71a9015a06056a87b9f4c
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/ITip/BrokerTester.php
@@ -0,0 +1,103 @@
+<?php
+
+namespace Sabre\VObject\ITip;
+
+use Sabre\VObject\Reader;
+
+/**
+ * Utilities for testing the broker
+ * 
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (http://evertpot.com/) 
+ * @license http://sabre.io/license/ Modified BSD License
+ */
+abstract class BrokerTester extends \Sabre\VObject\TestCase {
+
+    function parse($oldMessage, $newMessage, $expected = array(), $currentUser = 'mailto:one@example.org') {
+
+        $broker = new Broker();
+        $result = $broker->parseEvent($newMessage, $currentUser, $oldMessage);
+
+        $this->assertEquals(count($expected), count($result));
+
+        foreach($expected as $index=>$ex) {
+
+            $message = $result[$index];
+
+            foreach($ex as $key=>$val) {
+
+                if ($key==='message') {
+                    $this->assertVObjEquals(
+                        $val,
+                        $message->message->serialize()
+                    );
+                } else {
+                    $this->assertEquals($val, $message->$key);
+                }
+
+            }
+
+        }
+
+    }
+
+    function process($input, $existingObject = null, $expected = false) {
+
+        $version = \Sabre\VObject\Version::VERSION;
+
+        $vcal = Reader::read($input);
+
+        foreach($vcal->getComponents() as $mainComponent) {
+            break;
+        }
+
+        $message = new Message();
+        $message->message = $vcal;
+        $message->method = isset($vcal->METHOD)?$vcal->METHOD->getValue():null;
+        $message->component = $mainComponent->name;
+        $message->uid = $mainComponent->uid->getValue();
+        $message->sequence = isset($vcal->VEVENT[0])?(string)$vcal->VEVENT[0]->SEQUENCE:null;
+
+        if ($message->method === 'REPLY') {
+
+            $message->sender = $mainComponent->ATTENDEE->getValue();
+            $message->senderName = isset($mainComponent->ATTENDEE['CN'])?$mainComponent->ATTENDEE['CN']->getValue():null;
+            $message->recipient = $mainComponent->ORGANIZER->getValue();
+            $message->recipientName = isset($mainComponent->ORGANIZER['CN'])?$mainComponent->ORGANIZER['CN']:null;
+
+        }
+
+        $broker = new Broker();
+
+        if (is_string($existingObject)) {
+            $existingObject = str_replace(
+                '%foo%',
+                "VERSION:2.0\nPRODID:-//Sabre//Sabre VObject $version//EN\nCALSCALE:GREGORIAN",
+                $existingObject
+            );
+            $existingObject = Reader::read($existingObject);
+        }
+
+        $result = $broker->processMessage($message, $existingObject);
+
+        if (is_string($expected)) {
+            $expected = str_replace(
+                '%foo%',
+                "VERSION:2.0\nPRODID:-//Sabre//Sabre VObject $version//EN\nCALSCALE:GREGORIAN",
+                $expected
+            );
+            $expected = str_replace("\n", "\r\n", $expected);
+
+        }
+        if ($result instanceof \Sabre\VObject\Component\VCalendar) {
+            $result = $result->serialize();
+            $result = rtrim($result,"\r\n");
+        }
+
+        $this->assertEquals(
+            $expected,
+            $result
+        );
+
+    }
+}
diff --git a/vendor/sabre/vobject/tests/VObject/ITip/BrokerTimezoneInParseEventInfoWithoutMasterTest.php b/vendor/sabre/vobject/tests/VObject/ITip/BrokerTimezoneInParseEventInfoWithoutMasterTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..255a84e8c1e12fa9de24e6a63e7bb9d561160125
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/ITip/BrokerTimezoneInParseEventInfoWithoutMasterTest.php
@@ -0,0 +1,77 @@
+<?php
+
+namespace Sabre\VObject\ITip;
+
+use Sabre\VObject\Reader;
+
+class BrokerTimezoneInParseEventInfoWithoutMasterTest extends \PHPUnit_Framework_TestCase {
+
+    function testTimezoneInParseEventInfoWithoutMaster()
+    {
+        $calendar = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//Mac OS X 10.9.5//EN
+CALSCALE:GREGORIAN
+BEGIN:VTIMEZONE
+TZID:Europe/Minsk
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+RRULE:FREQ=YEARLY;UNTIL=20100328T000000Z;BYMONTH=3;BYDAY=-1SU
+DTSTART:19930328T020000
+TZNAME:GMT+3
+TZOFFSETTO:+0300
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+DTSTART:20110327T020000
+TZNAME:GMT+3
+TZOFFSETTO:+0300
+RDATE:20110327T020000
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+CREATED:20160331T163031Z
+UID:B9301437-417C-4136-8DB3-8D1555863791
+DTEND;TZID=Europe/Minsk:20160405T100000
+TRANSP:OPAQUE
+ATTENDEE;CN=User Invitee;CUTYPE=INDIVIDUAL;EMAIL=invitee@test.com;PARTSTAT=
+ ACCEPTED;ROLE=REQ-PARTICIPANT:mailto:invitee@test.com
+ATTENDEE;CN=User Organizer;CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:mailto:organ
+ izer@test.com
+SUMMARY:Event title
+DTSTART;TZID=Europe/Minsk:20160405T090000
+DTSTAMP:20160331T164108Z
+ORGANIZER;CN=User Organizer:mailto:organizer@test.com
+SEQUENCE:6
+RECURRENCE-ID;TZID=Europe/Minsk:20160405T090000
+END:VEVENT
+BEGIN:VEVENT
+CREATED:20160331T163031Z
+UID:B9301437-417C-4136-8DB3-8D1555863791
+DTEND;TZID=Europe/Minsk:20160406T100000
+TRANSP:OPAQUE
+ATTENDEE;CN=User Invitee;CUTYPE=INDIVIDUAL;EMAIL=invitee@test.com;PARTSTAT=
+ ACCEPTED;ROLE=REQ-PARTICIPANT:mailto:invitee@test.com
+ATTENDEE;CN=User Organizer;CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:mailto:organ
+ izer@test.com
+SUMMARY:Event title
+DTSTART;TZID=Europe/Minsk:20160406T090000
+DTSTAMP:20160331T165845Z
+ORGANIZER;CN=User Organizer:mailto:organizer@test.com
+SEQUENCE:6
+RECURRENCE-ID;TZID=Europe/Minsk:20160406T090000
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $calendar = Reader::read($calendar);
+        $broker = new Broker();
+
+        $reflectionMethod = new \ReflectionMethod($broker, 'parseEventInfo');
+        $reflectionMethod->setAccessible(true);
+        $data = $reflectionMethod->invoke($broker, $calendar);
+        $this->assertInstanceOf('DateTimeZone', $data['timezone']);
+        $this->assertEquals($data['timezone']->getName(), 'Europe/Minsk');
+    }
+}
diff --git a/vendor/sabre/vobject/tests/VObject/ITip/BrokerUpdateEventTest.php b/vendor/sabre/vobject/tests/VObject/ITip/BrokerUpdateEventTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..1d7de7cf72983842f35cb3492076c7f514bb4230
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/ITip/BrokerUpdateEventTest.php
@@ -0,0 +1,841 @@
+<?php
+
+namespace Sabre\VObject\ITip;
+
+class BrokerUpdateTest extends BrokerTester {
+
+    function testInviteChange() {
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+SUMMARY:foo
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Strunk;PARTSTAT=ACCEPTED:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+ATTENDEE;CN=Two:mailto:two@example.org
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+        $newMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:2
+SUMMARY:foo
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Strunk;PARTSTAT=ACCEPTED:mailto:strunk@example.org
+ATTENDEE;CN=Two:mailto:two@example.org
+ATTENDEE;CN=Three:mailto:three@example.org
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+
+        $expected = array(
+            array(
+                'uid' => 'foobar',
+                'method' => 'CANCEL',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:strunk@example.org',
+                'senderName' => 'Strunk',
+                'recipient' => 'mailto:one@example.org',
+                'recipientName' => 'One',
+                'significantChange' => true,
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:CANCEL
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:2
+SUMMARY:foo
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+            array(
+                'uid' => 'foobar',
+                'method' => 'REQUEST',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:strunk@example.org',
+                'senderName' => 'Strunk',
+                'recipient' => 'mailto:two@example.org',
+                'recipientName' => 'Two',
+                'significantChange' => false,
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:REQUEST
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:2
+SUMMARY:foo
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Strunk;PARTSTAT=ACCEPTED:mailto:strunk@example.org
+ATTENDEE;CN=Two;PARTSTAT=NEEDS-ACTION:mailto:two@example.org
+ATTENDEE;CN=Three;PARTSTAT=NEEDS-ACTION:mailto:three@example.org
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+            array(
+                'uid' => 'foobar',
+                'method' => 'REQUEST',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:strunk@example.org',
+                'senderName' => 'Strunk',
+                'recipient' => 'mailto:three@example.org',
+                'recipientName' => 'Three',
+                'significantChange' => true,
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:REQUEST
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:2
+SUMMARY:foo
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Strunk;PARTSTAT=ACCEPTED:mailto:strunk@example.org
+ATTENDEE;CN=Two;PARTSTAT=NEEDS-ACTION:mailto:two@example.org
+ATTENDEE;CN=Three;PARTSTAT=NEEDS-ACTION:mailto:three@example.org
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+        );
+
+        $this->parse($oldMessage, $newMessage, $expected, 'mailto:strunk@example.org');
+
+    }
+
+    function testInviteChangeFromNonSchedulingToSchedulingObject() {
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+        $newMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:2
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+
+        $expected = array(
+            array(
+                'uid' => 'foobar',
+                'method' => 'REQUEST',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:strunk@example.org',
+                'senderName' => 'Strunk',
+                'recipient' => 'mailto:one@example.org',
+                'recipientName' => 'One',
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:REQUEST
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:2
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One;PARTSTAT=NEEDS-ACTION:mailto:one@example.org
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+
+        );
+
+        $this->parse($oldMessage, $newMessage, $expected, 'mailto:strunk@example.org');
+
+    }
+
+    function testInviteChangeFromSchedulingToNonSchedulingObject() {
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:2
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+        $newMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+
+        $expected = array(
+            array(
+                'uid' => 'foobar',
+                'method' => 'CANCEL',
+                'component' => 'VEVENT',
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:CANCEL
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+
+        );
+
+        $this->parse($oldMessage, $newMessage, $expected, 'mailto:strunk@example.org');
+
+    }
+
+    function testNoAttendees() {
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+        $newMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:2
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+
+        $expected = array();
+        $this->parse($oldMessage, $newMessage, $expected, 'mailto:strunk@example.org');
+
+    }
+
+    function testRemoveInstance() {
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+DTSTART;TZID=America/Toronto:20140716T120000
+DTEND;TZID=America/Toronto:20140716T130000
+RRULE:FREQ=WEEKLY
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+        $newMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:2
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+DTSTART;TZID=America/Toronto:20140716T120000
+DTEND;TZID=America/Toronto:20140716T130000
+RRULE:FREQ=WEEKLY
+EXDATE;TZID=America/Toronto:20140724T120000
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+
+        $expected = array(
+            array(
+                'uid' => 'foobar',
+                'method' => 'REQUEST',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:strunk@example.org',
+                'senderName' => 'Strunk',
+                'recipient' => 'mailto:one@example.org',
+                'recipientName' => 'One',
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:REQUEST
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:2
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One;PARTSTAT=NEEDS-ACTION:mailto:one@example.org
+DTSTART;TZID=America/Toronto:20140716T120000
+DTEND;TZID=America/Toronto:20140716T130000
+RRULE:FREQ=WEEKLY
+EXDATE;TZID=America/Toronto:20140724T120000
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+        );
+
+        $this->parse($oldMessage, $newMessage, $expected, 'mailto:strunk@example.org');
+
+    }
+
+    /**
+     * This test is identical to the first test, except this time we change the
+     * DURATION property.
+     *
+     * This should ensure that the message is significant for every attendee,
+     */
+    function testInviteChangeSignificantChange() {
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+DURATION:PT1H
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Strunk;PARTSTAT=ACCEPTED:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+ATTENDEE;CN=Two:mailto:two@example.org
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+        $newMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+DURATION:PT2H
+SEQUENCE:2
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Strunk;PARTSTAT=ACCEPTED:mailto:strunk@example.org
+ATTENDEE;CN=Two:mailto:two@example.org
+ATTENDEE;CN=Three:mailto:three@example.org
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+
+        $expected = array(
+            array(
+                'uid' => 'foobar',
+                'method' => 'CANCEL',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:strunk@example.org',
+                'senderName' => 'Strunk',
+                'recipient' => 'mailto:one@example.org',
+                'recipientName' => 'One',
+                'significantChange' => true,
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:CANCEL
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:2
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+            array(
+                'uid' => 'foobar',
+                'method' => 'REQUEST',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:strunk@example.org',
+                'senderName' => 'Strunk',
+                'recipient' => 'mailto:two@example.org',
+                'recipientName' => 'Two',
+                'significantChange' => true,
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:REQUEST
+BEGIN:VEVENT
+UID:foobar
+DURATION:PT2H
+SEQUENCE:2
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Strunk;PARTSTAT=ACCEPTED:mailto:strunk@example.org
+ATTENDEE;CN=Two;PARTSTAT=NEEDS-ACTION:mailto:two@example.org
+ATTENDEE;CN=Three;PARTSTAT=NEEDS-ACTION:mailto:three@example.org
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+            array(
+                'uid' => 'foobar',
+                'method' => 'REQUEST',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:strunk@example.org',
+                'senderName' => 'Strunk',
+                'recipient' => 'mailto:three@example.org',
+                'recipientName' => 'Three',
+                'significantChange' => true,
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:REQUEST
+BEGIN:VEVENT
+UID:foobar
+DURATION:PT2H
+SEQUENCE:2
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Strunk;PARTSTAT=ACCEPTED:mailto:strunk@example.org
+ATTENDEE;CN=Two;PARTSTAT=NEEDS-ACTION:mailto:two@example.org
+ATTENDEE;CN=Three;PARTSTAT=NEEDS-ACTION:mailto:three@example.org
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+        );
+
+        $this->parse($oldMessage, $newMessage, $expected, 'mailto:strunk@example.org');
+
+    }
+
+    function testInviteNoChange() {
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Strunk;PARTSTAT=ACCEPTED:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+        $newMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:2
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Strunk;PARTSTAT=ACCEPTED:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+
+        $expected = array(
+            array(
+                'uid' => 'foobar',
+                'method' => 'REQUEST',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:strunk@example.org',
+                'senderName' => 'Strunk',
+                'recipient' => 'mailto:one@example.org',
+                'recipientName' => 'One',
+                'significantChange' => false,
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:REQUEST
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:2
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Strunk;PARTSTAT=ACCEPTED:mailto:strunk@example.org
+ATTENDEE;CN=One;PARTSTAT=NEEDS-ACTION:mailto:one@example.org
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+
+        );
+
+        $this->parse($oldMessage, $newMessage, $expected, 'mailto:strunk@example.org');
+
+    }
+
+    function testInviteNoChangeForceSend() {
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Strunk;PARTSTAT=ACCEPTED:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+        $newMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:2
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Strunk;PARTSTAT=ACCEPTED:mailto:strunk@example.org
+ATTENDEE;SCHEDULE-FORCE-SEND=REQUEST;CN=One:mailto:one@example.org
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+
+        $expected = array(
+            array(
+                'uid' => 'foobar',
+                'method' => 'REQUEST',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:strunk@example.org',
+                'senderName' => 'Strunk',
+                'recipient' => 'mailto:one@example.org',
+                'recipientName' => 'One',
+                'significantChange' => true,
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:REQUEST
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:2
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Strunk;PARTSTAT=ACCEPTED:mailto:strunk@example.org
+ATTENDEE;CN=One;PARTSTAT=NEEDS-ACTION:mailto:one@example.org
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+
+        );
+
+        $this->parse($oldMessage, $newMessage, $expected, 'mailto:strunk@example.org');
+
+    }
+
+    function testInviteRemoveAttendees() {
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+SUMMARY:foo
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+ATTENDEE;CN=Two:mailto:two@example.org
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+        $newMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:2
+SUMMARY:foo
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+
+        $expected = array(
+            array(
+                'uid' => 'foobar',
+                'method' => 'CANCEL',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:strunk@example.org',
+                'senderName' => 'Strunk',
+                'recipient' => 'mailto:one@example.org',
+                'recipientName' => 'One',
+                'significantChange' => true,
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:CANCEL
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:2
+SUMMARY:foo
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=One:mailto:one@example.org
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+            array(
+                'uid' => 'foobar',
+                'method' => 'CANCEL',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:strunk@example.org',
+                'senderName' => 'Strunk',
+                'recipient' => 'mailto:two@example.org',
+                'recipientName' => 'Two',
+                'significantChange' => true,
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:CANCEL
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:2
+SUMMARY:foo
+DTSTART:20140716T120000Z
+DTEND:20140716T130000Z
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Two:mailto:two@example.org
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+        );
+
+        $result = $this->parse($oldMessage, $newMessage, $expected, 'mailto:strunk@example.org');
+
+    }
+
+    function testInviteChangeExdateOrder() {
+
+        $oldMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//Mac OS X 10.10.1//EN
+CALSCALE:GREGORIAN
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:0
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Strunk;CUTYPE=INDIVIDUAL;EMAIL=strunk@example.org;PARTSTAT=ACCE
+ PTED:mailto:strunk@example.org
+ATTENDEE;CN=One;CUTYPE=INDIVIDUAL;EMAIL=one@example.org;PARTSTAT=ACCEPTED;R
+ OLE=REQ-PARTICIPANT;SCHEDULE-STATUS="1.2;Message delivered locally":mailto
+ :one@example.org
+SUMMARY:foo
+DTSTART:20141211T160000Z
+DTEND:20141211T170000Z
+RRULE:FREQ=WEEKLY
+EXDATE:20141225T160000Z,20150101T160000Z
+EXDATE:20150108T160000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+        $newMessage = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//Mac OS X 10.10.1//EN
+CALSCALE:GREGORIAN
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Strunk;CUTYPE=INDIVIDUAL;EMAIL=strunk@example.org;PARTSTAT=ACCE
+ PTED:mailto:strunk@example.org
+ATTENDEE;CN=One;CUTYPE=INDIVIDUAL;EMAIL=one@example.org;PARTSTAT=ACCEPTED;R
+ OLE=REQ-PARTICIPANT;SCHEDULE-STATUS=1.2:mailto:one@example.org
+DTSTART:20141211T160000Z
+DTEND:20141211T170000Z
+RRULE:FREQ=WEEKLY
+EXDATE:20150101T160000Z
+EXDATE:20150108T160000Z,20141225T160000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION;
+
+        $expected = array(
+            array(
+                'uid' => 'foobar',
+                'method' => 'REQUEST',
+                'component' => 'VEVENT',
+                'sender' => 'mailto:strunk@example.org',
+                'senderName' => 'Strunk',
+                'recipient' => 'mailto:one@example.org',
+                'recipientName' => 'One',
+                'significantChange' => false,
+                'message' => <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:REQUEST
+BEGIN:VEVENT
+UID:foobar
+SEQUENCE:1
+ORGANIZER;CN=Strunk:mailto:strunk@example.org
+ATTENDEE;CN=Strunk;CUTYPE=INDIVIDUAL;EMAIL=strunk@example.org;PARTSTAT=ACCE
+ PTED:mailto:strunk@example.org
+ATTENDEE;CN=One;CUTYPE=INDIVIDUAL;EMAIL=one@example.org;PARTSTAT=ACCEPTED;R
+ OLE=REQ-PARTICIPANT:mailto:one@example.org
+DTSTART:20141211T160000Z
+DTEND:20141211T170000Z
+RRULE:FREQ=WEEKLY
+EXDATE:20150101T160000Z
+EXDATE:20150108T160000Z,20141225T160000Z
+END:VEVENT
+END:VCALENDAR
+ICS
+
+            ),
+        );
+
+        $this->parse($oldMessage, $newMessage, $expected, 'mailto:strunk@example.org');
+
+    }
+}
diff --git a/vendor/sabre/vobject/tests/VObject/ITip/EvolutionTest.php b/vendor/sabre/vobject/tests/VObject/ITip/EvolutionTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..76c47ca0cc551b0d9fd72e8e208c96c70cf49bdc
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/ITip/EvolutionTest.php
@@ -0,0 +1,2653 @@
+<?php
+
+namespace Sabre\VObject\ITip;
+
+class EvolutionTest extends BrokerTester {
+
+    /**
+     * Evolution does things as usual a little bit differently.
+     *
+     * We're adding a seprate test just for it.
+     */
+    function testNewEvolutionEvent() {
+
+        $ics = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+CALSCALE:GREGORIAN
+PRODID:-//Ximian//NONSGML Evolution Calendar//EN
+BEGIN:VTIMEZONE
+TZID:/freeassociation.sourceforge.net/Tzfile/America/Toronto
+X-LIC-LOCATION:America/Toronto
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19691026T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19700426T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19701025T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19710425T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19711031T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19720430T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19721029T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19730429T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19731028T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19740428T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19741027T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19750427T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19751026T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19760425T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19761031T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19770424T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19771030T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19780430T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19781029T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19790429T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19791028T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19800427T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19801026T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19810426T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19811025T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19820425T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19821031T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19830424T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19831030T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19840429T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19841028T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19850428T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19851027T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19860427T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19861026T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19870405T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19871025T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19880403T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19881030T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19890402T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19891029T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19900401T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19901028T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19910407T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19911027T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19920405T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19921025T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19930404T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19931031T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19940403T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19941030T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19950402T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19951029T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19960407T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19961027T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19970406T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19971026T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19980405T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19981025T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19990404T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19991031T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20000402T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20001029T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20010401T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20011028T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20020407T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20021027T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20030406T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20031026T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20040404T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20041031T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20050403T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20051030T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20060402T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20061029T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20070311T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20071104T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20080309T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20081102T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20090308T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20091101T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20100314T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20101107T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20110313T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20111106T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20120311T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20121104T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20130310T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20131103T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20140309T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20141102T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20150308T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20151101T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20160313T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20161106T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20170312T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20171105T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20180311T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20181104T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20190310T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20191103T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20200308T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20201101T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20210314T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20211107T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20220313T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20221106T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20230312T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20231105T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20240310T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20241103T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20250309T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20251102T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20260308T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20261101T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20270314T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20271107T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20280312T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20281105T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20290311T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20291104T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20300310T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20301103T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20310309T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20311102T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20320314T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20321107T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20330313T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20331106T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20340312T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20341105T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20350311T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20351104T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20360309T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20361102T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20370308T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20371101T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+UID:20140813T153116Z-12176-1000-1065-6@johnny-lubuntu
+DTSTAMP:20140813T142829Z
+DTSTART;TZID=/freeassociation.sourceforge.net/Tzfile/America/Toronto:201408
+ 15T110000
+DTEND;TZID=/freeassociation.sourceforge.net/Tzfile/America/Toronto:20140815
+ T113000
+TRANSP:OPAQUE
+SEQUENCE:2
+SUMMARY:Evo makes a Meeting (fruux HQ) (fruux HQ)
+LOCATION:fruux HQ
+CLASS:PUBLIC
+ORGANIZER;SENT-BY="MAILTO:martin+johnny@fruux.com":MAILTO:martin@fruux.com
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;RSVP=TRUE
+ ;SENT-BY="MAILTO:martin+johnny@fruux.com";LANGUAGE=en:MAILTO:martin@fruux.
+ com
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=
+ TRUE;LANGUAGE=en:MAILTO:dominik@fruux.com
+CREATED:20140813T153211Z
+LAST-MODIFIED:20140813T155353Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $version = \Sabre\VObject\Version::VERSION; 
+        $expectedICS = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+METHOD:REQUEST
+BEGIN:VTIMEZONE
+TZID:/freeassociation.sourceforge.net/Tzfile/America/Toronto
+X-LIC-LOCATION:America/Toronto
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19691026T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19700426T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19701025T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19710425T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19711031T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19720430T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19721029T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19730429T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19731028T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19740428T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19741027T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19750427T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19751026T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19760425T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19761031T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19770424T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19771030T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19780430T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19781029T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19790429T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19791028T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19800427T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19801026T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19810426T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19811025T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19820425T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19821031T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19830424T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19831030T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19840429T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19841028T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19850428T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19851027T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19860427T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19861026T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19870405T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19871025T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19880403T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19881030T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19890402T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19891029T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19900401T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19901028T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19910407T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19911027T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19920405T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19921025T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19930404T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19931031T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19940403T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19941030T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19950402T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19951029T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19960407T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19961027T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19970406T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19971026T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19980405T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19981025T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19990404T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19991031T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20000402T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20001029T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20010401T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20011028T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20020407T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20021027T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20030406T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20031026T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20040404T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20041031T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20050403T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20051030T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20060402T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20061029T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20070311T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20071104T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20080309T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20081102T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20090308T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20091101T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20100314T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20101107T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20110313T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20111106T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20120311T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20121104T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20130310T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20131103T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20140309T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20141102T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20150308T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20151101T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20160313T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20161106T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20170312T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20171105T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20180311T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20181104T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20190310T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20191103T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20200308T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20201101T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20210314T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20211107T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20220313T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20221106T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20230312T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20231105T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20240310T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20241103T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20250309T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20251102T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20260308T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20261101T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20270314T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20271107T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20280312T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20281105T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20290311T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20291104T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20300310T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20301103T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20310309T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20311102T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20320314T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20321107T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20330313T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20331106T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20340312T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20341105T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20350311T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20351104T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20360309T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20361102T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20370308T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20371101T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+UID:20140813T153116Z-12176-1000-1065-6@johnny-lubuntu
+DTSTAMP:20140813T142829Z
+DTSTART;TZID=/freeassociation.sourceforge.net/Tzfile/America/Toronto:201408
+ 15T110000
+DTEND;TZID=/freeassociation.sourceforge.net/Tzfile/America/Toronto:20140815
+ T113000
+TRANSP:OPAQUE
+SEQUENCE:2
+SUMMARY:Evo makes a Meeting (fruux HQ) (fruux HQ)
+LOCATION:fruux HQ
+CLASS:PUBLIC
+ORGANIZER;SENT-BY="MAILTO:martin+johnny@fruux.com":MAILTO:martin@fruux.com
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;RSVP=TRUE
+ ;SENT-BY="MAILTO:martin+johnny@fruux.com";LANGUAGE=en:MAILTO:martin@fruux.
+ com
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=
+ TRUE;LANGUAGE=en:MAILTO:dominik@fruux.com
+CREATED:20140813T153211Z
+LAST-MODIFIED:20140813T155353Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $expected = array(
+            array(
+                'uid' => '20140813T153116Z-12176-1000-1065-6@johnny-lubuntu',
+                'method' => 'REQUEST',
+                'sender' => 'mailto:martin@fruux.com',
+                'senderName' => null,
+                'recipient' => 'mailto:dominik@fruux.com',
+                'recipientName' => null,
+                'message' => $expectedICS,
+            )
+        ); 
+        $this->parse(null, $ics, $expected, 'mailto:martin@fruux.com');
+
+    }
+
+    /**
+     * This is an event originally from evolution, then parsed by sabredav and
+     * again mangled by iCal. This triggered a few bugs related to email
+     * address scheme casing.
+     */
+    public function testAttendeeModify() {
+
+        $old = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject 3.3.1//EN
+CALSCALE:GREGORIAN
+BEGIN:VTIMEZONE
+TZID:/freeassociation.sourceforge.net/Tzfile/America/Toronto
+X-LIC-LOCATION:America/Toronto
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19691026T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19700426T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19701025T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19710425T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19711031T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19720430T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19721029T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19730429T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19731028T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19740428T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19741027T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19750427T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19751026T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19760425T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19761031T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19770424T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19771030T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19780430T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19781029T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19790429T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19791028T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19800427T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19801026T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19810426T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19811025T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19820425T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19821031T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19830424T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19831030T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19840429T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19841028T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19850428T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19851027T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19860427T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19861026T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19870405T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19871025T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19880403T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19881030T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19890402T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19891029T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19900401T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19901028T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19910407T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19911027T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19920405T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19921025T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19930404T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19931031T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19940403T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19941030T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19950402T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19951029T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19960407T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19961027T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19970406T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19971026T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19980405T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19981025T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19990404T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19991031T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20000402T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20001029T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20010401T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20011028T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20020407T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20021027T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20030406T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20031026T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20040404T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20041031T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20050403T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20051030T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20060402T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20061029T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20070311T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20071104T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20080309T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20081102T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20090308T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20091101T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20100314T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20101107T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20110313T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20111106T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20120311T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20121104T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20130310T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20131103T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20140309T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20141102T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20150308T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20151101T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20160313T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20161106T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20170312T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20171105T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20180311T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20181104T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20190310T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20191103T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20200308T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20201101T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20210314T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20211107T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20220313T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20221106T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20230312T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20231105T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20240310T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20241103T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20250309T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20251102T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20260308T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20261101T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20270314T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20271107T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20280312T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20281105T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20290311T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20291104T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20300310T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20301103T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20310309T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20311102T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20320314T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20321107T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20330313T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20331106T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20340312T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20341105T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20350311T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20351104T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20360309T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20361102T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:20370308T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:20371101T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+UID:20140813T212317Z-6646-1000-1221-23@evert-ubuntu
+DTSTAMP:20140813T212221Z
+DTSTART;TZID=/freeassociation.sourceforge.net/Tzfile/America/Toronto:201408
+ 13T180000
+DTEND;TZID=/freeassociation.sourceforge.net/Tzfile/America/Toronto:20140813
+ T200000
+TRANSP:OPAQUE
+SEQUENCE:4
+SUMMARY:Testing evolution
+LOCATION:Online
+CLASS:PUBLIC
+ORGANIZER:MAILTO:o@example.org
+CREATED:20140813T212510Z
+LAST-MODIFIED:20140813T212541Z
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;RSVP=TRUE;LANGUAGE=en:MAILTO:o@example.org
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;LANGUAGE=en:MAILTO:a1@example.org
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;LANGUAGE=en:MAILTO:a2@example.org
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;LANGUAGE=en:MAILTO:a3@example.org
+STATUS:CANCELLED
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $new = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//Mac OS X 10.9.4//EN
+CALSCALE:GREGORIAN
+BEGIN:VTIMEZONE
+TZID:America/Toronto
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+DTSTART:20070311T020000
+TZNAME:EDT
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+DTSTART:20071104T020000
+TZNAME:EST
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+TRANSP:OPAQUE
+DTEND;TZID=America/Toronto:20140813T200000
+ORGANIZER:MAILTO:o@example.org
+UID:20140813T212317Z-6646-1000-1221-23@evert-ubuntu
+DTSTAMP:20140813T212221Z
+LOCATION:Online
+STATUS:CANCELLED
+SEQUENCE:4
+CLASS:PUBLIC
+SUMMARY:Testing evolution
+LAST-MODIFIED:20140813T212541Z
+DTSTART;TZID=America/Toronto:20140813T180000
+CREATED:20140813T212510Z
+ATTENDEE;CUTYPE=INDIVIDUAL;LANGUAGE=en;PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:a2@example.org
+ATTENDEE;CUTYPE=INDIVIDUAL;LANGUAGE=en;PARTSTAT=ACCEPTED;ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:o@example.org
+ATTENDEE;CUTYPE=INDIVIDUAL;LANGUAGE=en;PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:a1@example.org
+ATTENDEE;CUTYPE=INDIVIDUAL;LANGUAGE=en;PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:a3@example.org
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $this->parse($old, $new, array(), 'mailto:a1@example.org');
+
+
+    }
+
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/ITip/MessageTest.php b/vendor/sabre/vobject/tests/VObject/ITip/MessageTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..735d9e9b38025a376cf841879a411138fd407d6f
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/ITip/MessageTest.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace Sabre\VObject\ITip;
+
+class MessageTest extends \PHPUnit_Framework_TestCase {
+
+    public function testNoScheduleStatus() {
+
+        $message = new Message();
+        $this->assertFalse($message->getScheduleStatus());
+
+    }
+
+    public function testScheduleStatus() {
+
+        $message = new Message();
+        $message->scheduleStatus = '1.2;Delivered';
+
+        $this->assertEquals('1.2', $message->getScheduleStatus());
+
+    }
+
+    public function testUnexpectedScheduleStatus() {
+
+        $message = new Message();
+        $message->scheduleStatus = '9.9.9';
+
+        $this->assertEquals('9.9.9', $message->getScheduleStatus());
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Issue153Test.php b/vendor/sabre/vobject/tests/VObject/Issue153Test.php
new file mode 100644
index 0000000000000000000000000000000000000000..1cc14c16106b73ac5a632dc29902ef1f80077736
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Issue153Test.php
@@ -0,0 +1,14 @@
+<?php
+
+namespace Sabre\VObject;
+
+class Issue153Test extends \PHPUnit_Framework_TestCase {
+
+    function testRead() {
+
+        $obj = Reader::read(file_get_contents(dirname(__FILE__) . '/issue153.vcf'));
+        $this->assertEquals('Test Benutzer', (string)$obj->fn);
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Issue26Test.php b/vendor/sabre/vobject/tests/VObject/Issue26Test.php
new file mode 100644
index 0000000000000000000000000000000000000000..f080f392d0dad495f760ffd859a431b74082315e
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Issue26Test.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Sabre\VObject;
+
+use
+    DateTime,
+    DateTimeZone;
+
+class Issue26Test extends \PHPUnit_Framework_TestCase {
+
+    /**
+     * @expectedException \InvalidArgumentException
+     */
+    function testExpand() {
+
+        $input = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:bae5d57a98
+RRULE:FREQ=MONTHLY;BYDAY=0MO,0TU,0WE,0TH,0FR;INTERVAL=1
+DTSTART;VALUE=DATE:20130401
+DTEND;VALUE=DATE:20130402
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $vcal = Reader::read($input);
+        $this->assertInstanceOf('Sabre\\VObject\\Component\\VCalendar', $vcal);
+
+        $it = new Recur\EventIterator($vcal, 'bae5d57a98');
+        iterator_to_array($it);
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Issue36WorkAroundTest.php b/vendor/sabre/vobject/tests/VObject/Issue36WorkAroundTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..cc987168ffcc041f23613f31454c4d3be012f78e
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Issue36WorkAroundTest.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Sabre\VObject;
+
+class Issue36WorkAroundTest extends \PHPUnit_Framework_TestCase {
+
+    function testWorkaround() {
+
+        // See https://github.com/fruux/sabre-vobject/issues/36
+        $event = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+SUMMARY:Titel
+SEQUENCE:1
+TRANSP:TRANSPARENT
+RRULE:FREQ=YEARLY
+LAST-MODIFIED:20130323T225737Z
+DTSTAMP:20130323T225737Z
+UID:1833bd44-188b-405c-9f85-1a12105318aa
+CATEGORIES:Jubiläum
+X-MOZ-GENERATION:3
+RECURRENCE-ID;RANGE=THISANDFUTURE;VALUE=DATE:20131013
+DTSTART;VALUE=DATE:20131013
+CREATED:20100721T121914Z
+DURATION:P1D
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $obj = Reader::read($event);
+
+        // If this does not throw an exception, it's all good.
+        $it = new Recur\EventIterator($obj,'1833bd44-188b-405c-9f85-1a12105318aa');
+        $this->assertInstanceOf('Sabre\\VObject\\Recur\EventIterator', $it);
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Issue40Test.php b/vendor/sabre/vobject/tests/VObject/Issue40Test.php
new file mode 100644
index 0000000000000000000000000000000000000000..92f04ffa24d84336197bd9ef2cd53cb0694ae71a
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Issue40Test.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * This test is created to handle the issues brought forward by issue 40.
+ *
+ * https://github.com/fruux/sabre-vobject/issues/40
+ */
+class Issue40Test extends \PHPUnit_Framework_TestCase {
+
+    function testEncode() {
+
+        $card = new Component\VCard();
+        $card->add('N', array('van der Harten', array('Rene','J.'), "", 'Sir','R.D.O.N.'), array('SORT-AS' => array('Harten','Rene')));
+
+        $expected = implode("\r\n", array(
+            "BEGIN:VCARD",
+            "VERSION:3.0",
+            "PRODID:-//Sabre//Sabre VObject " . Version::VERSION . '//EN',
+            "N;SORT-AS=Harten,Rene:van der Harten;Rene,J.;;Sir;R.D.O.N.",
+            "END:VCARD",
+            ""
+        ));
+
+        $this->assertEquals($expected, $card->serialize());
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Issue64Test.php b/vendor/sabre/vobject/tests/VObject/Issue64Test.php
new file mode 100644
index 0000000000000000000000000000000000000000..986a2481361971347ee4da220df20e809fda8ff1
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Issue64Test.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Sabre\VObject;
+
+class Issue64Test extends \PHPUnit_Framework_TestCase {
+
+    function testRead() {
+
+        $vcard = Reader::read(file_get_contents(dirname(__FILE__) . '/issue64.vcf'));
+        $vcard = $vcard->convert(\Sabre\VObject\Document::VCARD30);
+        $vcard = $vcard->serialize();
+
+        $converted = Reader::read($vcard);
+
+        $this->assertInstanceOf('Sabre\\VObject\\Component\\VCard', $converted);
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Issue96Test.php b/vendor/sabre/vobject/tests/VObject/Issue96Test.php
new file mode 100644
index 0000000000000000000000000000000000000000..4300b86ff550eb8621b9d2567dfd8a4111a8d8ce
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Issue96Test.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Sabre\VObject;
+
+class Issue96Test extends \PHPUnit_Framework_TestCase {
+
+    function testRead() {
+
+        $input = <<<VCF
+BEGIN:VCARD
+VERSION:2.1
+SOURCE:Yahoo Contacts (http://contacts.yahoo.com)
+URL;CHARSET=utf-8;ENCODING=QUOTED-PRINTABLE:=
+http://www.example.org
+END:VCARD
+VCF;
+
+        $vcard = Reader::read($input, Reader::OPTION_FORGIVING);
+        $this->assertInstanceOf('Sabre\\VObject\\Component\\VCard', $vcard);
+        $this->assertEquals("http://www.example.org", $vcard->url->getValue());
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/JCalTest.php b/vendor/sabre/vobject/tests/VObject/JCalTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..f23165bcf3229d88a4e9b152904f8d191164511d
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/JCalTest.php
@@ -0,0 +1,150 @@
+<?php
+
+namespace Sabre\VObject;
+
+class JCalTest extends \PHPUnit_Framework_TestCase {
+
+    function testToJCal() {
+
+        $cal = new Component\VCalendar();
+
+        $event = $cal->add('VEVENT', array(
+            "UID" => "foo",
+            "DTSTART" => new \DateTime("2013-05-26 18:10:00Z"),
+            "DURATION" => "P1D",
+            "CATEGORIES" => array('home', 'testing'),
+            "CREATED" => new \DateTime("2013-05-26 18:10:00Z"),
+
+            "ATTENDEE" => "mailto:armin@example.org",
+            "GEO" => array(51.96668, 7.61876),
+            "SEQUENCE" => 5,
+            "FREEBUSY" => array("20130526T210213Z/PT1H", "20130626T120000Z/20130626T130000Z"),
+            "URL" => "http://example.org/",
+            "TZOFFSETFROM" => "+05:00",
+            "RRULE" => array('FREQ' => 'WEEKLY', 'BYDAY' => array('MO','TU')),
+        ));
+
+        // Modifying DTSTART to be a date-only.
+        $event->dtstart['VALUE'] = 'DATE';
+        $event->add("X-BOOL", true, array('VALUE' => 'BOOLEAN'));
+        $event->add("X-TIME", "08:00:00", array('VALUE' => 'TIME'));
+        $event->add("ATTACH", "attachment", array('VALUE' => 'BINARY'));
+        $event->add("ATTENDEE", "mailto:dominik@example.org", array("CN" => "Dominik", "PARTSTAT" => "DECLINED"));
+
+        $event->add('REQUEST-STATUS', array("2.0", "Success"));
+        $event->add('REQUEST-STATUS', array("3.7", "Invalid Calendar User", "ATTENDEE:mailto:jsmith@example.org"));
+
+        $event->add('DTEND', '20150108T133000');
+
+        $expected = array(
+            "vcalendar",
+            array(
+                array(
+                    "version",
+                    new \StdClass(),
+                    "text",
+                    "2.0"
+                ),
+                array(
+                    "prodid",
+                    new \StdClass(),
+                    "text",
+                    "-//Sabre//Sabre VObject " . Version::VERSION . "//EN",
+                ),
+                array(
+                    "calscale",
+                    new \StdClass(),
+                    "text",
+                    "GREGORIAN"
+                ),
+            ),
+            array(
+                array("vevent",
+                    array(
+                        array(
+                            "uid", new \StdClass(), "text", "foo",
+                        ),
+                        array(
+                            "dtstart", new \StdClass(), "date", "2013-05-26",
+                        ),
+                        array(
+                            "duration", new \StdClass(), "duration", "P1D",
+                        ),
+                        array(
+                            "categories", new \StdClass(), "text", "home", "testing",
+                        ),
+                        array(
+                            "created", new \StdClass(), "date-time", "2013-05-26T18:10:00Z",
+                        ),
+
+                        array(
+                            "attendee", new \StdClass(), "cal-address", "mailto:armin@example.org",
+                        ),
+                        array(
+                            "geo", new \StdClass(), "float", array(51.96668, 7.61876),
+                        ),
+                        array(
+                            "sequence", new \StdClass(), "integer", 5
+                        ),
+                        array(
+                            "freebusy", new \StdClass(), "period",  array("2013-05-26T21:02:13", "PT1H"), array("2013-06-26T12:00:00", "2013-06-26T13:00:00"),
+                        ),
+                        array(
+                            "url", new \StdClass(), "uri", "http://example.org/",
+                        ),
+                        array(
+                            "tzoffsetfrom", new \StdClass(), "utc-offset", "+05:00",
+                        ),
+                        array(
+                            "rrule", new \StdClass(), "recur", array(
+                                'freq' => 'WEEKLY',
+                                'byday' => array('MO', 'TU'),
+                            ),
+                        ),
+                        array(
+                            "x-bool", new \StdClass(), "boolean", true
+                        ),
+                        array(
+                            "x-time", new \StdClass(), "time", "08:00:00",
+                        ),
+                        array(
+                            "attach", new \StdClass(), "binary", base64_encode('attachment')
+                        ),
+                        array(
+                            "attendee",
+                            (object)array(
+                                "cn" => "Dominik",
+                                "partstat" => "DECLINED",
+                            ),
+                            "cal-address",
+                            "mailto:dominik@example.org"
+                        ),
+                        array(
+                            "request-status",
+                            new \StdClass(),
+                            "text",
+                            array("2.0", "Success"),
+                        ),
+                        array(
+                            "request-status",
+                            new \StdClass(),
+                            "text",
+                            array("3.7", "Invalid Calendar User", "ATTENDEE:mailto:jsmith@example.org"),
+                        ),
+                        array(
+                            'dtend',
+                            new \StdClass(),
+                            "date-time",
+                            "2015-01-08T13:30:00",
+                        ),
+                    ),
+                    array(),
+                )
+            ),
+        );
+
+        $this->assertEquals($expected, $cal->jsonSerialize());
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/JCardTest.php b/vendor/sabre/vobject/tests/VObject/JCardTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..9bd0f9ab9ff54f4b974e4c651ffaec1e5a9d15ab
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/JCardTest.php
@@ -0,0 +1,195 @@
+<?php
+
+namespace Sabre\VObject;
+
+class JCardTest extends \PHPUnit_Framework_TestCase {
+
+    function testToJCard() {
+
+        $card = new Component\VCard(array(
+            "VERSION" => "4.0",
+            "UID" => "foo",
+            "BDAY" => "19850407",
+            "REV"  => "19951031T222710Z",
+            "LANG" => "nl",
+            "N" => array("Last", "First", "Middle", "", ""),
+            "item1.TEL" => "+1 555 123456",
+            "item1.X-AB-LABEL" => "Walkie Talkie",
+            "ADR" => array(
+                "",
+                "",
+                array("My Street", "Left Side", "Second Shack"),
+                "Hometown",
+                "PA",
+                "18252",
+                "U.S.A",
+            ),
+        ));
+
+        $card->add('BDAY', '1979-12-25', array('VALUE' => 'DATE', 'X-PARAM' => array(1,2)));
+        $card->add('BDAY', '1979-12-25T02:00:00', array('VALUE' => 'DATE-TIME'));
+
+
+        $card->add('X-TRUNCATED', '--1225', array('VALUE' => 'DATE'));
+        $card->add('X-TIME-LOCAL', '123000', array('VALUE' => 'TIME'));
+        $card->add('X-TIME-UTC', '12:30:00Z', array('VALUE' => 'TIME'));
+        $card->add('X-TIME-OFFSET', '12:30:00-08:00', array('VALUE' => 'TIME'));
+        $card->add('X-TIME-REDUCED', '23', array('VALUE' => 'TIME'));
+        $card->add('X-TIME-TRUNCATED', '--30', array('VALUE' => 'TIME'));
+
+        $card->add('X-KARMA-POINTS', '42', array('VALUE' => 'INTEGER'));
+        $card->add('X-GRADE', '1.3', array('VALUE' => 'FLOAT'));
+
+        $card->add('TZ', '-05:00', array('VALUE' => 'UTC-OFFSET'));
+
+        $expected = array(
+            "vcard",
+            array(
+                array(
+                    "version",
+                    new \StdClass(),
+                    "text",
+                    "4.0"
+                ),
+                array(
+                    "prodid",
+                    new \StdClass(),
+                    "text",
+                    "-//Sabre//Sabre VObject " . Version::VERSION . "//EN",
+                ),
+                array(
+                    "uid",
+                    new \StdClass(),
+                    "text",
+                    "foo",
+                ),
+                array(
+                    "bday",
+                    new \StdClass(),
+                    "date-and-or-time",
+                    "1985-04-07",
+                ),
+                array(
+                    "rev",
+                    new \StdClass(),
+                    "timestamp",
+                    "1995-10-31T22:27:10Z",
+                ),
+                array(
+                    "lang",
+                    new \StdClass(),
+                    "language-tag",
+                    "nl",
+                ),
+                array(
+                    "n",
+                    new \StdClass(),
+                    "text",
+                    array("Last", "First", "Middle", "", ""),
+                ),
+                array(
+                    "tel",
+                    (object)array(
+                        "group" => "item1",
+                    ),
+                    "text",
+                    "+1 555 123456",
+                ),
+                array(
+                    "x-ab-label",
+                    (object)array(
+                        "group" => "item1",
+                    ),
+                    "unknown",
+                    "Walkie Talkie",
+                ),
+                array(
+                    "adr",
+                    new \StdClass(),
+                    "text",
+                        array(
+                            "",
+                            "",
+                            array("My Street", "Left Side", "Second Shack"),
+                            "Hometown",
+                            "PA",
+                            "18252",
+                            "U.S.A",
+                        ),
+                ),
+                array(
+                    "bday",
+                    (object)array(
+                        'x-param' => array(1,2),
+                    ),
+                    "date",
+                    "1979-12-25",
+                ),
+                array(
+                    "bday",
+                    new \StdClass(),
+                    "date-time",
+                    "1979-12-25T02:00:00",
+                ),
+                array(
+                    "x-truncated",
+                    new \StdClass(),
+                    "date",
+                    "--12-25",
+                ),
+                array(
+                    "x-time-local",
+                    new \StdClass(),
+                    "time",
+                    "12:30:00"
+                ),
+                array(
+                    "x-time-utc",
+                    new \StdClass(),
+                    "time",
+                    "12:30:00Z"
+                ),
+                array(
+                    "x-time-offset",
+                    new \StdClass(),
+                    "time",
+                    "12:30:00-08:00"
+                ),
+                array(
+                    "x-time-reduced",
+                    new \StdClass(),
+                    "time",
+                    "23"
+                ),
+                array(
+                    "x-time-truncated",
+                    new \StdClass(),
+                    "time",
+                    "--30"
+                ),
+                array(
+                    "x-karma-points",
+                    new \StdClass(),
+                    "integer",
+                    42
+                ),
+                array(
+                    "x-grade",
+                    new \StdClass(),
+                    "float",
+                    1.3
+                ),
+                array(
+                    "tz",
+                    new \StdClass(),
+                    "utc-offset",
+                    "-05:00",
+                ),
+            ),
+        );
+
+        $this->assertEquals($expected, $card->jsonSerialize());
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/LineFoldingIssueTest.php b/vendor/sabre/vobject/tests/VObject/LineFoldingIssueTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..47fef1c11e792b093f605c5c4380d5af2ec35891
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/LineFoldingIssueTest.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace Sabre\VObject;
+
+class LineFoldingIssueTest extends \PHPUnit_Framework_TestCase {
+
+    function testRead() {
+
+        $event = <<<ICS
+BEGIN:VCALENDAR\r
+BEGIN:VEVENT\r
+DESCRIPTION:TEST\\n\\n \\n\\nTEST\\n\\n \\n\\nTEST\\n\\n \\n\\nTEST\\n\\nTEST\\nTEST, TEST\r
+END:VEVENT\r
+END:VCALENDAR\r
+
+ICS;
+
+        $obj = Reader::read($event);
+        $this->assertEquals($event, $obj->serialize());
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/ParameterTest.php b/vendor/sabre/vobject/tests/VObject/ParameterTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..96f016dd115c9ace51bf9174248cebe4b202c2c9
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/ParameterTest.php
@@ -0,0 +1,135 @@
+<?php
+
+namespace Sabre\VObject;
+
+class ParameterTest extends \PHPUnit_Framework_TestCase {
+
+    function testSetup() {
+
+        $cal = new Component\VCalendar();
+
+        $param = new Parameter($cal, 'name','value');
+        $this->assertEquals('NAME',$param->name);
+        $this->assertEquals('value',$param->getValue());
+
+    }
+
+    function testSetupNameLess() {
+
+        $card = new Component\VCard();
+
+        $param = new Parameter($card, null,'URL');
+        $this->assertEquals('VALUE',$param->name);
+        $this->assertEquals('URL',$param->getValue());
+        $this->assertTrue($param->noName);
+
+    }
+
+    function testModify() {
+
+        $cal = new Component\VCalendar();
+
+        $param = new Parameter($cal, 'name', null);
+        $param->addValue(1);
+        $this->assertEquals(array(1), $param->getParts());
+
+        $param->setParts(array(1,2));
+        $this->assertEquals(array(1,2), $param->getParts());
+
+        $param->addValue(3);
+        $this->assertEquals(array(1,2,3), $param->getParts());
+
+        $param->setValue(4);
+        $param->addValue(5);
+        $this->assertEquals(array(4,5), $param->getParts());
+
+    }
+
+    function testCastToString() {
+
+        $cal = new Component\VCalendar();
+        $param = new Parameter($cal, 'name', 'value');
+        $this->assertEquals('value',$param->__toString());
+        $this->assertEquals('value',(string)$param);
+
+    }
+
+    function testCastNullToString() {
+
+        $cal = new Component\VCalendar();
+        $param = new Parameter($cal, 'name', null);
+        $this->assertEquals('',$param->__toString());
+        $this->assertEquals('',(string)$param);
+
+    }
+
+    function testSerialize() {
+
+        $cal = new Component\VCalendar();
+        $param = new Parameter($cal, 'name', 'value');
+        $this->assertEquals('NAME=value',$param->serialize());
+
+    }
+
+    function testSerializeEmpty() {
+
+        $cal = new Component\VCalendar();
+        $param = new Parameter($cal, 'name', null);
+        $this->assertEquals('NAME=',$param->serialize());
+
+    }
+
+    function testSerializeComplex() {
+
+        $cal = new Component\VCalendar();
+        $param = new Parameter($cal, 'name',array("val1", "val2;", "val3^", "val4\n", "val5\""));
+        $this->assertEquals('NAME=val1,"val2;","val3^^","val4^n","val5^\'"',$param->serialize());
+
+    }
+
+    /**
+     * iCal 7.0 (OSX 10.9) has major issues with the EMAIL property, when the
+     * value contains a plus sign, and it's not quoted.
+     *
+     * So we specifically added support for that.
+     */
+    function testSerializePlusSign() {
+
+        $cal = new Component\VCalendar();
+        $param = new Parameter($cal, 'EMAIL',"user+something@example.org");
+        $this->assertEquals('EMAIL="user+something@example.org"',$param->serialize());
+
+    }
+
+    function testIterate() {
+
+        $cal = new Component\VCalendar();
+
+        $param = new Parameter($cal, 'name', array(1,2,3,4));
+        $result = array();
+
+        foreach($param as $value) {
+            $result[] = $value;
+        }
+
+        $this->assertEquals(array(1,2,3,4), $result);
+
+    }
+
+    function testSerializeColon() {
+
+        $cal = new Component\VCalendar();
+        $param = new Parameter($cal, 'name','va:lue');
+        $this->assertEquals('NAME="va:lue"',$param->serialize());
+
+    }
+
+    function testSerializeSemiColon() {
+
+        $cal = new Component\VCalendar();
+        $param = new Parameter($cal, 'name','va;lue');
+        $this->assertEquals('NAME="va;lue"',$param->serialize());
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Parser/JsonTest.php b/vendor/sabre/vobject/tests/VObject/Parser/JsonTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..adbbda32eb78a835fece3cea0a52cb227f4b9d8a
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Parser/JsonTest.php
@@ -0,0 +1,395 @@
+<?php
+
+namespace Sabre\VObject\Parser;
+
+use
+    Sabre\VObject;
+
+class JsonTest extends \PHPUnit_Framework_TestCase {
+
+    function testRoundTripJCard() {
+
+        $input = array(
+            "vcard",
+            array(
+                array(
+                    "version",
+                    new \StdClass(),
+                    "text",
+                    "4.0"
+                ),
+                array(
+                    "prodid",
+                    new \StdClass(),
+                    "text",
+                    "-//Sabre//Sabre VObject " . VObject\Version::VERSION . "//EN",
+                ),
+                array(
+                    "uid",
+                    new \StdClass(),
+                    "text",
+                    "foo",
+                ),
+                array(
+                    "bday",
+                    new \StdClass(),
+                    "date-and-or-time",
+                    "1985-04-07",
+                ),
+                array(
+                    "rev",
+                    new \StdClass(),
+                    "timestamp",
+                    "1995-10-31T22:27:10Z",
+                ),
+                array(
+                    "lang",
+                    new \StdClass(),
+                    "language-tag",
+                    "nl",
+                ),
+                array(
+                    "n",
+                    new \StdClass(),
+                    "text",
+                    array("Last", "First", "Middle", "", ""),
+                ),
+                array(
+                    "tel",
+                    (object)array(
+                        "group" => "item1",
+                    ),
+                    "text",
+                    "+1 555 123456",
+                ),
+                array(
+                    "x-ab-label",
+                    (object)array(
+                        "group" => "item1",
+                    ),
+                    "unknown",
+                    "Walkie Talkie",
+                ),
+                array(
+                    "adr",
+                    new \StdClass(),
+                    "text",
+                        array(
+                            "",
+                            "",
+                            array("My Street", "Left Side", "Second Shack"),
+                            "Hometown",
+                            "PA",
+                            "18252",
+                            "U.S.A",
+                        ),
+                ),
+                array(
+                    "bday",
+                    (object)array(
+                        'x-param' => array(1,2),
+                    ),
+                    "date",
+                    "1979-12-25",
+                ),
+                array(
+                    "bday",
+                    new \StdClass(),
+                    "date-time",
+                    "1979-12-25T02:00:00",
+                ),
+                array(
+                    "x-truncated",
+                    new \StdClass(),
+                    "date",
+                    "--12-25",
+                ),
+                array(
+                    "x-time-local",
+                    new \StdClass(),
+                    "time",
+                    "12:30:00"
+                ),
+                array(
+                    "x-time-utc",
+                    new \StdClass(),
+                    "time",
+                    "12:30:00Z"
+                ),
+                array(
+                    "x-time-offset",
+                    new \StdClass(),
+                    "time",
+                    "12:30:00-08:00"
+                ),
+                array(
+                    "x-time-reduced",
+                    new \StdClass(),
+                    "time",
+                    "23"
+                ),
+                array(
+                    "x-time-truncated",
+                    new \StdClass(),
+                    "time",
+                    "--30"
+                ),
+                array(
+                    "x-karma-points",
+                    new \StdClass(),
+                    "integer",
+                    42
+                ),
+                array(
+                    "x-grade",
+                    new \StdClass(),
+                    "float",
+                    1.3
+                ),
+                array(
+                    "tz",
+                    new \StdClass(),
+                    "utc-offset",
+                    "-05:00",
+                ),
+            ),
+        );
+
+        $parser = new Json(json_encode($input));
+        $vobj = $parser->parse();        
+
+        $version = VObject\Version::VERSION;
+
+
+        $result = $vobj->serialize();
+        $expected = <<<VCF
+BEGIN:VCARD
+VERSION:4.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+UID:foo
+BDAY:1985-04-07
+REV:1995-10-31T22:27:10Z
+LANG:nl
+N:Last;First;Middle;;
+item1.TEL:+1 555 123456
+item1.X-AB-LABEL:Walkie Talkie
+ADR:;;My Street,Left Side,Second Shack;Hometown;PA;18252;U.S.A
+BDAY;X-PARAM=1,2;VALUE=DATE:1979-12-25
+BDAY;VALUE=DATE-TIME:1979-12-25T02:00:00
+X-TRUNCATED;VALUE=DATE:--12-25
+X-TIME-LOCAL;VALUE=TIME:12:30:00
+X-TIME-UTC;VALUE=TIME:12:30:00Z
+X-TIME-OFFSET;VALUE=TIME:12:30:00-08:00
+X-TIME-REDUCED;VALUE=TIME:23
+X-TIME-TRUNCATED;VALUE=TIME:--30
+X-KARMA-POINTS;VALUE=INTEGER:42
+X-GRADE;VALUE=FLOAT:1.3
+TZ;VALUE=UTC-OFFSET:-05:00
+END:VCARD
+
+VCF;
+        $this->assertEquals($expected, str_replace("\r", "", $result));
+
+        $this->assertEquals(
+            $input,
+            $vobj->jsonSerialize()
+        );
+
+    }
+
+    function testRoundTripJCal() {
+
+        $input = array(
+            "vcalendar",
+            array(
+                array(
+                    "version",
+                    new \StdClass(),
+                    "text",
+                    "2.0"
+                ),
+                array(
+                    "prodid",
+                    new \StdClass(),
+                    "text",
+                    "-//Sabre//Sabre VObject " . VObject\Version::VERSION . "//EN",
+                ),
+                array(
+                    "calscale",
+                    new \StdClass(),
+                    "text",
+                    "GREGORIAN"
+                ),
+            ),
+            array(
+                array("vevent",
+                    array(
+                        array(
+                            "uid", new \StdClass(), "text", "foo",
+                        ),
+                        array(
+                            "dtstart", new \StdClass(), "date", "2013-05-26",
+                        ),
+                        array(
+                            "duration", new \StdClass(), "duration", "P1D",
+                        ),
+                        array(
+                            "categories", new \StdClass(), "text", "home", "testing",
+                        ),
+                        array(
+                            "created", new \StdClass(), "date-time", "2013-05-26T18:10:00Z",
+                        ),
+                        array(
+                            "attach", new \StdClass(), "binary", base64_encode('attachment')
+                        ),
+                        array(
+                            "attendee", new \StdClass(), "cal-address", "mailto:armin@example.org",
+                        ),
+                        array(
+                            "geo", new \StdClass(), "float", array(51.96668, 7.61876),
+                        ),
+                        array(
+                            "sequence", new \StdClass(), "integer", 5
+                        ),
+                        array(
+                            "freebusy", new \StdClass(), "period",  array("2013-05-26T21:02:13", "PT1H"), array("2013-06-26T12:00:00", "2013-06-26T13:00:00"),
+                        ),
+                        array(
+                            "url", new \StdClass(), "uri", "http://example.org/",
+                        ),
+                        array(
+                            "tzoffsetfrom", new \StdClass(), "utc-offset", "+05:00",
+                        ),
+                        array(
+                            "rrule", new \StdClass(), "recur", array(
+                                'freq' => 'WEEKLY',
+                                'byday' => array('MO', 'TU'),
+                            ),
+                        ),
+                        array(
+                            "x-bool", new \StdClass(), "boolean", true
+                        ),
+                        array(
+                            "x-time", new \StdClass(), "time", "08:00:00",
+                        ),
+                        array(
+                            "attendee",
+                            (object)array(
+                                "cn" => "Dominik",
+                                "partstat" => "DECLINED",
+                            ),
+                            "cal-address",
+                            "mailto:dominik@example.org"
+                        ),
+                        array(
+                            "request-status",
+                            new \StdClass(),
+                            "text",
+                            array("2.0", "Success"),
+                        ),
+                        array(
+                            "request-status",
+                            new \StdClass(),
+                            "text",
+                            array("3.7", "Invalid Calendar User", "ATTENDEE:mailto:jsmith@example.org"),
+                        ),
+                    ),
+                    array(
+                        array("valarm",
+                            array(
+                                array(
+                                    "action", new \StdClass(), "text", "DISPLAY",
+                                ),
+                            ),
+                            array(),
+                        ),
+                    ),
+                )
+            ),
+        );
+
+        $parser = new Json(json_encode($input));
+        $vobj = $parser->parse();        
+        $result = $vobj->serialize();
+
+        $version = VObject\Version::VERSION;
+
+        $expected = <<<VCF
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+CALSCALE:GREGORIAN
+BEGIN:VEVENT
+UID:foo
+DTSTART;VALUE=DATE:20130526
+DURATION:P1D
+CATEGORIES:home,testing
+CREATED:20130526T181000Z
+ATTACH;VALUE=BINARY:YXR0YWNobWVudA==
+ATTENDEE:mailto:armin@example.org
+GEO:51.96668;7.61876
+SEQUENCE:5
+FREEBUSY:20130526T210213/PT1H,20130626T120000/20130626T130000
+URL:http://example.org/
+TZOFFSETFROM:+05:00
+RRULE:FREQ=WEEKLY;BYDAY=MO,TU
+X-BOOL;VALUE=BOOLEAN:TRUE
+X-TIME;VALUE=TIME:08:00:00
+ATTENDEE;CN=Dominik;PARTSTAT=DECLINED:mailto:dominik@example.org
+REQUEST-STATUS:2.0;Success
+REQUEST-STATUS:3.7;Invalid Calendar User;ATTENDEE:mailto:jsmith@example.org
+BEGIN:VALARM
+ACTION:DISPLAY
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+
+VCF;
+        $this->assertEquals($expected, str_replace("\r", "", $result));
+
+        $this->assertEquals(
+            $input,
+            $vobj->jsonSerialize()
+        );
+
+    }
+
+    function testParseStreamArg() {
+
+        $input = array(
+            "vcard",
+            array(
+                array(
+                    "FN", new \StdClass(), 'text', "foo",
+                ),
+            ),
+        );
+
+        $stream = fopen('php://memory','r+');
+        fwrite($stream, json_encode($input));
+        rewind($stream);
+
+        $result = VObject\Reader::readJson($stream,0);
+        $this->assertEquals('foo', $result->FN->getValue());
+
+    }
+
+    /**
+     * @expectedException \Sabre\VObject\ParseException
+     */
+    function testParseInvalidData() {
+
+        $json = new Json();
+        $input = array(
+            "vlist",
+            array(
+                array(
+                    "FN", new \StdClass(), 'text', "foo",
+                ),
+            ),
+        );
+
+        $json->parse(json_encode($input), 0);
+
+    }
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Parser/MimeDirTest.php b/vendor/sabre/vobject/tests/VObject/Parser/MimeDirTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b4ee47c4d83930d61e23e725b0efb4cebef285ec
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Parser/MimeDirTest.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Sabre\VObject\Parser;
+
+/**
+ * Note that most MimeDir related tests can actually be found in the ReaderTest
+ * class one level up.
+ */
+class MimeDirTest extends \PHPUnit_Framework_TestCase {
+
+    /**
+     * @expectedException \Sabre\VObject\ParseException
+     */
+    function testParseError() {
+
+        $mimeDir = new MimeDir();
+        $mimeDir->parse(fopen(__FILE__,'a'));
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Parser/QuotedPrintableTest.php b/vendor/sabre/vobject/tests/VObject/Parser/QuotedPrintableTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..a66af698d180c4efee9508f4a646045428a7ab2d
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Parser/QuotedPrintableTest.php
@@ -0,0 +1,108 @@
+<?php
+
+namespace Sabre\VObject\Parser;
+
+use
+    Sabre\VObject\Reader;
+
+class QuotedPrintableTest extends \PHPUnit_Framework_TestCase {
+
+    function testReadQuotedPrintableSimple() {
+
+        $data = "BEGIN:VCARD\r\nLABEL;ENCODING=QUOTED-PRINTABLE:Aach=65n\r\nEND:VCARD";
+
+        $result = Reader::read($data);
+
+        $this->assertInstanceOf('Sabre\\VObject\\Component', $result);
+        $this->assertEquals('VCARD', $result->name);
+        $this->assertEquals(1, count($result->children()));
+        $this->assertEquals("Aachen", $this->getPropertyValue($result->label));
+
+    }
+
+    function testReadQuotedPrintableNewlineSoft() {
+
+        $data = "BEGIN:VCARD\r\nLABEL;ENCODING=QUOTED-PRINTABLE:Aa=\r\n ch=\r\n en\r\nEND:VCARD";
+        $result = Reader::read($data);
+
+        $this->assertInstanceOf('Sabre\\VObject\\Component', $result);
+        $this->assertEquals('VCARD', $result->name);
+        $this->assertEquals(1, count($result->children()));
+        $this->assertEquals("Aachen", $this->getPropertyValue($result->label));
+
+    }
+
+    function testReadQuotedPrintableNewlineHard() {
+
+        $data = "BEGIN:VCARD\r\nLABEL;ENCODING=QUOTED-PRINTABLE:Aachen=0D=0A=\r\n Germany\r\nEND:VCARD";
+        $result = Reader::read($data);
+
+        $this->assertInstanceOf('Sabre\\VObject\\Component', $result);
+        $this->assertEquals('VCARD', $result->name);
+        $this->assertEquals(1, count($result->children()));
+        $this->assertEquals("Aachen\r\nGermany", $this->getPropertyValue($result->label));
+
+
+    }
+
+    function testReadQuotedPrintableCompatibilityMS() {
+
+        $data = "BEGIN:VCARD\r\nLABEL;ENCODING=QUOTED-PRINTABLE:Aachen=0D=0A=\r\nDeutschland:okay\r\nEND:VCARD";
+        $result = Reader::read($data, Reader::OPTION_FORGIVING);
+
+        $this->assertInstanceOf('Sabre\\VObject\\Component', $result);
+        $this->assertEquals('VCARD', $result->name);
+        $this->assertEquals(1, count($result->children()));
+        $this->assertEquals("Aachen\r\nDeutschland:okay", $this->getPropertyValue($result->label));
+
+    }
+
+    function testReadQuotesPrintableCompoundValues() {
+
+        $data = <<<VCF
+BEGIN:VCARD
+VERSION:2.1
+N:Doe;John;;;
+FN:John Doe
+ADR;WORK;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;M=C3=BCnster =
+Str. 1;M=C3=BCnster;;48143;Deutschland
+END:VCARD
+VCF;
+
+        $result = Reader::read($data, Reader::OPTION_FORGIVING);
+        $this->assertEquals(array(
+            '','','Münster Str. 1','Münster','','48143','Deutschland'
+        ), $result->ADR->getParts());
+
+
+    }
+
+    private function getPropertyValue(\Sabre\VObject\Property $property) {
+
+        return (string)$property;
+
+        /*
+        $param = $property['encoding'];
+        if ($param !== null) {
+            $encoding = strtoupper((string)$param);
+            if ($encoding === 'QUOTED-PRINTABLE') {
+                $value = quoted_printable_decode($value);
+            } else {
+                throw new Exception();
+            }
+        }
+
+        $param = $property['charset'];
+        if ($param !== null) {
+            $charset = strtoupper((string)$param);
+            if ($charset !== 'UTF-8') {
+                $value = mb_convert_encoding($value, 'UTF-8', $charset);
+            }
+        } else {
+            $value = StringUtil::convertToUTF8($value);
+        }
+
+        return $value;
+         */
+    }
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Property/BinaryTest.php b/vendor/sabre/vobject/tests/VObject/Property/BinaryTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..0a8c79c5fd3b09f4af9c9cebeef234698c83396d
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Property/BinaryTest.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Sabre\VObject\Property;
+
+use Sabre\VObject;
+
+class BinaryTest extends \PHPUnit_Framework_TestCase {
+
+    /**
+     * @expectedException \InvalidArgumentException
+     */
+    function testMimeDir() {
+
+        $vcard = new VObject\Component\VCard();
+        $vcard->add('PHOTO', array('a','b'));
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Property/BooleanTest.php b/vendor/sabre/vobject/tests/VObject/Property/BooleanTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..0c885d37bbe67c19edc178f37455487171813b3f
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Property/BooleanTest.php
@@ -0,0 +1,22 @@
+<?php
+
+namespace Sabre\VObject\Property;
+
+use Sabre\VObject;
+
+class BooleanTest extends \PHPUnit_Framework_TestCase {
+
+    function testMimeDir() {
+
+        $input = "BEGIN:VCARD\r\nX-AWESOME;VALUE=BOOLEAN:TRUE\r\nX-SUCKS;VALUE=BOOLEAN:FALSE\r\nEND:VCARD\r\n";
+
+        $vcard = VObject\Reader::read($input);
+        $this->assertTrue($vcard->{'X-AWESOME'}->getValue());
+        $this->assertFalse($vcard->{'X-SUCKS'}->getValue());
+
+        $this->assertEquals('BOOLEAN', $vcard->{'X-AWESOME'}->getValueType());
+        $this->assertEquals($input, $vcard->serialize());
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Property/CompoundTest.php b/vendor/sabre/vobject/tests/VObject/Property/CompoundTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..448a4786ca931fd7702f9ecdbe8d3804d6f839f9
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Property/CompoundTest.php
@@ -0,0 +1,50 @@
+<?php
+
+namespace Sabre\VObject\Property;
+
+use Sabre\VObject\Component\VCard;
+
+class CompoundTest extends \PHPUnit_Framework_TestCase {
+
+    function testSetParts() {
+
+        $arr = array(
+            'ABC, Inc.',
+            'North American Division',
+            'Marketing;Sales',
+        );
+
+        $vcard = new VCard();
+        $elem = $vcard->createProperty('ORG');
+        $elem->setParts($arr);
+
+        $this->assertEquals('ABC\, Inc.;North American Division;Marketing\;Sales', $elem->getValue());
+        $this->assertEquals(3, count($elem->getParts()));
+        $parts = $elem->getParts();
+        $this->assertEquals('Marketing;Sales', $parts[2]);
+
+    }
+
+    function testGetParts() {
+
+        $str = 'ABC\, Inc.;North American Division;Marketing\;Sales';
+
+        $vcard = new VCard();
+        $elem = $vcard->createProperty('ORG');
+        $elem->setRawMimeDirValue($str);
+
+        $this->assertEquals(3, count($elem->getParts()));
+        $parts = $elem->getParts();
+        $this->assertEquals('Marketing;Sales', $parts[2]);
+    }
+
+    function testGetPartsNull() {
+
+        $vcard = new VCard();
+        $elem = $vcard->createProperty('ORG', null);
+
+        $this->assertEquals(0, count($elem->getParts()));
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Property/FloatTest.php b/vendor/sabre/vobject/tests/VObject/Property/FloatTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..9df806e33c6c8bb78c8e83b181f95b04006f4c30
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Property/FloatTest.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace Sabre\VObject\Property;
+
+use Sabre\VObject;
+
+class FloatTest extends \PHPUnit_Framework_TestCase {
+
+    function testMimeDir() {
+
+        $input = "BEGIN:VCARD\r\nVERSION:4.0\r\nX-FLOAT;VALUE=FLOAT:0.234;1.245\r\nEND:VCARD\r\n";
+        $mimeDir = new VObject\Parser\MimeDir($input);
+
+        $result = $mimeDir->parse($input);
+
+        $this->assertInstanceOf('Sabre\VObject\Property\FloatValue', $result->{'X-FLOAT'});
+
+        $this->assertEquals(array(
+            0.234,
+            1.245,
+        ), $result->{'X-FLOAT'}->getParts());
+
+        $this->assertEquals(
+            $input,
+            $result->serialize()
+        );
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Property/ICalendar/CalAddressTest.php b/vendor/sabre/vobject/tests/VObject/Property/ICalendar/CalAddressTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..168751a134e4316dc04e89e31964a43fd15d383a
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Property/ICalendar/CalAddressTest.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace Sabre\VObject\Property\ICalendar;
+
+class CalAddressTest extends \PHPUnit_Framework_TestCase {
+
+    /**
+     * @dataProvider values
+     */
+    function testGetNormalizedValue($expected, $input) {
+
+        $vobj = new \Sabre\VObject\Component\VCalendar();
+        $property = $vobj->add('ATTENDEE', $input);
+
+        $this->assertEquals(
+            $expected,
+            $property->getNormalizedValue()
+        );
+
+    }
+
+    function values() {
+
+        return array(
+            array('mailto:a@b.com', 'mailto:a@b.com'),
+            array('mailto:a@b.com', 'MAILTO:a@b.com'),
+            array('/foo/bar', '/foo/bar'),
+        );
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Property/ICalendar/DateTimeTest.php b/vendor/sabre/vobject/tests/VObject/Property/ICalendar/DateTimeTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..c7ddfb821f68374735fec9a4016f7dc630dc5177
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Property/ICalendar/DateTimeTest.php
@@ -0,0 +1,359 @@
+<?php
+
+namespace Sabre\VObject\Property\ICalendar;
+
+use Sabre\VObject\Component;
+use Sabre\VObject\Component\VCalendar;
+
+
+class DateTimeTest extends \PHPUnit_Framework_TestCase {
+
+    protected $vcal;
+
+    function setUp() {
+
+        $this->vcal = new VCalendar();
+
+    }
+
+    function testSetDateTime() {
+
+        $tz = new \DateTimeZone('Europe/Amsterdam');
+        $dt = new \DateTime('1985-07-04 01:30:00', $tz);
+        $dt->setTimeZone($tz);
+
+        $elem = $this->vcal->createProperty('DTSTART');
+        $elem->setDateTime($dt);
+
+        $this->assertEquals('19850704T013000', (string)$elem);
+        $this->assertEquals('Europe/Amsterdam', (string)$elem['TZID']);
+        $this->assertNull($elem['VALUE']);
+
+        $this->assertTrue($elem->hasTime());
+
+    }
+
+    function testSetDateTimeLOCAL() {
+
+        $tz = new \DateTimeZone('Europe/Amsterdam');
+        $dt = new \DateTime('1985-07-04 01:30:00', $tz);
+        $dt->setTimeZone($tz);
+
+        $elem = $this->vcal->createProperty('DTSTART');
+        $elem->setDateTime($dt, $isFloating = true);
+
+        $this->assertEquals('19850704T013000', (string)$elem);
+        $this->assertNull($elem['TZID']);
+
+        $this->assertTrue($elem->hasTime());
+    }
+
+    function testSetDateTimeUTC() {
+
+        $tz = new \DateTimeZone('GMT');
+        $dt = new \DateTime('1985-07-04 01:30:00', $tz);
+        $dt->setTimeZone($tz);
+
+        $elem = $this->vcal->createProperty('DTSTART');
+        $elem->setDateTime($dt);
+
+        $this->assertEquals('19850704T013000Z', (string)$elem);
+        $this->assertNull($elem['TZID']);
+
+        $this->assertTrue($elem->hasTime());
+    }
+
+    function testSetDateTimeLOCALTZ() {
+
+        $tz = new \DateTimeZone('Europe/Amsterdam');
+        $dt = new \DateTime('1985-07-04 01:30:00', $tz);
+        $dt->setTimeZone($tz);
+
+        $elem = $this->vcal->createProperty('DTSTART');
+        $elem->setDateTime($dt);
+
+        $this->assertEquals('19850704T013000', (string)$elem);
+        $this->assertEquals('Europe/Amsterdam', (string)$elem['TZID']);
+
+        $this->assertTrue($elem->hasTime());
+    }
+
+    function testSetDateTimeDATE() {
+
+        $tz = new \DateTimeZone('Europe/Amsterdam');
+        $dt = new \DateTime('1985-07-04 01:30:00', $tz);
+        $dt->setTimeZone($tz);
+
+        $elem = $this->vcal->createProperty('DTSTART');
+        $elem['VALUE'] = 'DATE';
+        $elem->setDateTime($dt);
+
+        $this->assertEquals('19850704', (string)$elem);
+        $this->assertNull($elem['TZID']);
+        $this->assertEquals('DATE', (string)$elem['VALUE']);
+
+        $this->assertFalse($elem->hasTime());
+    }
+
+    function testSetValue() {
+
+        $tz = new \DateTimeZone('Europe/Amsterdam');
+        $dt = new \DateTime('1985-07-04 01:30:00', $tz);
+        $dt->setTimeZone($tz);
+
+        $elem = $this->vcal->createProperty('DTSTART');
+        $elem->setValue($dt);
+
+        $this->assertEquals('19850704T013000', (string)$elem);
+        $this->assertEquals('Europe/Amsterdam', (string)$elem['TZID']);
+        $this->assertNull($elem['VALUE']);
+
+        $this->assertTrue($elem->hasTime());
+
+    }
+
+    function testSetValueArray() {
+
+        $tz = new \DateTimeZone('Europe/Amsterdam');
+        $dt1 = new \DateTime('1985-07-04 01:30:00', $tz);
+        $dt2 = new \DateTime('1985-07-04 02:30:00', $tz);
+        $dt1->setTimeZone($tz);
+        $dt2->setTimeZone($tz);
+
+        $elem = $this->vcal->createProperty('DTSTART');
+        $elem->setValue(array($dt1, $dt2));
+
+        $this->assertEquals('19850704T013000,19850704T023000', (string)$elem);
+        $this->assertEquals('Europe/Amsterdam', (string)$elem['TZID']);
+        $this->assertNull($elem['VALUE']);
+
+        $this->assertTrue($elem->hasTime());
+
+    }
+
+    function testSetParts() {
+
+        $tz = new \DateTimeZone('Europe/Amsterdam');
+        $dt1 = new \DateTime('1985-07-04 01:30:00', $tz);
+        $dt2 = new \DateTime('1985-07-04 02:30:00', $tz);
+        $dt1->setTimeZone($tz);
+        $dt2->setTimeZone($tz);
+
+        $elem = $this->vcal->createProperty('DTSTART');
+        $elem->setParts(array($dt1, $dt2));
+
+        $this->assertEquals('19850704T013000,19850704T023000', (string)$elem);
+        $this->assertEquals('Europe/Amsterdam', (string)$elem['TZID']);
+        $this->assertNull($elem['VALUE']);
+
+        $this->assertTrue($elem->hasTime());
+
+    }
+    function testSetPartsStrings() {
+
+        $dt1 = '19850704T013000Z';
+        $dt2 = '19850704T023000Z';
+
+        $elem = $this->vcal->createProperty('DTSTART');
+        $elem->setParts(array($dt1, $dt2));
+
+        $this->assertEquals('19850704T013000Z,19850704T023000Z', (string)$elem);
+        $this->assertNull($elem['VALUE']);
+
+        $this->assertTrue($elem->hasTime());
+
+    }
+
+
+    function testGetDateTimeCached() {
+
+        $tz = new \DateTimeZone('Europe/Amsterdam');
+        $dt = new \DateTime('1985-07-04 01:30:00', $tz);
+        $dt->setTimeZone($tz);
+
+        $elem = $this->vcal->createProperty('DTSTART');
+        $elem->setDateTime($dt);
+
+        $this->assertEquals($elem->getDateTime(), $dt);
+
+    }
+
+    function testGetDateTimeDateNULL() {
+
+        $elem = $this->vcal->createProperty('DTSTART');
+        $dt = $elem->getDateTime();
+
+        $this->assertNull($dt);
+
+    }
+
+    function testGetDateTimeDateDATE() {
+
+        $elem = $this->vcal->createProperty('DTSTART','19850704');
+        $dt = $elem->getDateTime();
+
+        $this->assertInstanceOf('DateTime', $dt);
+        $this->assertEquals('1985-07-04 00:00:00', $dt->format('Y-m-d H:i:s'));
+
+    }
+
+    function testGetDateTimeDateDATEReferenceTimeZone() {
+
+        $elem = $this->vcal->createProperty('DTSTART','19850704');
+
+        $tz = new \DateTimeZone('America/Toronto');
+        $dt = $elem->getDateTime($tz);
+        $dt->setTimeZone(new \DateTimeZone('UTC'));
+
+        $this->assertInstanceOf('DateTime', $dt);
+        $this->assertEquals('1985-07-04 04:00:00', $dt->format('Y-m-d H:i:s'));
+
+    }
+
+    function testGetDateTimeDateFloating() {
+
+        $elem = $this->vcal->createProperty('DTSTART','19850704T013000');
+        $dt = $elem->getDateTime();
+
+        $this->assertInstanceOf('DateTime', $dt);
+        $this->assertEquals('1985-07-04 01:30:00', $dt->format('Y-m-d H:i:s'));
+
+    }
+
+    function testGetDateTimeDateFloatingReferenceTimeZone() {
+
+        $elem = $this->vcal->createProperty('DTSTART','19850704T013000');
+
+        $tz = new \DateTimeZone('America/Toronto');
+        $dt = $elem->getDateTime($tz);
+        $dt->setTimeZone(new \DateTimeZone('UTC'));
+
+        $this->assertInstanceOf('DateTime', $dt);
+        $this->assertEquals('1985-07-04 05:30:00', $dt->format('Y-m-d H:i:s'));
+
+    }
+
+    function testGetDateTimeDateUTC() {
+
+        $elem = $this->vcal->createProperty('DTSTART','19850704T013000Z');
+        $dt = $elem->getDateTime();
+
+        $this->assertInstanceOf('DateTime', $dt);
+        $this->assertEquals('1985-07-04 01:30:00', $dt->format('Y-m-d H:i:s'));
+        $this->assertEquals('UTC', $dt->getTimeZone()->getName());
+
+    }
+
+    function testGetDateTimeDateLOCALTZ() {
+
+        $elem = $this->vcal->createProperty('DTSTART','19850704T013000');
+        $elem['TZID'] = 'Europe/Amsterdam';
+
+        $dt = $elem->getDateTime();
+
+        $this->assertInstanceOf('DateTime', $dt);
+        $this->assertEquals('1985-07-04 01:30:00', $dt->format('Y-m-d H:i:s'));
+        $this->assertEquals('Europe/Amsterdam', $dt->getTimeZone()->getName());
+
+    }
+
+    /**
+     * @expectedException LogicException
+     */
+    function testGetDateTimeDateInvalid() {
+
+        $elem = $this->vcal->createProperty('DTSTART','bla');
+        $dt = $elem->getDateTime();
+
+    }
+
+    function testGetDateTimeWeirdTZ() {
+
+        $elem = $this->vcal->createProperty('DTSTART','19850704T013000');
+        $elem['TZID'] = '/freeassociation.sourceforge.net/Tzfile/Europe/Amsterdam';
+
+
+        $event = $this->vcal->createComponent('VEVENT');
+        $event->add($elem);
+
+        $timezone = $this->vcal->createComponent('VTIMEZONE');
+        $timezone->TZID = '/freeassociation.sourceforge.net/Tzfile/Europe/Amsterdam';
+        $timezone->{'X-LIC-LOCATION'} = 'Europe/Amsterdam';
+
+        $this->vcal->add($event);
+        $this->vcal->add($timezone);
+
+        $dt = $elem->getDateTime();
+
+        $this->assertInstanceOf('DateTime', $dt);
+        $this->assertEquals('1985-07-04 01:30:00', $dt->format('Y-m-d H:i:s'));
+        $this->assertEquals('Europe/Amsterdam', $dt->getTimeZone()->getName());
+
+    }
+
+    function testGetDateTimeBadTimeZone() {
+
+        $default = date_default_timezone_get();
+        date_default_timezone_set('Canada/Eastern');
+
+        $elem = $this->vcal->createProperty('DTSTART','19850704T013000');
+        $elem['TZID'] = 'Moon';
+
+
+        $event = $this->vcal->createComponent('VEVENT');
+        $event->add($elem);
+
+        $timezone = $this->vcal->createComponent('VTIMEZONE');
+        $timezone->TZID = 'Moon';
+        $timezone->{'X-LIC-LOCATION'} = 'Moon';
+
+
+        $this->vcal->add($event);
+        $this->vcal->add($timezone);
+
+        $dt = $elem->getDateTime();
+
+        $this->assertInstanceOf('DateTime', $dt);
+        $this->assertEquals('1985-07-04 01:30:00', $dt->format('Y-m-d H:i:s'));
+        $this->assertEquals('Canada/Eastern', $dt->getTimeZone()->getName());
+        date_default_timezone_set($default);
+
+    }
+
+    function testUpdateValueParameter() {
+
+        $dtStart = $this->vcal->createProperty('DTSTART', new \DateTime('2013-06-07 15:05:00'));
+        $dtStart['VALUE'] = 'DATE';
+
+        $this->assertEquals("DTSTART;VALUE=DATE:20130607\r\n", $dtStart->serialize());
+
+    }
+
+    function testValidate() {
+
+        $exDate = $this->vcal->createProperty('EXDATE', '-00011130T143000Z');
+        $messages = $exDate->validate();
+        $this->assertEquals(1, count($messages));
+        $this->assertEquals(3, $messages[0]['level']);
+
+    }
+
+    /**
+     * This issue was discovered on the sabredav mailing list.
+     */
+    function testCreateDatePropertyThroughAdd() {
+
+        $vcal = new VCalendar();
+        $vevent = $vcal->add('VEVENT');
+
+        $dtstart = $vevent->add(
+            'DTSTART',
+            new \DateTime('2014-03-07'),
+            array('VALUE' => 'DATE')
+        );
+
+        $this->assertEquals("DTSTART;VALUE=DATE:20140307\r\n", $dtstart->serialize());
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Property/ICalendar/DurationTest.php b/vendor/sabre/vobject/tests/VObject/Property/ICalendar/DurationTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..c5c96e4a765132586185555f17ea2d8f0622e551
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Property/ICalendar/DurationTest.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace Sabre\VObject\Property\ICalendar;
+
+use Sabre\VObject\Component\VCalendar;
+use Sabre\VObject\Component\VEvent;
+
+class DurationTest extends \PHPUnit_Framework_TestCase {
+
+    function testGetDateInterval() {
+
+        $vcal = new VCalendar();
+        $event = $vcal->add('VEVENT', array('DURATION' => array('PT1H')));
+
+        $this->assertEquals(
+            new \DateInterval('PT1H'),
+            $event->{'DURATION'}->getDateInterval()
+        );
+    }
+} 
diff --git a/vendor/sabre/vobject/tests/VObject/Property/ICalendar/RecurTest.php b/vendor/sabre/vobject/tests/VObject/Property/ICalendar/RecurTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..3eb04e4ef82968d462572fa5bfc2c8b5c0c5ce80
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Property/ICalendar/RecurTest.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace Sabre\VObject\Property\ICalendar;
+
+use Sabre\VObject\Component\VCalendar;
+
+class RecurTest extends \PHPUnit_Framework_TestCase {
+
+    function testParts() {
+
+        $vcal = new VCalendar();
+        $recur = $vcal->add('RRULE', 'FREQ=Daily');
+
+        $this->assertInstanceOf('Sabre\VObject\Property\ICalendar\Recur', $recur);
+
+        $this->assertEquals(array('FREQ'=>'DAILY'), $recur->getParts());
+        $recur->setParts(array('freq'=>'MONTHLY'));
+
+        $this->assertEquals(array('FREQ'=>'MONTHLY'), $recur->getParts());
+
+    }
+
+    /**
+     * @expectedException \InvalidArgumentException
+     */
+    function testSetValueBadVal() {
+
+        $vcal = new VCalendar();
+        $recur = $vcal->add('RRULE', 'FREQ=Daily');
+        $recur->setValue(new \Exception());
+
+    }
+
+    function testSetSubParts() {
+
+        $vcal = new VCalendar();
+        $recur = $vcal->add('RRULE', array('FREQ'=>'DAILY', 'BYDAY'=>'mo,tu', 'BYMONTH' => array(0,1)));
+
+        $this->assertEquals(array(
+            'FREQ'=>'DAILY',
+            'BYDAY' => array('MO','TU'),
+            'BYMONTH' => array(0,1),
+        ), $recur->getParts());
+
+    }
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Property/TextTest.php b/vendor/sabre/vobject/tests/VObject/Property/TextTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..647003b44f59900c114522aa32e612052b1e87e7
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Property/TextTest.php
@@ -0,0 +1,96 @@
+<?php
+
+namespace Sabre\VObject\Property;
+
+use Sabre\VObject\Component\VCard;
+
+class TextTest extends \PHPUnit_Framework_TestCase {
+
+    function assertVCard21serialization($propValue, $expected) {
+
+        $doc = new VCard(array(
+            'VERSION'=>'2.1',
+            'PROP' => $propValue
+        ), false);
+
+        // Adding quoted-printable, because we're testing if it gets removed
+        // automatically.
+        $doc->PROP['ENCODING'] = 'QUOTED-PRINTABLE';
+        $doc->PROP['P1'] = 'V1';
+
+
+        $output = $doc->serialize();
+
+
+        $this->assertEquals("BEGIN:VCARD\r\nVERSION:2.1\r\n$expected\r\nEND:VCARD\r\n", $output);
+
+    }
+
+    function testSerializeVCard21() {
+
+        $this->assertVCard21Serialization(
+            'f;oo',
+            'PROP;P1=V1:f;oo'
+        );
+
+    }
+
+    function testSerializeVCard21Array() {
+
+        $this->assertVCard21Serialization(
+            array('f;oo','bar'),
+            'PROP;P1=V1:f\;oo;bar'
+        );
+
+    }
+    function testSerializeVCard21Fold() {
+
+        $this->assertVCard21Serialization(
+            str_repeat('x',80),
+            'PROP;P1=V1:' . str_repeat('x',64) . "\r\n " . str_repeat('x',16)
+        );
+
+    }
+
+
+
+    function testSerializeQuotedPrintable() {
+
+        $this->assertVCard21Serialization(
+            "foo\r\nbar",
+            'PROP;P1=V1;ENCODING=QUOTED-PRINTABLE:foo=0D=0Abar'
+        );
+    }
+
+    function testSerializeQuotedPrintableFold() {
+
+        $this->assertVCard21Serialization(
+            "foo\r\nbarPasswordPasswordPasswordPasswordxxxxx",
+            "PROP;P1=V1;ENCODING=QUOTED-PRINTABLE:foo=0D=0AbarPasswordPasswordPasswordPasswordxx=\r\n xxx"
+        );
+
+    }
+
+    function testValidateMinimumPropValue() {
+
+        $vcard = <<<IN
+BEGIN:VCARD
+VERSION:4.0
+UID:foo
+FN:Hi!
+N:A
+END:VCARD
+IN;
+
+        $vcard = \Sabre\VObject\Reader::read($vcard);
+        $this->assertEquals(1, count($vcard->validate()));
+
+        $this->assertEquals(1, count($vcard->N->getParts()));
+
+        $vcard->validate(\Sabre\VObject\Node::REPAIR);
+
+        $this->assertEquals(5, count($vcard->N->getParts()));
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Property/VCard/DateAndOrTimeTest.php b/vendor/sabre/vobject/tests/VObject/Property/VCard/DateAndOrTimeTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..0f9a32c4eab35cf13958c3c6152abe9cb1c7ea81
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Property/VCard/DateAndOrTimeTest.php
@@ -0,0 +1,245 @@
+<?php
+
+namespace Sabre\VObject\Property\VCard;
+
+use
+    Sabre\VObject,
+    Sabre\VObject\Reader;
+
+class DateAndOrTimeTest extends \PHPUnit_Framework_TestCase {
+
+    /**
+     * @dataProvider dates
+     */
+    function testGetJsonValue($input, $output) {
+
+        $vcard = new VObject\Component\VCard();
+        $prop = $vcard->createProperty('BDAY', $input);
+
+        $this->assertEquals(array($output), $prop->getJsonValue());
+
+    }
+
+    function dates() {
+
+        return array(
+            array(
+                "19961022T140000",
+                "1996-10-22T14:00:00",
+            ),
+            array(
+                "--1022T1400",
+                "--10-22T14:00",
+            ),
+            array(
+                "---22T14",
+                "---22T14",
+            ),
+            array(
+                "19850412",
+                "1985-04-12",
+            ),
+            array(
+                "1985-04",
+                "1985-04",
+            ),
+            array(
+                "1985",
+                "1985",
+            ),
+            array(
+                "--0412",
+                "--04-12",
+            ),
+            array(
+                "T102200",
+                "T10:22:00",
+            ),
+            array(
+                "T1022",
+                "T10:22",
+            ),
+            array(
+                "T10",
+                "T10",
+            ),
+            array(
+                "T-2200",
+                "T-22:00",
+            ),
+            array(
+                "T102200Z",
+                "T10:22:00Z",
+            ),
+            array(
+                "T102200-0800",
+                "T10:22:00-0800",
+            ),
+            array(
+                "T--00",
+                "T--00",
+            ),
+        );
+
+    }
+
+    public function testSetParts() {
+
+        $vcard = new VObject\Component\VCard();
+
+        $prop = $vcard->createProperty('BDAY');
+        $prop->setParts(array(
+            new \DateTime('2014-04-02 18:37:00')
+        ));
+
+        $this->assertEquals('20140402T183700Z', $prop->getValue());
+
+    }
+
+    /**
+     * @expectedException InvalidArgumentException
+     */
+    public function testSetPartsTooMany() {
+
+        $vcard = new VObject\Component\VCard();
+
+        $prop = $vcard->createProperty('BDAY');
+        $prop->setParts(array(
+            1,
+            2
+        ));
+
+    }
+
+    public function testSetPartsString() {
+
+        $vcard = new VObject\Component\VCard();
+
+        $prop = $vcard->createProperty('BDAY');
+        $prop->setParts(array(
+            "20140402T183700Z"
+        ));
+
+        $this->assertEquals('20140402T183700Z', $prop->getValue());
+
+    }
+
+    public function testSetValueDateTime() {
+
+        $vcard = new VObject\Component\VCard();
+
+        $prop = $vcard->createProperty('BDAY');
+        $prop->setValue(
+            new \DateTime('2014-04-02 18:37:00')
+        );
+
+        $this->assertEquals('20140402T183700Z', $prop->getValue());
+
+    }
+
+    public function testSetDateTimeOffset() {
+
+        $vcard = new VObject\Component\VCard();
+
+        $prop = $vcard->createProperty('BDAY');
+        $prop->setValue(
+            new \DateTime('2014-04-02 18:37:00', new \DateTimeZone('America/Toronto'))
+        );
+
+        $this->assertEquals('20140402T183700-0400', $prop->getValue());
+
+    }
+
+    public function testGetDateTime() {
+
+        $datetime = new \DateTime('2014-04-02 18:37:00', new \DateTimeZone('America/Toronto'));
+
+        $vcard = new VObject\Component\VCard();
+        $prop = $vcard->createProperty('BDAY', $datetime);
+
+        $dt = $prop->getDateTime();
+        $this->assertEquals('2014-04-02T18:37:00-04:00', $dt->format('c'), "For some reason this one failed. Current default timezone is: " . date_default_timezone_get());
+
+    }
+
+    public function testGetDate() {
+
+        $datetime = new \DateTime('2014-04-02');
+
+        $vcard = new VObject\Component\VCard();
+        $prop = $vcard->createProperty('BDAY', $datetime, null, 'DATE');
+
+        $this->assertEquals('DATE', $prop->getValueType());
+        $this->assertEquals('BDAY:20140402', rtrim($prop->serialize()));
+
+    }
+
+    public function testGetDateIncomplete() {
+
+        $datetime = '--0407';
+
+        $vcard = new VObject\Component\VCard();
+        $prop = $vcard->add('BDAY', $datetime);
+
+        $dt = $prop->getDateTime();
+        // Note: if the year changes between the last line and the next line of
+        // code, this test may fail.
+        //
+        // If that happens, head outside and have a drink.
+        $current = new \DateTime('now');
+        $year = $current->format('Y');
+
+        $this->assertEquals($year . '0407', $dt->format('Ymd'));
+
+    }
+
+    public function testGetDateIncompleteFromVCard() {
+
+        $vcard = <<<VCF
+BEGIN:VCARD
+VERSION:4.0
+BDAY:--0407
+END:VCARD
+VCF;
+        $vcard = Reader::read($vcard);
+        $prop = $vcard->BDAY;
+
+        $dt = $prop->getDateTime();
+        // Note: if the year changes between the last line and the next line of
+        // code, this test may fail.
+        //
+        // If that happens, head outside and have a drink.
+        $current = new \DateTime('now');
+        $year = $current->format('Y');
+
+        $this->assertEquals($year . '0407', $dt->format('Ymd'));
+
+    }
+
+    public function testValidate() {
+
+        $datetime = '--0407';
+
+        $vcard = new VObject\Component\VCard();
+        $prop = $vcard->add('BDAY', $datetime);
+
+        $this->assertEquals(array(), $prop->validate());
+
+    }
+
+    public function testValidateBroken() {
+
+        $datetime = '123';
+
+        $vcard = new VObject\Component\VCard();
+        $prop = $vcard->add('BDAY', $datetime);
+
+        $this->assertEquals(array(array(
+            'level' => 3,
+            'message' => 'The supplied value (123) is not a correct DATE-AND-OR-TIME property',
+            'node' => $prop,
+        )), $prop->validate());
+
+    }
+}
+
diff --git a/vendor/sabre/vobject/tests/VObject/Property/VCard/LanguageTagTest.php b/vendor/sabre/vobject/tests/VObject/Property/VCard/LanguageTagTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..8cae8a79bcffcc0e3938a888d5d6491e223f88a0
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Property/VCard/LanguageTagTest.php
@@ -0,0 +1,48 @@
+<?php
+
+namespace Sabre\VObject\Property\VCard;
+
+use Sabre\VObject;
+
+class LanguageTagTest extends \PHPUnit_Framework_TestCase {
+
+    function testMimeDir() {
+
+        $input = "BEGIN:VCARD\r\nVERSION:4.0\r\nLANG:nl\r\nEND:VCARD\r\n";
+        $mimeDir = new VObject\Parser\MimeDir($input);
+
+        $result = $mimeDir->parse($input);
+
+        $this->assertInstanceOf('Sabre\VObject\Property\VCard\LanguageTag', $result->LANG);
+
+        $this->assertEquals('nl', $result->LANG->getValue());
+
+        $this->assertEquals(
+            $input,
+            $result->serialize()
+        );
+
+    }
+
+    function testChangeAndSerialize() {
+
+        $input = "BEGIN:VCARD\r\nVERSION:4.0\r\nLANG:nl\r\nEND:VCARD\r\n";
+        $mimeDir = new VObject\Parser\MimeDir($input);
+
+        $result = $mimeDir->parse($input);
+
+        $this->assertInstanceOf('Sabre\VObject\Property\VCard\LanguageTag', $result->LANG);
+        // This replicates what the vcard converter does and triggered a bug in
+        // the past.
+        $result->LANG->setValue(array('de'));
+
+        $this->assertEquals('de', $result->LANG->getValue());
+
+        $expected = "BEGIN:VCARD\r\nVERSION:4.0\r\nLANG:de\r\nEND:VCARD\r\n";
+        $this->assertEquals(
+            $expected,
+            $result->serialize()
+        );
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/PropertyTest.php b/vendor/sabre/vobject/tests/VObject/PropertyTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..7e600bc079154fc7cf87d15ec565a541817adc64
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/PropertyTest.php
@@ -0,0 +1,411 @@
+<?php
+
+namespace Sabre\VObject;
+
+use
+    Sabre\VObject\Component\VCalendar,
+    Sabre\VObject\Component\VCard;
+
+class PropertyTest extends \PHPUnit_Framework_TestCase {
+
+    function testToString() {
+
+        $cal = new VCalendar();
+
+        $property = $cal->createProperty('propname','propvalue');
+        $this->assertEquals('PROPNAME', $property->name);
+        $this->assertEquals('propvalue', $property->__toString());
+        $this->assertEquals('propvalue', (string)$property);
+        $this->assertEquals('propvalue', $property->getValue());
+
+    }
+
+    function testCreate() {
+
+        $cal = new VCalendar();
+
+        $params = array(
+            'param1' => 'value1',
+            'param2' => 'value2',
+        );
+
+        $property = $cal->createProperty('propname','propvalue', $params);
+
+        $this->assertEquals('value1', $property['param1']->getValue());
+        $this->assertEquals('value2', $property['param2']->getValue());
+
+    }
+
+    function testSetValue() {
+
+        $cal = new VCalendar();
+
+        $property = $cal->createProperty('propname','propvalue');
+        $property->setValue('value2');
+
+        $this->assertEquals('PROPNAME', $property->name);
+        $this->assertEquals('value2', $property->__toString());
+
+    }
+
+    function testParameterExists() {
+
+        $cal = new VCalendar();
+        $property = $cal->createProperty('propname','propvalue');
+        $property['paramname'] = 'paramvalue';
+
+        $this->assertTrue(isset($property['PARAMNAME']));
+        $this->assertTrue(isset($property['paramname']));
+        $this->assertFalse(isset($property['foo']));
+
+    }
+
+    function testParameterGet() {
+
+        $cal = new VCalendar();
+        $property = $cal->createProperty('propname','propvalue');
+        $property['paramname'] = 'paramvalue';
+
+        $this->assertInstanceOf('Sabre\\VObject\\Parameter',$property['paramname']);
+
+    }
+
+    function testParameterNotExists() {
+
+        $cal = new VCalendar();
+        $property = $cal->createProperty('propname','propvalue');
+        $property['paramname'] = 'paramvalue';
+
+        $this->assertInternalType('null',$property['foo']);
+
+    }
+
+    function testParameterMultiple() {
+
+        $cal = new VCalendar();
+        $property = $cal->createProperty('propname','propvalue');
+        $property['paramname'] = 'paramvalue';
+        $property->add('paramname', 'paramvalue');
+
+        $this->assertInstanceOf('Sabre\\VObject\\Parameter',$property['paramname']);
+        $this->assertEquals(2,count($property['paramname']->getParts()));
+
+    }
+
+    function testSetParameterAsString() {
+
+        $cal = new VCalendar();
+        $property = $cal->createProperty('propname','propvalue');
+        $property['paramname'] = 'paramvalue';
+
+        $this->assertEquals(1,count($property->parameters()));
+        $this->assertInstanceOf('Sabre\\VObject\\Parameter', $property->parameters['PARAMNAME']);
+        $this->assertEquals('PARAMNAME',$property->parameters['PARAMNAME']->name);
+        $this->assertEquals('paramvalue',$property->parameters['PARAMNAME']->getValue());
+
+    }
+
+    function testUnsetParameter() {
+
+        $cal = new VCalendar();
+        $property = $cal->createProperty('propname','propvalue');
+        $property['paramname'] = 'paramvalue';
+
+        unset($property['PARAMNAME']);
+        $this->assertEquals(0,count($property->parameters()));
+
+    }
+
+    function testSerialize() {
+
+        $cal = new VCalendar();
+        $property = $cal->createProperty('propname','propvalue');
+
+        $this->assertEquals("PROPNAME:propvalue\r\n",$property->serialize());
+
+    }
+
+    function testSerializeParam() {
+
+        $cal = new VCalendar();
+        $property = $cal->createProperty('propname','propvalue', array(
+            'paramname' => 'paramvalue',
+            'paramname2' => 'paramvalue2',
+        ));
+
+        $this->assertEquals("PROPNAME;PARAMNAME=paramvalue;PARAMNAME2=paramvalue2:propvalue\r\n",$property->serialize());
+
+    }
+
+    function testSerializeNewLine() {
+
+        $cal = new VCalendar();
+        $property = $cal->createProperty('SUMMARY',"line1\nline2");
+
+        $this->assertEquals("SUMMARY:line1\\nline2\r\n",$property->serialize());
+
+    }
+
+    function testSerializeLongLine() {
+
+        $cal = new VCalendar();
+        $value = str_repeat('!',200);
+        $property = $cal->createProperty('propname',$value);
+
+        $expected = "PROPNAME:" . str_repeat('!',66) . "\r\n " . str_repeat('!',74) . "\r\n " . str_repeat('!',60) . "\r\n";
+
+        $this->assertEquals($expected,$property->serialize());
+
+    }
+
+    function testSerializeUTF8LineFold() {
+
+        $cal = new VCalendar();
+        $value = str_repeat('!',65) . "\xc3\xa4bla"; // inserted umlaut-a
+        $property = $cal->createProperty('propname', $value);
+        $expected = "PROPNAME:" . str_repeat('!',65) . "\r\n \xc3\xa4bla\r\n";
+        $this->assertEquals($expected, $property->serialize());
+
+    }
+
+    function testGetIterator() {
+
+        $cal = new VCalendar();
+        $it = new ElementList(array());
+        $property = $cal->createProperty('propname','propvalue');
+        $property->setIterator($it);
+        $this->assertEquals($it,$property->getIterator());
+
+    }
+
+
+    function testGetIteratorDefault() {
+
+        $cal = new VCalendar();
+        $property = $cal->createProperty('propname','propvalue');
+        $it = $property->getIterator();
+        $this->assertTrue($it instanceof ElementList);
+        $this->assertEquals(1,count($it));
+
+    }
+
+    function testAddScalar() {
+
+        $cal = new VCalendar();
+        $property = $cal->createProperty('EMAIL');
+
+        $property->add('myparam','value');
+
+        $this->assertEquals(1, count($property->parameters()));
+
+        $this->assertTrue($property->parameters['MYPARAM'] instanceof Parameter);
+        $this->assertEquals('MYPARAM',$property->parameters['MYPARAM']->name);
+        $this->assertEquals('value',$property->parameters['MYPARAM']->getValue());
+
+    }
+
+    function testAddParameter() {
+
+        $cal = new VCalendar();
+        $prop = $cal->createProperty('EMAIL');
+
+        $prop->add('MYPARAM','value');
+
+        $this->assertEquals(1, count($prop->parameters()));
+        $this->assertEquals('MYPARAM',$prop['myparam']->name);
+
+    }
+
+    function testAddParameterTwice() {
+
+        $cal = new VCalendar();
+        $prop = $cal->createProperty('EMAIL');
+
+        $prop->add('MYPARAM', 'value1');
+        $prop->add('MYPARAM', 'value2');
+
+        $this->assertEquals(1, count($prop->parameters));
+        $this->assertEquals(2, count($prop->parameters['MYPARAM']->getParts()));
+
+        $this->assertEquals('MYPARAM',$prop['MYPARAM']->name);
+
+    }
+
+
+    function testClone() {
+
+        $cal = new VCalendar();
+        $property = $cal->createProperty('EMAIL','value');
+        $property['FOO'] = 'BAR';
+
+        $property2 = clone $property;
+
+        $property['FOO'] = 'BAZ';
+        $this->assertEquals('BAR', (string)$property2['FOO']);
+
+    }
+
+    function testCreateParams() {
+
+        $cal = new VCalendar();
+        $property = $cal->createProperty('X-PROP','value', array(
+            'param1' => 'value1',
+            'param2' => array('value2', 'value3')
+        ));
+
+        $this->assertEquals(1, count($property['PARAM1']->getParts()));
+        $this->assertEquals(2, count($property['PARAM2']->getParts()));
+
+    }
+
+    function testValidateNonUTF8() {
+
+        $calendar = new VCalendar();
+        $property = $calendar->createProperty('X-PROP', "Bla\x00");
+        $result = $property->validate(Property::REPAIR);
+
+        $this->assertEquals('Property contained a control character (0x00)', $result[0]['message']);
+        $this->assertEquals('Bla', $property->getValue());
+
+    }
+
+    function testValidateControlChars() {
+
+        $s = "chars[";
+        foreach (array(
+            0x7F, 0x5E, 0x5C, 0x3B, 0x3A, 0x2C, 0x22, 0x20,
+            0x1F, 0x1E, 0x1D, 0x1C, 0x1B, 0x1A, 0x19, 0x18,
+            0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10,
+            0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08,
+            0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00,
+          ) as $c) {
+            $s .= sprintf('%02X(%c)', $c, $c);
+        }
+        $s .= "]end";
+
+        $calendar = new VCalendar();
+        $property = $calendar->createProperty('X-PROP', $s);
+        $result = $property->validate(Property::REPAIR);
+
+        $this->assertEquals('Property contained a control character (0x7f)', $result[0]['message']);
+        $this->assertEquals("chars[7F()5E(^)5C(\\\\)3B(\\;)3A(:)2C(\\,)22(\")20( )1F()1E()1D()1C()1B()1A()19()18()17()16()15()14()13()12()11()10()0F()0E()0D()0C()0B()0A(\\n)09(	)08()07()06()05()04()03()02()01()00()]end", $property->getRawMimeDirValue());
+
+    }
+
+    function testValidateBadPropertyName() {
+
+        $calendar = new VCalendar();
+        $property = $calendar->createProperty("X_*&PROP*", "Bla");
+        $result = $property->validate(Property::REPAIR);
+
+        $this->assertEquals($result[0]['message'], 'The propertyname: X_*&PROP* contains invalid characters. Only A-Z, 0-9 and - are allowed');
+        $this->assertEquals('X-PROP', $property->name);
+
+    }
+
+    function testGetValue() {
+
+        $calendar = new VCalendar();
+        $property = $calendar->createProperty("SUMMARY", null);
+        $this->assertEquals(array(), $property->getParts());
+        $this->assertNull($property->getValue());
+
+        $property->setValue(array());
+        $this->assertEquals(array(), $property->getParts());
+        $this->assertNull($property->getValue());
+
+        $property->setValue(array(1));
+        $this->assertEquals(array(1), $property->getParts());
+        $this->assertEquals(1, $property->getValue());
+
+        $property->setValue(array(1,2));
+        $this->assertEquals(array(1,2), $property->getParts());
+        $this->assertEquals('1,2', $property->getValue());
+
+        $property->setValue('str');
+        $this->assertEquals(array('str'), $property->getParts());
+        $this->assertEquals('str', $property->getValue());
+    }
+
+    /**
+     * ElementList should reject this.
+     *
+     * @expectedException \LogicException
+     */
+    function testArrayAccessSetInt() {
+
+        $calendar = new VCalendar();
+        $property = $calendar->createProperty("X-PROP", null);
+
+        $calendar->add($property);
+        $calendar->{'X-PROP'}[0] = 'Something!';
+
+    }
+
+    /**
+     * ElementList should reject this.
+     *
+     * @expectedException \LogicException
+     */
+    function testArrayAccessUnsetInt() {
+
+        $calendar = new VCalendar();
+        $property = $calendar->createProperty("X-PROP", null);
+
+        $calendar->add($property);
+        unset($calendar->{'X-PROP'}[0]);
+
+    }
+
+    function testValidateBadEncoding() {
+
+        $document = new VCalendar();
+        $property = $document->add('X-FOO','value');
+        $property['ENCODING'] = 'invalid';
+
+        $result = $property->validate();
+
+        $this->assertEquals('ENCODING=INVALID is not valid for this document type.', $result[0]['message']);
+        $this->assertEquals(1, $result[0]['level']);
+
+    }
+
+    function testValidateBadEncodingVCard4() {
+
+        $document = new VCard(array('VERSION' => '4.0'));
+        $property = $document->add('X-FOO','value');
+        $property['ENCODING'] = 'BASE64';
+
+        $result = $property->validate();
+
+        $this->assertEquals('ENCODING parameter is not valid in vCard 4.', $result[0]['message']);
+        $this->assertEquals(1, $result[0]['level']);
+
+    }
+
+    function testValidateBadEncodingVCard3() {
+
+        $document = new VCard(array('VERSION' => '3.0'));
+        $property = $document->add('X-FOO','value');
+        $property['ENCODING'] = 'BASE64';
+
+        $result = $property->validate();
+
+        $this->assertEquals('ENCODING=BASE64 is not valid for this document type.', $result[0]['message']);
+        $this->assertEquals(1, $result[0]['level']);
+
+    }
+
+    function testValidateBadEncodingVCard21() {
+
+        $document = new VCard(array('VERSION' => '2.1'));
+        $property = $document->add('X-FOO','value');
+        $property['ENCODING'] = 'B';
+
+        $result = $property->validate();
+
+        $this->assertEquals('ENCODING=B is not valid for this document type.', $result[0]['message']);
+        $this->assertEquals(1, $result[0]['level']);
+
+    }
+}
diff --git a/vendor/sabre/vobject/tests/VObject/ReaderTest.php b/vendor/sabre/vobject/tests/VObject/ReaderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..f530d8120da4d1c34562a284d813d636b6e5a9ee
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/ReaderTest.php
@@ -0,0 +1,449 @@
+<?php
+
+namespace Sabre\VObject;
+
+class ReaderTest extends \PHPUnit_Framework_TestCase {
+
+    function testReadComponent() {
+
+        $data = "BEGIN:VCALENDAR\r\nEND:VCALENDAR";
+
+        $result = Reader::read($data);
+
+        $this->assertInstanceOf('Sabre\\VObject\\Component', $result);
+        $this->assertEquals('VCALENDAR', $result->name);
+        $this->assertEquals(0, count($result->children));
+
+    }
+    function testReadStream() {
+
+        $data = "BEGIN:VCALENDAR\r\nEND:VCALENDAR";
+
+        $stream = fopen('php://memory', 'r+');
+        fwrite($stream, $data);
+        rewind($stream);
+
+        $result = Reader::read($stream);
+
+        $this->assertInstanceOf('Sabre\\VObject\\Component', $result);
+        $this->assertEquals('VCALENDAR', $result->name);
+        $this->assertEquals(0, count($result->children));
+
+    }
+
+    function testReadComponentUnixNewLine() {
+
+        $data = "BEGIN:VCALENDAR\nEND:VCALENDAR";
+
+        $result = Reader::read($data);
+
+        $this->assertInstanceOf('Sabre\\VObject\\Component', $result);
+        $this->assertEquals('VCALENDAR', $result->name);
+        $this->assertEquals(0, count($result->children));
+
+    }
+
+    function testReadComponentLineFold() {
+
+        $data = "BEGIN:\r\n\tVCALENDAR\r\nE\r\n ND:VCALENDAR";
+
+        $result = Reader::read($data);
+
+        $this->assertInstanceOf('Sabre\\VObject\\Component', $result);
+        $this->assertEquals('VCALENDAR', $result->name);
+        $this->assertEquals(0, count($result->children));
+
+    }
+
+    /**
+     * @expectedException Sabre\VObject\ParseException
+     */
+    function testReadCorruptComponent() {
+
+        $data = "BEGIN:VCALENDAR\r\nEND:FOO";
+
+        $result = Reader::read($data);
+
+    }
+
+    /**
+     * @expectedException Sabre\VObject\ParseException
+     */
+    function testReadCorruptSubComponent() {
+
+        $data = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nEND:FOO\r\nEND:VCALENDAR";
+
+        $result = Reader::read($data);
+
+    }
+
+    function testReadProperty() {
+
+        $data = "BEGIN:VCALENDAR\r\nSUMMARY:propValue\r\nEND:VCALENDAR";
+        $result = Reader::read($data);
+
+        $result = $result->SUMMARY;
+        $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+        $this->assertEquals('SUMMARY', $result->name);
+        $this->assertEquals('propValue', $result->getValue());
+
+    }
+
+    function testReadPropertyWithNewLine() {
+
+        $data = "BEGIN:VCALENDAR\r\nSUMMARY:Line1\\nLine2\\NLine3\\\\Not the 4th line!\r\nEND:VCALENDAR";
+        $result = Reader::read($data);
+
+        $result = $result->SUMMARY;
+        $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+        $this->assertEquals('SUMMARY', $result->name);
+        $this->assertEquals("Line1\nLine2\nLine3\\Not the 4th line!", $result->getValue());
+
+    }
+
+    function testReadMappedProperty() {
+
+        $data = "BEGIN:VCALENDAR\r\nDTSTART:20110529\r\nEND:VCALENDAR";
+        $result = Reader::read($data);
+
+        $result = $result->DTSTART;
+        $this->assertInstanceOf('Sabre\\VObject\\Property\\ICalendar\\DateTime', $result);
+        $this->assertEquals('DTSTART', $result->name);
+        $this->assertEquals('20110529', $result->getValue());
+
+    }
+
+    function testReadMappedPropertyGrouped() {
+
+        $data = "BEGIN:VCALENDAR\r\nfoo.DTSTART:20110529\r\nEND:VCALENDAR";
+        $result = Reader::read($data);
+
+        $result = $result->DTSTART;
+        $this->assertInstanceOf('Sabre\\VObject\\Property\\ICalendar\\DateTime', $result);
+        $this->assertEquals('DTSTART', $result->name);
+        $this->assertEquals('20110529', $result->getValue());
+
+    }
+
+    /**
+     * @expectedException Sabre\VObject\ParseException
+     */
+    function testReadBrokenLine() {
+
+        $data = "BEGIN:VCALENDAR\r\nPROPNAME;propValue";
+        $result = Reader::read($data);
+
+    }
+
+    function testReadPropertyInComponent() {
+
+        $data = array(
+            "BEGIN:VCALENDAR",
+            "PROPNAME:propValue",
+            "END:VCALENDAR"
+        );
+
+        $result = Reader::read(implode("\r\n",$data));
+
+        $this->assertInstanceOf('Sabre\\VObject\\Component', $result);
+        $this->assertEquals('VCALENDAR', $result->name);
+        $this->assertEquals(1, count($result->children()));
+        $this->assertInstanceOf('Sabre\\VObject\\Property', $result->children[0]);
+        $this->assertEquals('PROPNAME', $result->children[0]->name);
+        $this->assertEquals('propValue', $result->children[0]->getValue());
+
+    }
+
+    function testReadNestedComponent() {
+
+        $data = array(
+            "BEGIN:VCALENDAR",
+            "BEGIN:VTIMEZONE",
+            "BEGIN:DAYLIGHT",
+            "END:DAYLIGHT",
+            "END:VTIMEZONE",
+            "END:VCALENDAR"
+        );
+
+        $result = Reader::read(implode("\r\n",$data));
+
+        $this->assertInstanceOf('Sabre\\VObject\\Component', $result);
+        $this->assertEquals('VCALENDAR', $result->name);
+        $this->assertEquals(1, count($result->children()));
+        $this->assertInstanceOf('Sabre\\VObject\\Component', $result->children[0]);
+        $this->assertEquals('VTIMEZONE', $result->children[0]->name);
+        $this->assertEquals(1, count($result->children[0]->children()));
+        $this->assertInstanceOf('Sabre\\VObject\\Component', $result->children[0]->children[0]);
+        $this->assertEquals('DAYLIGHT', $result->children[0]->children[0]->name);
+
+
+    }
+
+    function testReadPropertyParameter() {
+
+        $data = "BEGIN:VCALENDAR\r\nPROPNAME;PARAMNAME=paramvalue:propValue\r\nEND:VCALENDAR";
+        $result = Reader::read($data);
+
+        $result = $result->PROPNAME;
+
+        $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+        $this->assertEquals('PROPNAME', $result->name);
+        $this->assertEquals('propValue', $result->getValue());
+        $this->assertEquals(1, count($result->parameters()));
+        $this->assertEquals('PARAMNAME', $result->parameters['PARAMNAME']->name);
+        $this->assertEquals('paramvalue', $result->parameters['PARAMNAME']->getValue());
+
+    }
+
+    function testReadPropertyRepeatingParameter() {
+
+        $data = "BEGIN:VCALENDAR\r\nPROPNAME;N=1;N=2;N=3,4;N=\"5\",6;N=\"7,8\";N=9,10;N=^'11^':propValue\r\nEND:VCALENDAR";
+        $result = Reader::read($data);
+
+        $result = $result->PROPNAME;
+
+        $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+        $this->assertEquals('PROPNAME', $result->name);
+        $this->assertEquals('propValue', $result->getValue());
+        $this->assertEquals(1, count($result->parameters()));
+        $this->assertEquals('N', $result->parameters['N']->name);
+        $this->assertEquals('1,2,3,4,5,6,7,8,9,10,"11"', $result->parameters['N']->getValue());
+        $this->assertEquals(array(1,2,3,4,5,6,"7,8",9,10,'"11"'), $result->parameters['N']->getParts());
+
+    }
+
+    function testReadPropertyRepeatingNamelessGuessedParameter() {
+        $data = "BEGIN:VCALENDAR\r\nPROPNAME;WORK;VOICE;PREF:propValue\r\nEND:VCALENDAR";
+        $result = Reader::read($data);
+
+        $result = $result->PROPNAME;
+
+        $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+        $this->assertEquals('PROPNAME', $result->name);
+        $this->assertEquals('propValue', $result->getValue());
+        $this->assertEquals(1, count($result->parameters()));
+        $this->assertEquals('TYPE', $result->parameters['TYPE']->name);
+        $this->assertEquals('WORK,VOICE,PREF', $result->parameters['TYPE']->getValue());
+        $this->assertEquals(array('WORK', 'VOICE', 'PREF'), $result->parameters['TYPE']->getParts());
+
+    }
+
+    function testReadPropertyNoName() {
+
+        $data = "BEGIN:VCALENDAR\r\nPROPNAME;PRODIGY:propValue\r\nEND:VCALENDAR";
+        $result = Reader::read($data);
+
+        $result = $result->PROPNAME;
+
+        $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+        $this->assertEquals('PROPNAME', $result->name);
+        $this->assertEquals('propValue', $result->getValue());
+        $this->assertEquals(1, count($result->parameters()));
+        $this->assertEquals('TYPE', $result->parameters['TYPE']->name);
+        $this->assertTrue($result->parameters['TYPE']->noName);
+        $this->assertEquals('PRODIGY', $result->parameters['TYPE']);
+
+    }
+
+    function testReadPropertyParameterExtraColon() {
+
+        $data = "BEGIN:VCALENDAR\r\nPROPNAME;PARAMNAME=paramvalue:propValue:anotherrandomstring\r\nEND:VCALENDAR";
+        $result = Reader::read($data);
+
+        $result = $result->PROPNAME;
+
+        $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+        $this->assertEquals('PROPNAME', $result->name);
+        $this->assertEquals('propValue:anotherrandomstring', $result->getValue());
+        $this->assertEquals(1, count($result->parameters()));
+        $this->assertEquals('PARAMNAME', $result->parameters['PARAMNAME']->name);
+        $this->assertEquals('paramvalue', $result->parameters['PARAMNAME']->getValue());
+
+    }
+
+    function testReadProperty2Parameters() {
+
+        $data = "BEGIN:VCALENDAR\r\nPROPNAME;PARAMNAME=paramvalue;PARAMNAME2=paramvalue2:propValue\r\nEND:VCALENDAR";
+        $result = Reader::read($data);
+
+        $result = $result->PROPNAME;
+
+        $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+        $this->assertEquals('PROPNAME', $result->name);
+        $this->assertEquals('propValue', $result->getValue());
+        $this->assertEquals(2, count($result->parameters()));
+        $this->assertEquals('PARAMNAME', $result->parameters['PARAMNAME']->name);
+        $this->assertEquals('paramvalue', $result->parameters['PARAMNAME']->getValue());
+        $this->assertEquals('PARAMNAME2', $result->parameters['PARAMNAME2']->name);
+        $this->assertEquals('paramvalue2', $result->parameters['PARAMNAME2']->getValue());
+
+    }
+
+    function testReadPropertyParameterQuoted() {
+
+        $data = "BEGIN:VCALENDAR\r\nPROPNAME;PARAMNAME=\"paramvalue\":propValue\r\nEND:VCALENDAR";
+        $result = Reader::read($data);
+
+        $result = $result->PROPNAME;
+
+        $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+        $this->assertEquals('PROPNAME', $result->name);
+        $this->assertEquals('propValue', $result->getValue());
+        $this->assertEquals(1, count($result->parameters()));
+        $this->assertEquals('PARAMNAME', $result->parameters['PARAMNAME']->name);
+        $this->assertEquals('paramvalue', $result->parameters['PARAMNAME']->getValue());
+
+    }
+
+    function testReadPropertyParameterNewLines() {
+
+        $data = "BEGIN:VCALENDAR\r\nPROPNAME;PARAMNAME=paramvalue1^nvalue2^^nvalue3:propValue\r\nEND:VCALENDAR";
+        $result = Reader::read($data);
+
+        $result = $result->propname;
+
+        $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+        $this->assertEquals('PROPNAME', $result->name);
+        $this->assertEquals('propValue', $result->getValue());
+
+        $this->assertEquals(1, count($result->parameters()));
+        $this->assertEquals('PARAMNAME', $result->parameters['PARAMNAME']->name);
+        $this->assertEquals("paramvalue1\nvalue2^nvalue3", $result->parameters['PARAMNAME']->getValue());
+
+    }
+
+    function testReadPropertyParameterQuotedColon() {
+
+        $data = "BEGIN:VCALENDAR\r\nPROPNAME;PARAMNAME=\"param:value\":propValue\r\nEND:VCALENDAR";
+        $result = Reader::read($data);
+        $result = $result->propname;
+
+        $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+        $this->assertEquals('PROPNAME', $result->name);
+        $this->assertEquals('propValue', $result->getValue());
+        $this->assertEquals(1, count($result->parameters()));
+        $this->assertEquals('PARAMNAME', $result->parameters['PARAMNAME']->name);
+        $this->assertEquals('param:value', $result->parameters['PARAMNAME']->getValue());
+
+    }
+
+    function testReadForgiving() {
+
+        $data = array(
+            "BEGIN:VCALENDAR",
+            "X_PROP:propValue",
+            "END:VCALENDAR"
+        );
+
+        $caught = false;
+        try {
+            $result = Reader::read(implode("\r\n",$data));
+        } catch (ParseException $e) {
+            $caught = true;
+        }
+
+        $this->assertEquals(true, $caught);
+
+        $result = Reader::read(implode("\r\n",$data), Reader::OPTION_FORGIVING);
+
+        $expected = implode("\r\n", array(
+            "BEGIN:VCALENDAR",
+            "X_PROP:propValue",
+            "END:VCALENDAR",
+            ""
+        ));
+
+        $this->assertEquals($expected, $result->serialize());
+
+    }
+
+    function testReadWithInvalidLine() {
+
+        $data = array(
+            "BEGIN:VCALENDAR",
+            "DESCRIPTION:propValue",
+            "Yes, we've actually seen a file with non-idented property values on multiple lines",
+            "END:VCALENDAR"
+        );
+
+        $caught = false;
+        try {
+            $result = Reader::read(implode("\r\n",$data));
+        } catch (ParseException $e) {
+            $caught = true;
+        }
+
+        $this->assertEquals(true, $caught);
+
+        $result = Reader::read(implode("\r\n",$data), Reader::OPTION_IGNORE_INVALID_LINES);
+
+        $expected = implode("\r\n", array(
+            "BEGIN:VCALENDAR",
+            "DESCRIPTION:propValue",
+            "END:VCALENDAR",
+            ""
+        ));
+
+        $this->assertEquals($expected, $result->serialize());
+
+    }
+
+    /**
+     * Reported as Issue 32.
+     *
+     * @expectedException \Sabre\VObject\ParseException
+     */
+    public function testReadIncompleteFile() {
+
+        $input = <<<ICS
+BEGIN:VCALENDAR
+VERSION:1.0
+BEGIN:VEVENT
+X-FUNAMBOL-FOLDER:DEFAULT_FOLDER
+X-FUNAMBOL-ALLDAY:0
+DTSTART:20111017T110000Z
+DTEND:20111017T123000Z
+X-MICROSOFT-CDO-BUSYSTATUS:BUSY
+CATEGORIES:
+LOCATION;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:Netviewer Meeting
+PRIORITY:1
+STATUS:3
+X-MICROSOFT-CDO-REPLYTIME:20111017T064200Z
+SUMMARY;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:Kopieren: test
+CLASS:PUBLIC
+AALARM:
+RRULE:
+X-FUNAMBOL-BILLINGINFO:
+X-FUNAMBOL-COMPANIES:
+X-FUNAMBOL-MILEAGE:
+X-FUNAMBOL-NOAGING:0
+ATTENDEE;STATUS=NEEDS ACTION;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:'Heino' heino@test.com
+ATTENDEE;STATUS=NEEDS ACTION;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:'Markus' test@test.com
+ATTENDEE;STATUS=NEEDS AC
+ICS;
+
+        Reader::read($input);
+
+    }
+
+    /**
+     * @expectedException \InvalidArgumentException
+     */
+    public function testReadBrokenInput() {
+
+        Reader::read(false);
+
+    }
+
+    public function testReadBOM() {
+
+        $data = chr(0xef) . chr(0xbb) . chr(0xbf) . "BEGIN:VCALENDAR\r\nEND:VCALENDAR";
+        $result = Reader::read($data);
+
+        $this->assertInstanceOf('Sabre\\VObject\\Component', $result);
+        $this->assertEquals('VCALENDAR', $result->name);
+        $this->assertEquals(0, count($result->children));
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/ByMonthInDailyTest.php b/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/ByMonthInDailyTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..4f3f852923484fab3f2fd31db5beab2da07bc8a1
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/ByMonthInDailyTest.php
@@ -0,0 +1,59 @@
+<?php
+
+namespace Sabre\VObject\Recur;
+
+use
+    Sabre\VObject\Reader,
+    DateTime;
+
+class ByMonthInDailyTest extends \PHPUnit_Framework_TestCase {
+
+    /**
+     * This tests the expansion of dates with DAILY frequency in RRULE with BYMONTH restrictions
+     */
+    function testExpand() {
+
+        $ics = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//iCal 4.0.4//EN
+CALSCALE:GREGORIAN
+BEGIN:VEVENT
+TRANSP:OPAQUE
+DTEND:20070925T183000Z
+UID:uuid
+DTSTAMP:19700101T000000Z
+LOCATION:
+DESCRIPTION:
+STATUS:CONFIRMED
+SEQUENCE:18
+SUMMARY:Stuff
+DTSTART:20070925T160000Z
+CREATED:20071004T144642Z
+RRULE:FREQ=DAILY;BYMONTH=9,10;BYDAY=SU
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $vcal = Reader::read($ics);
+        $this->assertInstanceOf('Sabre\\VObject\\Component\\VCalendar', $vcal);
+
+        $vcal->expand(new DateTime('2013-09-28'), new DateTime('2014-09-11'));
+
+        foreach ($vcal->VEVENT as $event) {
+            $dates[] = $event->DTSTART->getValue();
+        }
+
+        $expectedDates = array(
+            "20130929T160000Z",
+            "20131006T160000Z",
+            "20131013T160000Z",
+            "20131020T160000Z",
+            "20131027T160000Z",
+            "20140907T160000Z"
+        );
+
+        $this->assertEquals($expectedDates, $dates, 'Recursed dates are restricted by month');
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/BySetPosHangTest.php b/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/BySetPosHangTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..bf346a5ca0fdc02ec877ad1283966492389d9a15
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/BySetPosHangTest.php
@@ -0,0 +1,61 @@
+<?php
+
+namespace Sabre\VObject\Recur;
+
+use
+    Sabre\VObject\Reader,
+    DateTime;
+
+class BySetPosHangTest extends \PHPUnit_Framework_TestCase {
+
+    /**
+     * Using this iCalendar object, including BYSETPOS=-2 causes the iterator
+     * to hang, as reported in ticket #212.
+     *
+     * See: https://github.com/fruux/sabre-vobject/issues/212
+     */
+    function testExpand() {
+
+        $ics = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject 3.4.2//EN
+CALSCALE:GREGORIAN
+BEGIN:VEVENT
+SUMMARY:Test event 1
+DTSTART;TZID=Europe/Copenhagen:20150101T170000
+RRULE:FREQ=MONTHLY;BYDAY=TH;BYSETPOS=-2
+UID:b4071499-6fe4-418a-83b8-2b8d5ebb38e4
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $vcal = Reader::read($ics);
+        $this->assertInstanceOf('Sabre\\VObject\\Component\\VCalendar', $vcal);
+
+        $vcal->expand(new DateTime('2015-01-01'), new DateTime('2016-01-01'));
+
+        foreach ($vcal->VEVENT as $event) {
+            $dates[] = $event->DTSTART->getValue();
+        }
+
+        $expectedDates = array(
+            "20150101T160000Z",
+            "20150122T160000Z",
+            "20150219T160000Z",
+            "20150319T160000Z",
+            "20150423T150000Z",
+            "20150521T150000Z",
+            "20150618T150000Z",
+            "20150723T150000Z",
+            "20150820T150000Z",
+            "20150917T150000Z",
+            "20151022T150000Z",
+            "20151119T160000Z",
+            "20151224T160000Z",
+        );
+
+        $this->assertEquals($expectedDates, $dates);
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/ExpandFloatingTimesTest.php b/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/ExpandFloatingTimesTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..63c91baef9ac2e77c03ada897c525b4d2ef529a0
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/ExpandFloatingTimesTest.php
@@ -0,0 +1,122 @@
+<?php
+
+namespace Sabre\VObject\Recur\EventIterator;
+
+use
+    DateTime,
+    DateTimeZone,
+    Sabre\VObject\Reader;
+
+class ExpandFloatingTimesTest extends \PHPUnit_Framework_TestCase {
+
+    function testExpand() {
+
+        $input = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foo
+DTSTART:20150109T090000
+DTEND:20150109T100000
+RRULE:FREQ=WEEKLY;INTERVAL=1;UNTIL=20191002T070000Z;BYDAY=FR
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $vcal = Reader::read($input);
+        $this->assertInstanceOf('Sabre\\VObject\\Component\\VCalendar', $vcal);
+
+        $vcal->expand(new DateTime('2015-01-01'), new DateTime('2015-01-31'));
+
+        $result = $vcal->serialize();
+
+        $output = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foo
+DTSTART:20150109T090000Z
+DTEND:20150109T100000Z
+RECURRENCE-ID:20150109T090000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:foo
+DTSTART:20150116T090000Z
+DTEND:20150116T100000Z
+RECURRENCE-ID:20150116T090000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:foo
+DTSTART:20150123T090000Z
+DTEND:20150123T100000Z
+RECURRENCE-ID:20150123T090000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:foo
+DTSTART:20150130T090000Z
+DTEND:20150130T100000Z
+RECURRENCE-ID:20150130T090000Z
+END:VEVENT
+END:VCALENDAR
+
+ICS;
+        $this->assertEquals($output, str_replace("\r", "", $result));
+
+    }
+
+    function testExpandWithReferenceTimezone() {
+
+        $input = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foo
+DTSTART:20150109T090000
+DTEND:20150109T100000
+RRULE:FREQ=WEEKLY;INTERVAL=1;UNTIL=20191002T070000Z;BYDAY=FR
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $vcal = Reader::read($input);
+        $this->assertInstanceOf('Sabre\\VObject\\Component\\VCalendar', $vcal);
+
+        $vcal->expand(new DateTime('2015-01-01'), new DateTime('2015-01-31'), new \DateTimeZone('Europe/Berlin'));
+
+        $result = $vcal->serialize();
+
+        $output = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foo
+DTSTART:20150109T080000Z
+DTEND:20150109T090000Z
+RECURRENCE-ID:20150109T080000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:foo
+DTSTART:20150116T080000Z
+DTEND:20150116T090000Z
+RECURRENCE-ID:20150116T080000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:foo
+DTSTART:20150123T080000Z
+DTEND:20150123T090000Z
+RECURRENCE-ID:20150123T080000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:foo
+DTSTART:20150130T080000Z
+DTEND:20150130T090000Z
+RECURRENCE-ID:20150130T080000Z
+END:VEVENT
+END:VCALENDAR
+
+ICS;
+        $this->assertEquals($output, str_replace("\r", "", $result));
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/FifthTuesdayProblemTest.php b/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/FifthTuesdayProblemTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..c1546a06a3866c1776260c6f4afc46055b62645a
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/FifthTuesdayProblemTest.php
@@ -0,0 +1,54 @@
+<?php
+
+namespace Sabre\VObject\Recur\EventIterator;
+
+use Sabre\VObject\Recur;
+use Sabre\VObject\Reader;
+
+class FifthTuesdayProblemTest extends \PHPUnit_Framework_TestCase {
+
+    /**
+     * A pretty slow test. Had to be marked as 'medium' for phpunit to not die
+     * after 1 second. Would be good to optimize later.
+     *
+     * @medium
+     */
+    function testGetDTEnd() {
+
+        $ics = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//iCal 4.0.4//EN
+CALSCALE:GREGORIAN
+BEGIN:VEVENT
+TRANSP:OPAQUE
+DTEND;TZID=America/New_York:20070925T170000
+UID:uuid
+DTSTAMP:19700101T000000Z
+LOCATION:
+DESCRIPTION:
+STATUS:CONFIRMED
+SEQUENCE:18
+SUMMARY:Stuff
+DTSTART;TZID=America/New_York:20070925T160000
+CREATED:20071004T144642Z
+RRULE:FREQ=MONTHLY;INTERVAL=1;UNTIL=20071030T035959Z;BYDAY=5TU
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $vObject = Reader::read($ics);
+        $it = new Recur\EventIterator($vObject, (string)$vObject->VEVENT->UID);
+
+        while($it->valid()) {
+            $it->next();
+        }
+
+        // If we got here, it means we were successful. The bug that was in the
+        // system before would fail on the 5th tuesday of the month, if the 5th
+        // tuesday did not exist.
+        $this->assertTrue(true);
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/IncorrectExpandTest.php b/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/IncorrectExpandTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..6622dbd6417a9885de455d9c1fd760b753b5d4c3
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/IncorrectExpandTest.php
@@ -0,0 +1,64 @@
+<?php
+
+namespace Sabre\VObject\Recur\EventIterator;
+
+use
+    DateTime,
+    DateTimeZone,
+    Sabre\VObject\Reader;
+
+/**
+ * This is a unittest for Issue #53.
+ */
+class RecurrenceIteratorIncorrectExpandTest extends \PHPUnit_Framework_TestCase {
+
+    function testExpand() {
+
+        $input = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foo
+DTSTART:20130711T050000Z
+DTEND:20130711T053000Z
+RRULE:FREQ=DAILY;INTERVAL=1;COUNT=2
+END:VEVENT
+BEGIN:VEVENT
+UID:foo
+DTSTART:20130719T050000Z
+DTEND:20130719T053000Z
+RECURRENCE-ID:20130712T050000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $vcal = Reader::read($input);
+        $this->assertInstanceOf('Sabre\\VObject\\Component\\VCalendar', $vcal);
+
+        $vcal->expand(new DateTime('2011-01-01'), new DateTime('2014-01-01'));
+
+        $result = $vcal->serialize();
+
+        $output = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foo
+DTSTART:20130711T050000Z
+DTEND:20130711T053000Z
+RECURRENCE-ID:20130711T050000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:foo
+DTSTART:20130719T050000Z
+DTEND:20130719T053000Z
+RECURRENCE-ID:20130712T050000Z
+END:VEVENT
+END:VCALENDAR
+
+ICS;
+        $this->assertEquals($output, str_replace("\r", "", $result));
+    
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/InfiniteLoopProblemTest.php b/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/InfiniteLoopProblemTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..c4f115bca843a2d46b9de32b1c7126d8903d7880
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/InfiniteLoopProblemTest.php
@@ -0,0 +1,99 @@
+<?php
+
+namespace Sabre\VObject\Recur\EventIterator;
+
+use
+    DateTime,
+    DateTimeZone,
+    Sabre\VObject\Component\VCalendar,
+    Sabre\VObject\Recur;
+
+class EventIteratorInfiniteLoopProblemTest extends \PHPUnit_Framework_TestCase {
+
+    public function setUp() {
+
+        $this->vcal = new VCalendar();
+
+    }
+
+    /**
+     * This bug came from a Fruux customer. This would result in a never-ending
+     * request.
+     */
+    function testFastForwardTooFar() {
+
+        $ev = $this->vcal->createComponent('VEVENT');
+        $ev->UID = 'foobar';
+        $ev->DTSTART = '20090420T180000Z';
+        $ev->RRULE = 'FREQ=WEEKLY;BYDAY=MO;UNTIL=20090704T205959Z;INTERVAL=1';
+
+        $this->assertFalse($ev->isInTimeRange(new DateTime('2012-01-01 12:00:00'),new DateTime('3000-01-01 00:00:00')));
+
+    }
+
+    /**
+     * Different bug, also likely an infinite loop.
+     */
+    function testYearlyByMonthLoop() {
+
+        $ev = $this->vcal->createComponent('VEVENT');
+        $ev->UID = 'uuid';
+        $ev->DTSTART = '20120101T154500';
+        $ev->DTSTART['TZID'] = 'Europe/Berlin';
+        $ev->RRULE = 'FREQ=YEARLY;INTERVAL=1;UNTIL=20120203T225959Z;BYMONTH=2;BYSETPOS=1;BYDAY=SU,MO,TU,WE,TH,FR,SA';
+        $ev->DTEND = '20120101T164500';
+        $ev->DTEND['TZID'] = 'Europe/Berlin';
+
+        // This recurrence rule by itself is a yearly rule that should happen
+        // every february.
+        //
+        // The BYDAY part expands this to every day of the month, but the
+        // BYSETPOS limits this to only the 1st day of the month. Very crazy
+        // way to specify this, and could have certainly been a lot easier.
+        $this->vcal->add($ev);
+
+        $it = new Recur\EventIterator($this->vcal,'uuid');
+        $it->fastForward(new DateTime('2012-01-29 23:00:00', new DateTimeZone('UTC')));
+
+        $collect = array();
+
+        while($it->valid()) {
+            $collect[] = $it->getDTSTART();
+            if ($it->getDTSTART() > new DateTime('2013-02-05 22:59:59', new DateTimeZone('UTC'))) {
+                break;
+            }
+            $it->next();
+
+        }
+
+        $this->assertEquals(
+            array(new DateTime('2012-02-01 15:45:00', new DateTimeZone('Europe/Berlin'))),
+            $collect
+        );
+
+    }
+
+    /**
+     * Something, somewhere produced an ics with an interval set to 0. Because
+     * this means we increase the current day (or week, month) by 0, this also
+     * results in an infinite loop.
+     *
+     * @expectedException InvalidArgumentException
+     * @return void
+     */
+    function testZeroInterval() {
+
+        $ev = $this->vcal->createComponent('VEVENT');
+        $ev->UID = 'uuid';
+        $ev->DTSTART = '20120824T145700Z';
+        $ev->RRULE = 'FREQ=YEARLY;INTERVAL=0';
+        $this->vcal->add($ev);
+
+        $it = new Recur\EventIterator($this->vcal,'uuid');
+        $it->fastForward(new DateTime('2013-01-01 23:00:00', new DateTimeZone('UTC')));
+
+        // if we got this far.. it means we are no longer infinitely looping
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/Issue48Test.php b/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/Issue48Test.php
new file mode 100644
index 0000000000000000000000000000000000000000..435a10c7d2ab601ac1e4bff4280f9c8acdce27e2
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/Issue48Test.php
@@ -0,0 +1,49 @@
+<?php
+
+namespace Sabre\VObject;
+
+use
+    DateTime,
+    DateTimeZone;
+
+class Issue48Test extends \PHPUnit_Framework_TestCase {
+
+    function testExpand() {
+
+        $input = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foo
+DTEND;TZID=Europe/Moscow:20130710T120000
+DTSTART;TZID=Europe/Moscow:20130710T110000
+RRULE:FREQ=DAILY;UNTIL=20130712T195959Z
+END:VEVENT
+BEGIN:VEVENT
+UID:foo
+DTEND;TZID=Europe/Moscow:20130713T120000
+DTSTART;TZID=Europe/Moscow:20130713T110000
+RECURRENCE-ID;TZID=Europe/Moscow:20130711T110000
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $vcal = Reader::read($input);
+        $this->assertInstanceOf('Sabre\\VObject\\Component\\VCalendar', $vcal);
+
+        $it = new Recur\EventIterator($vcal, 'foo');
+
+        $result = iterator_to_array($it);
+
+        $tz = new DateTimeZone('Europe/Moscow');
+
+        $expected = array(
+            new DateTime('2013-07-10 11:00:00', $tz),
+            new DateTime('2013-07-12 11:00:00', $tz),
+            new DateTime('2013-07-13 11:00:00', $tz),
+        );
+
+        $this->assertEquals($expected, $result);
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/Issue50Test.php b/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/Issue50Test.php
new file mode 100644
index 0000000000000000000000000000000000000000..7a81295e53ce6e0d4cb4e7906688e83ca25e6318
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/Issue50Test.php
@@ -0,0 +1,128 @@
+<?php
+
+namespace Sabre\VObject;
+
+use
+    DateTime,
+    DateTimeZone;
+
+class Issue50Test extends \PHPUnit_Framework_TestCase {
+
+    function testExpand() {
+
+        $input = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN
+BEGIN:VTIMEZONE
+TZID:Europe/Brussels
+X-LIC-LOCATION:Europe/Brussels
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+CREATED:20130705T142510Z
+LAST-MODIFIED:20130715T132556Z
+DTSTAMP:20130715T132556Z
+UID:1aef0b27-3d92-4581-829a-11999dd36724
+SUMMARY:Werken
+RRULE:FREQ=DAILY;COUNT=5
+DTSTART;TZID=Europe/Brussels:20130715T090000
+DTEND;TZID=Europe/Brussels:20130715T170000
+LOCATION:Job
+DESCRIPTION:Vrij
+X-MOZ-GENERATION:9
+END:VEVENT
+BEGIN:VEVENT
+CREATED:20130715T081654Z
+LAST-MODIFIED:20130715T110931Z
+DTSTAMP:20130715T110931Z
+UID:1aef0b27-3d92-4581-829a-11999dd36724
+SUMMARY:Werken
+RECURRENCE-ID;TZID=Europe/Brussels:20130719T090000
+DTSTART;TZID=Europe/Brussels:20130719T070000
+DTEND;TZID=Europe/Brussels:20130719T150000
+SEQUENCE:1
+LOCATION:Job
+DESCRIPTION:Vrij
+X-MOZ-GENERATION:1
+END:VEVENT
+BEGIN:VEVENT
+CREATED:20130715T111654Z
+LAST-MODIFIED:20130715T132556Z
+DTSTAMP:20130715T132556Z
+UID:1aef0b27-3d92-4581-829a-11999dd36724
+SUMMARY:Werken
+RECURRENCE-ID;TZID=Europe/Brussels:20130716T090000
+DTSTART;TZID=Europe/Brussels:20130716T070000
+DTEND;TZID=Europe/Brussels:20130716T150000
+SEQUENCE:1
+LOCATION:Job
+X-MOZ-GENERATION:2
+END:VEVENT
+BEGIN:VEVENT
+CREATED:20130715T125942Z
+LAST-MODIFIED:20130715T130023Z
+DTSTAMP:20130715T130023Z
+UID:1aef0b27-3d92-4581-829a-11999dd36724
+SUMMARY:Werken
+RECURRENCE-ID;TZID=Europe/Brussels:20130717T090000
+DTSTART;TZID=Europe/Brussels:20130717T070000
+DTEND;TZID=Europe/Brussels:20130717T150000
+SEQUENCE:1
+LOCATION:Job
+X-MOZ-GENERATION:3
+END:VEVENT
+BEGIN:VEVENT
+CREATED:20130715T130024Z
+LAST-MODIFIED:20130715T130034Z
+DTSTAMP:20130715T130034Z
+UID:1aef0b27-3d92-4581-829a-11999dd36724
+SUMMARY:Werken
+RECURRENCE-ID;TZID=Europe/Brussels:20130718T090000
+DTSTART;TZID=Europe/Brussels:20130718T090000
+DTEND;TZID=Europe/Brussels:20130718T170000
+LOCATION:Job
+X-MOZ-GENERATION:5
+DESCRIPTION:Vrij
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $vcal = Reader::read($input);
+        $this->assertInstanceOf('Sabre\\VObject\\Component\\VCalendar', $vcal);
+
+        $it = new Recur\EventIterator($vcal, '1aef0b27-3d92-4581-829a-11999dd36724');
+
+        $result = array();
+        foreach($it as $instance) {
+
+            $result[] = $instance;
+
+        }
+
+        $tz = new DateTimeZone('Europe/Brussels');
+
+        $this->assertEquals(array(
+            new DateTime('2013-07-15 09:00:00', $tz),
+            new DateTime('2013-07-16 07:00:00', $tz),
+            new DateTime('2013-07-17 07:00:00', $tz),
+            new DateTime('2013-07-18 09:00:00', $tz),
+            new DateTime('2013-07-19 07:00:00', $tz),
+        ), $result);
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/MainTest.php b/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/MainTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..3ffe35bdd0f54c6f636c069fefa01c1db9c669c2
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/MainTest.php
@@ -0,0 +1,1427 @@
+<?php
+
+namespace Sabre\VObject\Recur\EventIterator;
+
+use DateTime;
+use DateTimeZone;
+use Sabre\VObject\Recur\EventIterator;
+use Sabre\VObject\Component\VCalendar;
+
+class MainTest extends \PHPUnit_Framework_TestCase {
+
+    function testValues() {
+
+        $vcal = new VCalendar();
+        $ev = $vcal->createComponent('VEVENT');
+        $ev->UID = 'bla';
+        $ev->RRULE = 'FREQ=DAILY;BYHOUR=10;BYMINUTE=5;BYSECOND=16;BYWEEKNO=32;BYYEARDAY=100,200';
+        $dtStart = $vcal->createProperty('DTSTART');
+        $dtStart->setDateTime(new DateTime('2011-10-07'));
+
+        $ev->add($dtStart);
+
+        $vcal->add($ev);
+
+        $it = new EventIterator($vcal,(string)$ev->uid);
+
+        $this->assertTrue($it->isInfinite());
+
+    }
+
+    /**
+     * @expectedException InvalidArgumentException
+     * @depends testValues
+     */
+    function testInvalidFreq() {
+
+        $vcal = new VCalendar();
+        $ev = $vcal->createComponent('VEVENT');
+        $ev->RRULE = 'FREQ=SMONTHLY;INTERVAL=3;UNTIL=20111025T000000Z';
+        $ev->UID = 'foo';
+        $dtStart = $vcal->createProperty('DTSTART');
+        $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC')));
+
+        $ev->add($dtStart);
+        $vcal->add($ev);
+
+        $it = new EventIterator($vcal,(string)$ev->uid);
+
+    }
+
+    /**
+     * @expectedException InvalidArgumentException
+     */
+    function testVCalendarNoUID() {
+
+        $vcal = new VCalendar();
+        $it = new EventIterator($vcal);
+
+    }
+
+    /**
+     * @expectedException InvalidArgumentException
+     */
+    function testVCalendarInvalidUID() {
+
+        $vcal = new VCalendar();
+        $it = new EventIterator($vcal,'foo');
+
+    }
+
+    /**
+     * @depends testValues
+     */
+    function testHourly() {
+
+        $vcal = new VCalendar();
+        $ev = $vcal->createComponent('VEVENT');
+
+        $ev->UID = 'bla';
+        $ev->RRULE = 'FREQ=HOURLY;INTERVAL=3;UNTIL=20111025T000000Z';
+        $dtStart = $vcal->createProperty('DTSTART');
+        $dtStart->setDateTime(new DateTime('2011-10-07 12:00:00', new DateTimeZone('UTC')));
+
+        $ev->add($dtStart);
+        $vcal->add($ev);
+
+        $it = new EventIterator($vcal,$ev->uid);
+
+        // Max is to prevent overflow
+        $max = 12;
+        $result = array();
+        foreach($it as $item) {
+
+            $result[] = $item;
+            $max--;
+
+            if (!$max) break;
+
+        }
+
+        $tz = new DateTimeZone('UTC');
+
+        $this->assertEquals(
+            array(
+                new DateTime('2011-10-07 12:00:00', $tz),
+                new DateTime('2011-10-07 15:00:00', $tz),
+                new DateTime('2011-10-07 18:00:00', $tz),
+                new DateTime('2011-10-07 21:00:00', $tz),
+                new DateTime('2011-10-08 00:00:00', $tz),
+                new DateTime('2011-10-08 03:00:00', $tz),
+                new DateTime('2011-10-08 06:00:00', $tz),
+                new DateTime('2011-10-08 09:00:00', $tz),
+                new DateTime('2011-10-08 12:00:00', $tz),
+                new DateTime('2011-10-08 15:00:00', $tz),
+                new DateTime('2011-10-08 18:00:00', $tz),
+                new DateTime('2011-10-08 21:00:00', $tz),
+            ),
+            $result
+        );
+
+    }
+
+    /**
+     * @depends testValues
+     */
+    function testDaily() {
+
+        $vcal = new VCalendar();
+        $ev = $vcal->createComponent('VEVENT');
+
+        $ev->UID = 'bla';
+        $ev->RRULE = 'FREQ=DAILY;INTERVAL=3;UNTIL=20111025T000000Z';
+        $dtStart = $vcal->createProperty('DTSTART');
+        $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC')));
+
+        $ev->add($dtStart);
+
+        $vcal->add($ev);
+
+        $it = new EventIterator($vcal,$ev->uid);
+
+        // Max is to prevent overflow
+        $max = 12;
+        $result = array();
+        foreach($it as $item) {
+
+            $result[] = $item;
+            $max--;
+
+            if (!$max) break;
+
+        }
+
+        $tz = new DateTimeZone('UTC');
+
+        $this->assertEquals(
+            array(
+                new DateTime('2011-10-07', $tz),
+                new DateTime('2011-10-10', $tz),
+                new DateTime('2011-10-13', $tz),
+                new DateTime('2011-10-16', $tz),
+                new DateTime('2011-10-19', $tz),
+                new DateTime('2011-10-22', $tz),
+                new DateTime('2011-10-25', $tz),
+            ),
+            $result
+        );
+
+    }
+
+    /**
+     * @depends testValues
+     */
+    function testNoRRULE() {
+
+        $vcal = new VCalendar();
+        $ev = $vcal->createComponent('VEVENT');
+
+        $ev->UID = 'bla';
+        $dtStart = $vcal->createProperty('DTSTART');
+        $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC')));
+
+        $ev->add($dtStart);
+
+        $vcal->add($ev);
+
+        $it = new EventIterator($vcal,$ev->uid);
+
+        // Max is to prevent overflow
+        $max = 12;
+        $result = array();
+        foreach($it as $item) {
+
+            $result[] = $item;
+            $max--;
+
+            if (!$max) break;
+
+        }
+
+        $tz = new DateTimeZone('UTC');
+
+        $this->assertEquals(
+            array(
+                new DateTime('2011-10-07', $tz),
+            ),
+            $result
+        );
+
+    }
+
+    /**
+     * @depends testValues
+     */
+    function testDailyByDayByHour() {
+
+        $vcal = new VCalendar();
+        $ev = $vcal->createComponent('VEVENT');
+
+        $ev->UID = 'bla';
+        $ev->RRULE = 'FREQ=DAILY;BYDAY=SA,SU;BYHOUR=6,7';
+        $dtStart = $vcal->createProperty('DTSTART');
+        $dtStart->setDateTime(new DateTime('2011-10-08 06:00:00', new DateTimeZone('UTC')));
+
+        $ev->add($dtStart);
+
+        $vcal->add($ev);
+
+        $it = new EventIterator($vcal,(string)$ev->uid);
+
+        // Grabbing the next 12 items
+        $max = 12;
+        $result = array();
+        foreach($it as $item) {
+
+            $result[] = $item;
+            $max--;
+
+            if (!$max) break;
+
+        }
+
+        $tz = new DateTimeZone('UTC');
+
+        $this->assertEquals(
+            array(
+                new datetime('2011-10-08 06:00:00', $tz),
+                new datetime('2011-10-08 07:00:00', $tz),
+                new datetime('2011-10-09 06:00:00', $tz),
+                new datetime('2011-10-09 07:00:00', $tz),
+                new datetime('2011-10-15 06:00:00', $tz),
+                new datetime('2011-10-15 07:00:00', $tz),
+                new datetime('2011-10-16 06:00:00', $tz),
+                new datetime('2011-10-16 07:00:00', $tz),
+                new datetime('2011-10-22 06:00:00', $tz),
+                new datetime('2011-10-22 07:00:00', $tz),
+                new datetime('2011-10-23 06:00:00', $tz),
+                new datetime('2011-10-23 07:00:00', $tz),
+            ),
+            $result
+        );
+
+    }
+
+    /**
+     * @depends testValues
+     */
+    function testDailyByHour() {
+
+        $vcal = new VCalendar();
+        $ev = $vcal->createComponent('VEVENT');
+
+        $ev->UID = 'bla';
+        $ev->RRULE = 'FREQ=DAILY;INTERVAL=2;BYHOUR=10,11,12,13,14,15';
+        $dtStart = $vcal->createProperty('DTSTART');
+        $dtStart->setDateTime(new DateTime('2012-10-11 12:00:00', new DateTimeZone('UTC')));
+
+        $ev->add($dtStart);
+
+        $vcal->add($ev);
+
+        $it = new EventIterator($vcal,(string)$ev->uid);
+
+        // Grabbing the next 12 items
+        $max = 12;
+        $result = array();
+        foreach($it as $item) {
+
+            $result[] = $item;
+            $max--;
+
+            if (!$max) break;
+
+        }
+
+        $tz = new DateTimeZone('UTC');
+
+        $this->assertEquals(
+            array(
+                new datetime('2012-10-11 12:00:00', $tz),
+                new datetime('2012-10-11 13:00:00', $tz),
+                new datetime('2012-10-11 14:00:00', $tz),
+                new datetime('2012-10-11 15:00:00', $tz),
+                new datetime('2012-10-13 10:00:00', $tz),
+                new datetime('2012-10-13 11:00:00', $tz),
+                new datetime('2012-10-13 12:00:00', $tz),
+                new datetime('2012-10-13 13:00:00', $tz),
+                new datetime('2012-10-13 14:00:00', $tz),
+                new datetime('2012-10-13 15:00:00', $tz),
+                new datetime('2012-10-15 10:00:00', $tz),
+                new datetime('2012-10-15 11:00:00', $tz),
+            ),
+            $result
+        );
+
+    }
+
+    /**
+     * @depends testValues
+     */
+    function testDailyByDay() {
+
+        $vcal = new VCalendar();
+        $ev = $vcal->createComponent('VEVENT');
+
+        $ev->UID = 'bla';
+        $ev->RRULE = 'FREQ=DAILY;INTERVAL=2;BYDAY=TU,WE,FR';
+        $dtStart = $vcal->createProperty('DTSTART');
+        $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC')));
+
+        $ev->add($dtStart);
+
+        $vcal->add($ev);
+
+        $it = new EventIterator($vcal,(string)$ev->uid);
+
+        // Grabbing the next 12 items
+        $max = 12;
+        $result = array();
+        foreach($it as $item) {
+
+            $result[] = $item;
+            $max--;
+
+            if (!$max) break;
+
+        }
+
+        $tz = new DateTimeZone('UTC');
+
+        $this->assertEquals(
+            array(
+                new DateTime('2011-10-07', $tz),
+                new DateTime('2011-10-11', $tz),
+                new DateTime('2011-10-19', $tz),
+                new DateTime('2011-10-21', $tz),
+                new DateTime('2011-10-25', $tz),
+                new DateTime('2011-11-02', $tz),
+                new DateTime('2011-11-04', $tz),
+                new DateTime('2011-11-08', $tz),
+                new DateTime('2011-11-16', $tz),
+                new DateTime('2011-11-18', $tz),
+                new DateTime('2011-11-22', $tz),
+                new DateTime('2011-11-30', $tz),
+            ),
+            $result
+        );
+
+    }
+
+    /**
+     * @depends testValues
+     */
+    function testWeekly() {
+
+        $vcal = new VCalendar();
+        $ev = $vcal->createComponent('VEVENT');
+
+        $ev->UID = 'bla';
+        $ev->RRULE = 'FREQ=WEEKLY;INTERVAL=2;COUNT=10';
+        $dtStart = $vcal->createProperty('DTSTART');
+        $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC')));
+
+        $ev->add($dtStart);
+
+        $vcal->add($ev);
+
+        $it = new EventIterator($vcal,(string)$ev->uid);
+
+        // Max is to prevent overflow
+        $max = 12;
+        $result = array();
+        foreach($it as $item) {
+
+            $result[] = $item;
+            $max--;
+
+            if (!$max) break;
+
+        }
+
+        $tz = new DateTimeZone('UTC');
+
+        $this->assertEquals(
+            array(
+                new DateTime('2011-10-07', $tz),
+                new DateTime('2011-10-21', $tz),
+                new DateTime('2011-11-04', $tz),
+                new DateTime('2011-11-18', $tz),
+                new DateTime('2011-12-02', $tz),
+                new DateTime('2011-12-16', $tz),
+                new DateTime('2011-12-30', $tz),
+                new DateTime('2012-01-13', $tz),
+                new DateTime('2012-01-27', $tz),
+                new DateTime('2012-02-10', $tz),
+            ),
+            $result
+        );
+
+    }
+
+    /**
+     * @depends testValues
+     */
+    function testWeeklyByDayByHour() {
+
+        $vcal = new VCalendar();
+        $ev = $vcal->createComponent('VEVENT');
+
+        $ev->UID = 'bla';
+        $ev->RRULE = 'FREQ=WEEKLY;INTERVAL=2;BYDAY=TU,WE,FR;WKST=MO;BYHOUR=8,9,10';
+        $dtStart = $vcal->createProperty('DTSTART');
+        $dtStart->setDateTime(new DateTime('2011-10-07 08:00:00', new DateTimeZone('UTC')));
+
+        $ev->add($dtStart);
+
+        $vcal->add($ev);
+
+        $it = new EventIterator($vcal,(string)$ev->uid);
+
+        // Grabbing the next 12 items
+        $max = 15;
+        $result = array();
+        foreach($it as $item) {
+
+            $result[] = $item;
+            $max--;
+
+            if (!$max) break;
+
+        }
+
+        $tz = new DateTimeZone('UTC');
+
+        $this->assertEquals(
+            array(
+                new DateTime('2011-10-07 08:00:00', $tz),
+                new DateTime('2011-10-07 09:00:00', $tz),
+                new DateTime('2011-10-07 10:00:00', $tz),
+                new DateTime('2011-10-18 08:00:00', $tz),
+                new DateTime('2011-10-18 09:00:00', $tz),
+                new DateTime('2011-10-18 10:00:00', $tz),
+                new DateTime('2011-10-19 08:00:00', $tz),
+                new DateTime('2011-10-19 09:00:00', $tz),
+                new DateTime('2011-10-19 10:00:00', $tz),
+                new DateTime('2011-10-21 08:00:00', $tz),
+                new DateTime('2011-10-21 09:00:00', $tz),
+                new DateTime('2011-10-21 10:00:00', $tz),
+                new DateTime('2011-11-01 08:00:00', $tz),
+                new DateTime('2011-11-01 09:00:00', $tz),
+                new DateTime('2011-11-01 10:00:00', $tz),
+            ),
+            $result
+        );
+
+    }
+
+    /**
+     * @depends testValues
+     */
+    function testWeeklyByDaySpecificHour() {
+
+        $vcal = new VCalendar();
+        $ev = $vcal->createComponent('VEVENT');
+
+        $ev->UID = 'bla';
+        $ev->RRULE = 'FREQ=WEEKLY;INTERVAL=2;BYDAY=TU,WE,FR;WKST=SU';
+        $dtStart = $vcal->createProperty('DTSTART');
+        $dtStart->setDateTime(new DateTime('2011-10-07 18:00:00', new DateTimeZone('UTC')));
+
+        $ev->add($dtStart);
+
+        $vcal->add($ev);
+
+        $it = new EventIterator($vcal,(string)$ev->uid);
+
+        // Grabbing the next 12 items
+        $max = 12;
+        $result = array();
+        foreach($it as $item) {
+
+            $result[] = $item;
+            $max--;
+
+            if (!$max) break;
+
+        }
+
+        $tz = new DateTimeZone('UTC');
+
+        $this->assertEquals(
+            array(
+                new DateTime('2011-10-07 18:00:00', $tz),
+                new DateTime('2011-10-18 18:00:00', $tz),
+                new DateTime('2011-10-19 18:00:00', $tz),
+                new DateTime('2011-10-21 18:00:00', $tz),
+                new DateTime('2011-11-01 18:00:00', $tz),
+                new DateTime('2011-11-02 18:00:00', $tz),
+                new DateTime('2011-11-04 18:00:00', $tz),
+                new DateTime('2011-11-15 18:00:00', $tz),
+                new DateTime('2011-11-16 18:00:00', $tz),
+                new DateTime('2011-11-18 18:00:00', $tz),
+                new DateTime('2011-11-29 18:00:00', $tz),
+                new DateTime('2011-11-30 18:00:00', $tz),
+            ),
+            $result
+        );
+
+    }
+
+    /**
+     * @depends testValues
+     */
+    function testWeeklyByDay() {
+
+        $vcal = new VCalendar();
+        $ev = $vcal->createComponent('VEVENT');
+
+        $ev->UID = 'bla';
+        $ev->RRULE = 'FREQ=WEEKLY;INTERVAL=2;BYDAY=TU,WE,FR;WKST=SU';
+        $dtStart = $vcal->createProperty('DTSTART');
+        $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC')));
+
+        $ev->add($dtStart);
+
+        $vcal->add($ev);
+
+        $it = new EventIterator($vcal,(string)$ev->uid);
+
+        // Grabbing the next 12 items
+        $max = 12;
+        $result = array();
+        foreach($it as $item) {
+
+            $result[] = $item;
+            $max--;
+
+            if (!$max) break;
+
+        }
+
+        $tz = new DateTimeZone('UTC');
+
+        $this->assertEquals(
+            array(
+                new DateTime('2011-10-07', $tz),
+                new DateTime('2011-10-18', $tz),
+                new DateTime('2011-10-19', $tz),
+                new DateTime('2011-10-21', $tz),
+                new DateTime('2011-11-01', $tz),
+                new DateTime('2011-11-02', $tz),
+                new DateTime('2011-11-04', $tz),
+                new DateTime('2011-11-15', $tz),
+                new DateTime('2011-11-16', $tz),
+                new DateTime('2011-11-18', $tz),
+                new DateTime('2011-11-29', $tz),
+                new DateTime('2011-11-30', $tz),
+            ),
+            $result
+        );
+
+    }
+
+    /**
+     * @depends testValues
+     */
+    function testMonthly() {
+
+        $vcal = new VCalendar();
+        $ev = $vcal->createComponent('VEVENT');
+
+        $ev->UID = 'bla';
+        $ev->RRULE = 'FREQ=MONTHLY;INTERVAL=3;COUNT=5';
+        $dtStart = $vcal->createProperty('DTSTART');
+        $dtStart->setDateTime(new DateTime('2011-12-05', new DateTimeZone('UTC')));
+
+        $ev->add($dtStart);
+
+        $vcal->add($ev);
+
+        $it = new EventIterator($vcal,(string)$ev->uid);
+
+        $max = 14;
+        $result = array();
+        foreach($it as $item) {
+
+            $result[] = $item;
+            $max--;
+
+            if (!$max) break;
+
+        }
+
+        $tz = new DateTimeZone('UTC');
+
+        $this->assertEquals(
+            array(
+                new DateTime('2011-12-05', $tz),
+                new DateTime('2012-03-05', $tz),
+                new DateTime('2012-06-05', $tz),
+                new DateTime('2012-09-05', $tz),
+                new DateTime('2012-12-05', $tz),
+            ),
+            $result
+        );
+
+
+    }
+
+    /**
+     * @depends testValues
+     */
+    function testMonthlyEndOfMonth() {
+
+        $vcal = new VCalendar();
+        $ev = $vcal->createComponent('VEVENT');
+
+        $ev->UID = 'bla';
+        $ev->RRULE = 'FREQ=MONTHLY;INTERVAL=2;COUNT=12';
+        $dtStart = $vcal->createProperty('DTSTART');
+        $dtStart->setDateTime(new DateTime('2011-12-31', new DateTimeZone('UTC')));
+
+        $ev->add($dtStart);
+
+        $vcal->add($ev);
+
+        $it = new EventIterator($vcal,(string)$ev->uid);
+
+        $max = 14;
+        $result = array();
+        foreach($it as $item) {
+
+            $result[] = $item;
+            $max--;
+
+            if (!$max) break;
+
+        }
+
+        $tz = new DateTimeZone('UTC');
+
+        $this->assertEquals(
+            array(
+                new DateTime('2011-12-31', $tz),
+                new DateTime('2012-08-31', $tz),
+                new DateTime('2012-10-31', $tz),
+                new DateTime('2012-12-31', $tz),
+                new DateTime('2013-08-31', $tz),
+                new DateTime('2013-10-31', $tz),
+                new DateTime('2013-12-31', $tz),
+                new DateTime('2014-08-31', $tz),
+                new DateTime('2014-10-31', $tz),
+                new DateTime('2014-12-31', $tz),
+                new DateTime('2015-08-31', $tz),
+                new DateTime('2015-10-31', $tz),
+            ),
+            $result
+        );
+
+
+    }
+
+    /**
+     * @depends testValues
+     */
+    function testMonthlyByMonthDay() {
+
+        $vcal = new VCalendar();
+        $ev = $vcal->createComponent('VEVENT');
+
+        $ev->UID = 'bla';
+        $ev->RRULE = 'FREQ=MONTHLY;INTERVAL=5;COUNT=9;BYMONTHDAY=1,31,-7';
+        $dtStart = $vcal->createProperty('DTSTART');
+        $dtStart->setDateTime(new DateTime('2011-01-01', new DateTimeZone('UTC')));
+
+        $ev->add($dtStart);
+
+        $vcal->add($ev);
+
+        $it = new EventIterator($vcal,(string)$ev->uid);
+
+        $max = 14;
+        $result = array();
+        foreach($it as $item) {
+
+            $result[] = $item;
+            $max--;
+
+            if (!$max) break;
+
+        }
+
+        $tz = new DateTimeZone('UTC');
+
+        $this->assertEquals(
+            array(
+                new DateTime('2011-01-01', $tz),
+                new DateTime('2011-01-25', $tz),
+                new DateTime('2011-01-31', $tz),
+                new DateTime('2011-06-01', $tz),
+                new DateTime('2011-06-24', $tz),
+                new DateTime('2011-11-01', $tz),
+                new DateTime('2011-11-24', $tz),
+                new DateTime('2012-04-01', $tz),
+                new DateTime('2012-04-24', $tz),
+            ),
+            $result
+        );
+
+    }
+
+    /**
+     * A pretty slow test. Had to be marked as 'medium' for phpunit to not die
+     * after 1 second. Would be good to optimize later.
+     *
+     * @depends testValues
+     * @medium
+     */
+    function testMonthlyByDay() {
+
+        $vcal = new VCalendar();
+        $ev = $vcal->createComponent('VEVENT');
+
+        $ev->UID = 'bla';
+        $ev->RRULE = 'FREQ=MONTHLY;INTERVAL=2;COUNT=16;BYDAY=MO,-2TU,+1WE,3TH';
+        $dtStart = $vcal->createProperty('DTSTART');
+        $dtStart->setDateTime(new DateTime('2011-01-03', new DateTimeZone('UTC')));
+
+        $ev->add($dtStart);
+
+        $vcal->add($ev);
+
+        $it = new EventIterator($vcal,(string)$ev->uid);
+
+        $max = 20;
+        $result = array();
+        foreach($it as $k=>$item) {
+
+            $result[] = $item;
+            $max--;
+
+            if (!$max) break;
+
+        }
+
+        $tz = new DateTimeZone('UTC');
+
+        $this->assertEquals(
+            array(
+                new DateTime('2011-01-03', $tz),
+                new DateTime('2011-01-05', $tz),
+                new DateTime('2011-01-10', $tz),
+                new DateTime('2011-01-17', $tz),
+                new DateTime('2011-01-18', $tz),
+                new DateTime('2011-01-20', $tz),
+                new DateTime('2011-01-24', $tz),
+                new DateTime('2011-01-31', $tz),
+                new DateTime('2011-03-02', $tz),
+                new DateTime('2011-03-07', $tz),
+                new DateTime('2011-03-14', $tz),
+                new DateTime('2011-03-17', $tz),
+                new DateTime('2011-03-21', $tz),
+                new DateTime('2011-03-22', $tz),
+                new DateTime('2011-03-28', $tz),
+                new DateTime('2011-05-02', $tz),
+            ),
+            $result
+        );
+
+    }
+
+    /**
+     * @depends testValues
+     */
+    function testMonthlyByDayByMonthDay() {
+
+        $vcal = new VCalendar();
+        $ev = $vcal->createComponent('VEVENT');
+
+        $ev->UID = 'bla';
+        $ev->RRULE = 'FREQ=MONTHLY;COUNT=10;BYDAY=MO;BYMONTHDAY=1';
+        $dtStart = $vcal->createProperty('DTSTART');
+        $dtStart->setDateTime(new DateTime('2011-08-01', new DateTimeZone('UTC')));
+
+        $ev->add($dtStart);
+
+        $vcal->add($ev);
+
+        $it = new EventIterator($vcal,(string)$ev->uid);
+
+        $max = 20;
+        $result = array();
+        foreach($it as $k=>$item) {
+
+            $result[] = $item;
+            $max--;
+
+            if (!$max) break;
+
+        }
+
+        $tz = new DateTimeZone('UTC');
+
+        $this->assertEquals(
+            array(
+                new DateTime('2011-08-01', $tz),
+                new DateTime('2012-10-01', $tz),
+                new DateTime('2013-04-01', $tz),
+                new DateTime('2013-07-01', $tz),
+                new DateTime('2014-09-01', $tz),
+                new DateTime('2014-12-01', $tz),
+                new DateTime('2015-06-01', $tz),
+                new DateTime('2016-02-01', $tz),
+                new DateTime('2016-08-01', $tz),
+                new DateTime('2017-05-01', $tz),
+            ),
+            $result
+        );
+
+    }
+
+    /**
+     * @depends testValues
+     */
+    function testMonthlyByDayBySetPos() {
+
+        $vcal = new VCalendar();
+        $ev = $vcal->createComponent('VEVENT');
+
+        $ev->UID = 'bla';
+        $ev->RRULE = 'FREQ=MONTHLY;COUNT=10;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=1,-1';
+        $dtStart = $vcal->createProperty('DTSTART');
+        $dtStart->setDateTime(new DateTime('2011-01-03', new DateTimeZone('UTC')));
+
+        $ev->add($dtStart);
+
+        $vcal->add($ev);
+
+        $it = new EventIterator($vcal,(string)$ev->uid);
+
+        $max = 20;
+        $result = array();
+        foreach($it as $k=>$item) {
+
+            $result[] = $item;
+            $max--;
+
+            if (!$max) break;
+
+        }
+
+        $tz = new DateTimeZone('UTC');
+
+        $this->assertEquals(
+            array(
+                new DateTime('2011-01-03', $tz),
+                new DateTime('2011-01-31', $tz),
+                new DateTime('2011-02-01', $tz),
+                new DateTime('2011-02-28', $tz),
+                new DateTime('2011-03-01', $tz),
+                new DateTime('2011-03-31', $tz),
+                new DateTime('2011-04-01', $tz),
+                new DateTime('2011-04-29', $tz),
+                new DateTime('2011-05-02', $tz),
+                new DateTime('2011-05-31', $tz),
+            ),
+            $result
+        );
+
+    }
+
+    /**
+     * @depends testValues
+     */
+    function testYearly() {
+
+        $vcal = new VCalendar();
+        $ev = $vcal->createComponent('VEVENT');
+
+        $ev->UID = 'bla';
+        $ev->RRULE = 'FREQ=YEARLY;COUNT=10;INTERVAL=3';
+        $dtStart = $vcal->createProperty('DTSTART');
+        $dtStart->setDateTime(new DateTime('2011-01-01', new DateTimeZone('UTC')));
+
+        $ev->add($dtStart);
+
+        $vcal->add($ev);
+
+        $it = new EventIterator($vcal,(string)$ev->uid);
+
+        $max = 20;
+        $result = array();
+        foreach($it as $k=>$item) {
+
+            $result[] = $item;
+            $max--;
+
+            if (!$max) break;
+
+        }
+
+        $tz = new DateTimeZone('UTC');
+
+        $this->assertEquals(
+            array(
+                new DateTime('2011-01-01', $tz),
+                new DateTime('2014-01-01', $tz),
+                new DateTime('2017-01-01', $tz),
+                new DateTime('2020-01-01', $tz),
+                new DateTime('2023-01-01', $tz),
+                new DateTime('2026-01-01', $tz),
+                new DateTime('2029-01-01', $tz),
+                new DateTime('2032-01-01', $tz),
+                new DateTime('2035-01-01', $tz),
+                new DateTime('2038-01-01', $tz),
+            ),
+            $result
+        );
+
+    }
+
+    /**
+     * @depends testValues
+     */
+    function testYearlyLeapYear() {
+
+        $vcal = new VCalendar();
+        $ev = $vcal->createComponent('VEVENT');
+
+        $ev->UID = 'bla';
+        $ev->RRULE = 'FREQ=YEARLY;COUNT=3';
+        $dtStart = $vcal->createProperty('DTSTART');
+        $dtStart->setDateTime(new DateTime('2012-02-29', new DateTimeZone('UTC')));
+
+        $ev->add($dtStart);
+
+        $vcal->add($ev);
+
+        $it = new EventIterator($vcal,(string)$ev->uid);
+
+        $max = 20;
+        $result = array();
+        foreach($it as $k=>$item) {
+
+            $result[] = $item;
+            $max--;
+
+            if (!$max) break;
+
+        }
+
+        $tz = new DateTimeZone('UTC');
+
+        $this->assertEquals(
+            array(
+                new DateTime('2012-02-29', $tz),
+                new DateTime('2016-02-29', $tz),
+                new DateTime('2020-02-29', $tz),
+            ),
+            $result
+        );
+
+    }
+
+    /**
+     * @depends testValues
+     */
+    function testYearlyByMonth() {
+
+        $vcal = new VCalendar();
+        $ev = $vcal->createComponent('VEVENT');
+
+        $ev->UID = 'bla';
+        $ev->RRULE = 'FREQ=YEARLY;COUNT=8;INTERVAL=4;BYMONTH=4,10';
+        $dtStart = $vcal->createProperty('DTSTART');
+        $dtStart->setDateTime(new DateTime('2011-04-07', new DateTimeZone('UTC')));
+
+        $ev->add($dtStart);
+
+        $vcal->add($ev);
+
+        $it = new EventIterator($vcal,(string)$ev->uid);
+
+        $max = 20;
+        $result = array();
+        foreach($it as $k=>$item) {
+
+            $result[] = $item;
+            $max--;
+
+            if (!$max) break;
+
+        }
+
+        $tz = new DateTimeZone('UTC');
+
+        $this->assertEquals(
+            array(
+                new DateTime('2011-04-07', $tz),
+                new DateTime('2011-10-07', $tz),
+                new DateTime('2015-04-07', $tz),
+                new DateTime('2015-10-07', $tz),
+                new DateTime('2019-04-07', $tz),
+                new DateTime('2019-10-07', $tz),
+                new DateTime('2023-04-07', $tz),
+                new DateTime('2023-10-07', $tz),
+            ),
+            $result
+        );
+
+    }
+
+    /**
+     * @depends testValues
+     */
+    function testYearlyByMonthByDay() {
+
+        $vcal = new VCalendar();
+        $ev = $vcal->createComponent('VEVENT');
+
+        $ev->UID = 'bla';
+        $ev->RRULE = 'FREQ=YEARLY;COUNT=8;INTERVAL=5;BYMONTH=4,10;BYDAY=1MO,-1SU';
+        $dtStart = $vcal->createProperty('DTSTART');
+        $dtStart->setDateTime(new DateTime('2011-04-04', new DateTimeZone('UTC')));
+
+        $ev->add($dtStart);
+
+        $vcal->add($ev);
+
+        $it = new EventIterator($vcal,(string)$ev->uid);
+
+        $max = 20;
+        $result = array();
+        foreach($it as $k=>$item) {
+
+            $result[] = $item;
+            $max--;
+
+            if (!$max) break;
+
+        }
+
+        $tz = new DateTimeZone('UTC');
+
+        $this->assertEquals(
+            array(
+                new DateTime('2011-04-04', $tz),
+                new DateTime('2011-04-24', $tz),
+                new DateTime('2011-10-03', $tz),
+                new DateTime('2011-10-30', $tz),
+                new DateTime('2016-04-04', $tz),
+                new DateTime('2016-04-24', $tz),
+                new DateTime('2016-10-03', $tz),
+                new DateTime('2016-10-30', $tz),
+            ),
+            $result
+        );
+
+    }
+
+    /**
+     * @depends testValues
+     */
+    function testFastForward() {
+
+        $vcal = new VCalendar();
+        $ev = $vcal->createComponent('VEVENT');
+
+        $ev->UID = 'bla';
+        $ev->RRULE = 'FREQ=YEARLY;COUNT=8;INTERVAL=5;BYMONTH=4,10;BYDAY=1MO,-1SU';
+        $dtStart = $vcal->createProperty('DTSTART');
+        $dtStart->setDateTime(new DateTime('2011-04-04', new DateTimeZone('UTC')));
+
+        $ev->add($dtStart);
+
+        $vcal->add($ev);
+
+        $it = new EventIterator($vcal,(string)$ev->uid);
+
+        // The idea is that we're fast-forwarding too far in the future, so
+        // there will be no results left.
+        $it->fastForward(new DateTime('2020-05-05', new DateTimeZone('UTC')));
+
+        $max = 20;
+        $result = array();
+        while($item = $it->current()) {
+
+            $result[] = $item;
+            $max--;
+
+            if (!$max) break;
+            $it->next();
+
+        }
+
+        $tz = new DateTimeZone('UTC');
+        $this->assertEquals(array(), $result);
+
+    }
+
+    /**
+     * @depends testValues
+     */
+    function testComplexExclusions() {
+
+        $vcal = new VCalendar();
+        $ev = $vcal->createComponent('VEVENT');
+
+        $ev->UID = 'bla';
+        $ev->RRULE = 'FREQ=YEARLY;COUNT=10';
+        $dtStart = $vcal->createProperty('DTSTART');
+
+        $tz = new DateTimeZone('Canada/Eastern');
+        $dtStart->setDateTime(new DateTime('2011-01-01 13:50:20', $tz));
+
+        $exDate1 = $vcal->createProperty('EXDATE');
+        $exDate1->setDateTimes(array(new DateTime('2012-01-01 13:50:20', $tz), new DateTime('2014-01-01 13:50:20', $tz)));
+        $exDate2 = $vcal->createProperty('EXDATE');
+        $exDate2->setDateTimes(array(new DateTime('2016-01-01 13:50:20', $tz)));
+
+        $ev->add($dtStart);
+        $ev->add($exDate1);
+        $ev->add($exDate2);
+
+        $vcal->add($ev);
+
+        $it = new EventIterator($vcal,(string)$ev->uid);
+
+        $max = 20;
+        $result = array();
+        foreach($it as $k=>$item) {
+
+            $result[] = $item;
+            $max--;
+
+            if (!$max) break;
+
+        }
+
+        $this->assertEquals(
+            array(
+                new DateTime('2011-01-01 13:50:20', $tz),
+                new DateTime('2013-01-01 13:50:20', $tz),
+                new DateTime('2015-01-01 13:50:20', $tz),
+                new DateTime('2017-01-01 13:50:20', $tz),
+                new DateTime('2018-01-01 13:50:20', $tz),
+                new DateTime('2019-01-01 13:50:20', $tz),
+                new DateTime('2020-01-01 13:50:20', $tz),
+            ),
+            $result
+        );
+
+    }
+
+    /**
+     * @depends testValues
+     */
+    function testOverridenEvent() {
+
+        $vcal = new VCalendar();
+
+        $ev1 = $vcal->createComponent('VEVENT');
+        $ev1->UID = 'overridden';
+        $ev1->RRULE = 'FREQ=DAILY;COUNT=10';
+        $ev1->DTSTART = '20120107T120000Z';
+        $ev1->SUMMARY = 'baseEvent';
+
+        $vcal->add($ev1);
+
+        // ev2 overrides an event, and puts it on 2pm instead.
+        $ev2 = $vcal->createComponent('VEVENT');
+        $ev2->UID = 'overridden';
+        $ev2->{'RECURRENCE-ID'} = '20120110T120000Z';
+        $ev2->DTSTART = '20120110T140000Z';
+        $ev2->SUMMARY = 'Event 2';
+
+        $vcal->add($ev2);
+
+        // ev3 overrides an event, and puts it 2 days and 2 hours later
+        $ev3 = $vcal->createComponent('VEVENT');
+        $ev3->UID = 'overridden';
+        $ev3->{'RECURRENCE-ID'} = '20120113T120000Z';
+        $ev3->DTSTART = '20120115T140000Z';
+        $ev3->SUMMARY = 'Event 3';
+
+        $vcal->add($ev3);
+
+        $it = new EventIterator($vcal,'overridden');
+
+        $dates = array();
+        $summaries = array();
+        while($it->valid()) {
+
+            $dates[] = $it->getDTStart();
+            $summaries[] = (string)$it->getEventObject()->SUMMARY;
+            $it->next();
+
+        }
+
+        $tz = new DateTimeZone('UTC');
+        $this->assertEquals(array(
+            new DateTime('2012-01-07 12:00:00',$tz),
+            new DateTime('2012-01-08 12:00:00',$tz),
+            new DateTime('2012-01-09 12:00:00',$tz),
+            new DateTime('2012-01-10 14:00:00',$tz),
+            new DateTime('2012-01-11 12:00:00',$tz),
+            new DateTime('2012-01-12 12:00:00',$tz),
+            new DateTime('2012-01-14 12:00:00',$tz),
+            new DateTime('2012-01-15 12:00:00',$tz),
+            new DateTime('2012-01-15 14:00:00',$tz),
+            new DateTime('2012-01-16 12:00:00',$tz),
+        ), $dates);
+
+        $this->assertEquals(array(
+            'baseEvent',
+            'baseEvent',
+            'baseEvent',
+            'Event 2',
+            'baseEvent',
+            'baseEvent',
+            'baseEvent',
+            'baseEvent',
+            'Event 3',
+            'baseEvent',
+        ), $summaries);
+
+    }
+
+    /**
+     * @depends testValues
+     */
+    function testOverridenEvent2() {
+
+        $vcal = new VCalendar();
+
+        $ev1 = $vcal->createComponent('VEVENT');
+        $ev1->UID = 'overridden';
+        $ev1->RRULE = 'FREQ=WEEKLY;COUNT=3';
+        $ev1->DTSTART = '20120112T120000Z';
+        $ev1->SUMMARY = 'baseEvent';
+
+        $vcal->add($ev1);
+
+        // ev2 overrides an event, and puts it 6 days earlier instead.
+        $ev2 = $vcal->createComponent('VEVENT');
+        $ev2->UID = 'overridden';
+        $ev2->{'RECURRENCE-ID'} = '20120119T120000Z';
+        $ev2->DTSTART = '20120113T120000Z';
+        $ev2->SUMMARY = 'Override!';
+
+        $vcal->add($ev2);
+
+        $it = new EventIterator($vcal,'overridden');
+
+        $dates = array();
+        $summaries = array();
+        while($it->valid()) {
+
+            $dates[] = $it->getDTStart();
+            $summaries[] = (string)$it->getEventObject()->SUMMARY;
+            $it->next();
+
+        }
+
+        $tz = new DateTimeZone('UTC');
+        $this->assertEquals(array(
+            new DateTime('2012-01-12 12:00:00',$tz),
+            new DateTime('2012-01-13 12:00:00',$tz),
+            new DateTime('2012-01-26 12:00:00',$tz),
+
+        ), $dates);
+
+        $this->assertEquals(array(
+            'baseEvent',
+            'Override!',
+            'baseEvent',
+        ), $summaries);
+
+    }
+
+    /**
+     * @depends testValues
+     */
+    function testOverridenEventNoValuesExpected() {
+
+        $vcal = new VCalendar();
+        $ev1 = $vcal->createComponent('VEVENT');
+
+        $ev1->UID = 'overridden';
+        $ev1->RRULE = 'FREQ=WEEKLY;COUNT=3';
+        $ev1->DTSTART = '20120124T120000Z';
+        $ev1->SUMMARY = 'baseEvent';
+
+        $vcal->add($ev1);
+
+        // ev2 overrides an event, and puts it 6 days earlier instead.
+        $ev2 = $vcal->createComponent('VEVENT');
+        $ev2->UID = 'overridden';
+        $ev2->{'RECURRENCE-ID'} = '20120131T120000Z';
+        $ev2->DTSTART = '20120125T120000Z';
+        $ev2->SUMMARY = 'Override!';
+
+        $vcal->add($ev2);
+
+        $it = new EventIterator($vcal,'overridden');
+
+        $dates = array();
+        $summaries = array();
+
+        // The reported problem was specifically related to the VCALENDAR
+        // expansion. In this parcitular case, we had to forward to the 28th of
+        // january.
+        $it->fastForward(new DateTime('2012-01-28 23:00:00'));
+
+        // We stop the loop when it hits the 6th of februari. Normally this
+        // iterator would hit 24, 25 (overriden from 31) and 7 feb but because
+        // we 'filter' from the 28th till the 6th, we should get 0 results.
+        while($it->valid() && $it->getDTSTart() < new DateTime('2012-02-06 23:00:00')) {
+
+            $dates[] = $it->getDTStart();
+            $summaries[] = (string)$it->getEventObject()->SUMMARY;
+            $it->next();
+
+        }
+
+        $this->assertEquals(array(), $dates);
+        $this->assertEquals(array(), $summaries);
+
+    }
+
+    /**
+     * @depends testValues
+     */
+    function testRDATE() {
+
+        $vcal = new VCalendar();
+        $ev = $vcal->createComponent('VEVENT');
+
+        $ev->UID = 'bla';
+        $ev->RDATE = array(
+            new DateTime('2014-08-07', new DateTimeZone('UTC')),
+            new DateTime('2014-08-08', new DateTimeZone('UTC')),
+        );
+        $dtStart = $vcal->createProperty('DTSTART');
+        $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC')));
+
+        $ev->add($dtStart);
+
+        $vcal->add($ev);
+
+        $it = new EventIterator($vcal,$ev->uid);
+
+        // Max is to prevent overflow
+        $max = 12;
+        $result = array();
+        foreach($it as $item) {
+
+            $result[] = $item;
+            $max--;
+
+            if (!$max) break;
+
+        }
+
+        $tz = new DateTimeZone('UTC');
+
+        $this->assertEquals(
+            array(
+                new DateTime('2011-10-07', $tz),
+                new DateTime('2014-08-07', $tz),
+                new DateTime('2014-08-08', $tz),
+            ),
+            $result
+        );
+
+    }
+
+    /**
+     * @depends testValues
+     * @expectedException \InvalidArgumentException
+     */
+    function testNoMasterBadUID() {
+
+        $vcal = new VCalendar();
+        // ev2 overrides an event, and puts it on 2pm instead.
+        $ev2 = $vcal->createComponent('VEVENT');
+        $ev2->UID = 'overridden';
+        $ev2->{'RECURRENCE-ID'} = '20120110T120000Z';
+        $ev2->DTSTART = '20120110T140000Z';
+        $ev2->SUMMARY = 'Event 2';
+
+        $vcal->add($ev2);
+
+        // ev3 overrides an event, and puts it 2 days and 2 hours later
+        $ev3 = $vcal->createComponent('VEVENT');
+        $ev3->UID = 'overridden';
+        $ev3->{'RECURRENCE-ID'} = '20120113T120000Z';
+        $ev3->DTSTART = '20120115T140000Z';
+        $ev3->SUMMARY = 'Event 3';
+
+        $vcal->add($ev3);
+
+        $it = new EventIterator($vcal,'broken');
+
+    }
+}
+
diff --git a/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/MissingOverriddenTest.php b/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/MissingOverriddenTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..2ab4effe6dc92a6b4d38842e58f4cd9e068f19ad
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/MissingOverriddenTest.php
@@ -0,0 +1,65 @@
+<?php
+
+namespace Sabre\VObject\Recur\EventIterator;
+
+use
+    DateTime,
+    DateTimeZone,
+    Sabre\VObject\Reader;
+
+class RecurrenceIteratorMissingOverriddenTest extends \PHPUnit_Framework_TestCase {
+
+    function testExpand() {
+
+        $input = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foo
+DTSTART:20130727T120000Z
+DURATION:PT1H
+RRULE:FREQ=DAILY;COUNT=2
+SUMMARY:A
+END:VEVENT
+BEGIN:VEVENT
+RECURRENCE-ID:20130728T120000Z
+UID:foo
+DTSTART:20140101T120000Z
+DURATION:PT1H
+SUMMARY:B
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $vcal = Reader::read($input);
+        $this->assertInstanceOf('Sabre\\VObject\\Component\\VCalendar', $vcal);
+
+        $vcal->expand(new DateTime('2011-01-01'), new DateTime('2015-01-01'));
+
+        $result = $vcal->serialize();
+
+        $output = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foo
+DTSTART:20130727T120000Z
+DURATION:PT1H
+SUMMARY:A
+RECURRENCE-ID:20130727T120000Z
+END:VEVENT
+BEGIN:VEVENT
+RECURRENCE-ID:20130728T120000Z
+UID:foo
+DTSTART:20140101T120000Z
+DURATION:PT1H
+SUMMARY:B
+END:VEVENT
+END:VCALENDAR
+
+ICS;
+        $this->assertEquals($output, str_replace("\r","",$result));
+    
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/NoInstancesTest.php b/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/NoInstancesTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..81c8ac9eb91865cb740d54a769b5b567fa5cc5c4
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/NoInstancesTest.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace Sabre\VObject\Recur;
+
+use
+    Sabre\VObject\Reader;
+
+class IssueEXDATETest extends \PHPUnit_Framework_TestCase {
+
+    /**
+     * @expectedException \Sabre\VObject\Recur\NoInstancesException
+     */
+    function testRecurrence() {
+
+        $input = <<<ICS
+BEGIN:VCALENDAR
+PRODID:-//Google Inc//Google Calendar 70.9054//EN
+VERSION:2.0
+BEGIN:VEVENT
+DTSTART;TZID=Europe/Berlin:20130329T140000
+DTEND;TZID=Europe/Berlin:20130329T153000
+RRULE:FREQ=WEEKLY;BYDAY=FR;UNTIL=20130412T115959Z
+EXDATE;TZID=Europe/Berlin:20130405T140000
+EXDATE;TZID=Europe/Berlin:20130329T140000
+DTSTAMP:20140916T201215Z
+UID:foo
+SEQUENCE:1
+SUMMARY:foo
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $vcal = Reader::read($input);
+        $this->assertInstanceOf('Sabre\\VObject\\Component\\VCalendar', $vcal);
+
+        $it = new EventIterator($vcal, 'foo');
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/OverrideFirstEventTest.php b/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/OverrideFirstEventTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..57514931eef9e19177f7448b23edc9c8e42eb07e
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/OverrideFirstEventTest.php
@@ -0,0 +1,122 @@
+<?php
+
+namespace Sabre\VObject\RecurrenceIterator;
+
+use Sabre\VObject\Reader;
+use DateTime;
+
+class OverrideFirstEventTest extends \PHPUnit_Framework_TestCase {
+
+    function testOverrideFirstEvent() {
+
+        $input =  <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foobar
+DTSTART:20140803T120000Z
+RRULE:FREQ=WEEKLY
+SUMMARY:Original
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+RECURRENCE-ID:20140803T120000Z
+DTSTART:20140803T120000Z
+SUMMARY:Overridden
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $vcal = Reader::read($input);
+        $vcal->expand(new DateTime('2014-08-01'), new DateTime('2014-09-01'));
+
+        $expected = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foobar
+RECURRENCE-ID:20140803T120000Z
+DTSTART:20140803T120000Z
+SUMMARY:Overridden
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+DTSTART:20140810T120000Z
+SUMMARY:Original
+RECURRENCE-ID:20140810T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+DTSTART:20140817T120000Z
+SUMMARY:Original
+RECURRENCE-ID:20140817T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+DTSTART:20140824T120000Z
+SUMMARY:Original
+RECURRENCE-ID:20140824T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+DTSTART:20140831T120000Z
+SUMMARY:Original
+RECURRENCE-ID:20140831T120000Z
+END:VEVENT
+END:VCALENDAR
+
+ICS;
+
+        $newIcs = $vcal->serialize();
+        $newIcs = str_replace("\r\n","\n", $newIcs);
+        $this->assertEquals(
+            $expected,
+            $newIcs
+        );
+
+
+    }
+
+    function testRemoveFirstEvent() {
+
+        $input =  <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foobar
+DTSTART:20140803T120000Z
+RRULE:FREQ=WEEKLY
+EXDATE:20140803T120000Z
+SUMMARY:Original
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+        $vcal = Reader::read($input);
+        $vcal->expand(new DateTime('2014-08-01'), new DateTime('2014-08-19'));
+
+        $expected = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foobar
+DTSTART:20140810T120000Z
+SUMMARY:Original
+RECURRENCE-ID:20140810T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:foobar
+DTSTART:20140817T120000Z
+SUMMARY:Original
+RECURRENCE-ID:20140817T120000Z
+END:VEVENT
+END:VCALENDAR
+
+ICS;
+
+        $newIcs = $vcal->serialize();
+        $newIcs = str_replace("\r\n","\n", $newIcs);
+        $this->assertEquals(
+            $expected,
+            $newIcs
+        );
+
+
+    }
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/SameDateForRecurringEventsTest.php b/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/SameDateForRecurringEventsTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..d67f200825c4abb6170a14c1ea0fd39c58f233bb
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Recur/EventIterator/SameDateForRecurringEventsTest.php
@@ -0,0 +1,56 @@
+<?php
+
+namespace Sabre\VObject\Recur;
+
+use Sabre\VObject\Recur\EventIterator;
+use Sabre\VObject\Reader;
+
+/**
+ * Testing case when overridden recurring events have same start date.
+ *
+ * Class SameDateForRecurringEventsTest
+ */
+class SameDateForRecurringEventsTest extends \PHPUnit_Framework_TestCase
+{
+
+    /**
+     * Checking is all events iterated by EventIterator.
+     */
+    public function testAllEventsArePresentInIterator()
+    {
+        $ics = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:1
+DTSTART;TZID=Europe/Kiev:20160713T110000
+DTEND;TZID=Europe/Kiev:20160713T113000
+RRULE:FREQ=DAILY;INTERVAL=1;COUNT=3
+END:VEVENT
+BEGIN:VEVENT
+UID:2
+DTSTART;TZID=Europe/Kiev:20160713T110000
+DTEND;TZID=Europe/Kiev:20160713T113000
+RECURRENCE-ID;TZID=Europe/Kiev:20160714T110000
+END:VEVENT
+BEGIN:VEVENT
+UID:3
+DTSTART;TZID=Europe/Kiev:20160713T110000
+DTEND;TZID=Europe/Kiev:20160713T113000
+RECURRENCE-ID;TZID=Europe/Kiev:20160715T110000
+END:VEVENT
+BEGIN:VEVENT
+UID:4
+DTSTART;TZID=Europe/Kiev:20160713T110000
+DTEND;TZID=Europe/Kiev:20160713T113000
+RECURRENCE-ID;TZID=Europe/Kiev:20160716T110000
+END:VEVENT
+END:VCALENDAR
+
+
+ICS;
+        $vCalendar = Reader::read($ics);
+        $eventIterator = new EventIterator($vCalendar->getComponents());
+
+        $this->assertEquals(4, iterator_count($eventIterator), 'in ICS 4 events');
+    }
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Recur/RDateIteratorTest.php b/vendor/sabre/vobject/tests/VObject/Recur/RDateIteratorTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..5663c9a0600f651b96f02688a2b99bbf7c394d81
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Recur/RDateIteratorTest.php
@@ -0,0 +1,56 @@
+<?php
+
+namespace Sabre\VObject\Recur;
+
+use DateTime;
+use DateTimeZone;
+
+class RDateIteratorTest extends \PHPUnit_Framework_TestCase {
+
+    function testSimple() {
+
+        $utc = new DateTimeZone('UTC');
+        $it = new RDateIterator('20140901T000000Z,20141001T000000Z', new DateTime('2014-08-01 00:00:00', $utc));
+
+        $expected = array(
+            new DateTime('2014-08-01 00:00:00', $utc),
+            new DateTime('2014-09-01 00:00:00', $utc),
+            new DateTime('2014-10-01 00:00:00', $utc),
+        );
+
+        $this->assertEquals(
+            $expected,
+            iterator_to_array($it)
+        );
+
+        $this->assertFalse($it->isInfinite());
+
+    }
+
+    function testFastForward() {
+
+        $utc = new DateTimeZone('UTC');
+        $it = new RDateIterator('20140901T000000Z,20141001T000000Z', new DateTime('2014-08-01 00:00:00', $utc));
+
+        $it->fastForward(new DateTime('2014-08-15 00:00:00'));
+
+        $result = array();
+        while($it->valid()) {
+            $result[] = $it->current();
+            $it->next();
+        }
+
+        $expected = array(
+            new DateTime('2014-09-01 00:00:00', $utc),
+            new DateTime('2014-10-01 00:00:00', $utc),
+        );
+
+        $this->assertEquals(
+            $expected,
+            $result
+        );
+
+        $this->assertFalse($it->isInfinite());
+
+    }
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Recur/RRuleIteratorTest.php b/vendor/sabre/vobject/tests/VObject/Recur/RRuleIteratorTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..912293486ff56feba98893de51ca246323e86023
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Recur/RRuleIteratorTest.php
@@ -0,0 +1,713 @@
+<?php
+
+namespace Sabre\VObject\Recur;
+
+use DateTime;
+use DateTimeZone;
+
+class RRuleIteratorTest extends \PHPUnit_Framework_TestCase {
+
+    function testHourly() {
+
+        $this->parse(
+            'FREQ=HOURLY;INTERVAL=3;COUNT=12',
+            '2011-10-07 12:00:00',
+            array(
+                '2011-10-07 12:00:00',
+                '2011-10-07 15:00:00',
+                '2011-10-07 18:00:00',
+                '2011-10-07 21:00:00',
+                '2011-10-08 00:00:00',
+                '2011-10-08 03:00:00',
+                '2011-10-08 06:00:00',
+                '2011-10-08 09:00:00',
+                '2011-10-08 12:00:00',
+                '2011-10-08 15:00:00',
+                '2011-10-08 18:00:00',
+                '2011-10-08 21:00:00',
+            )
+        );
+
+    }
+
+    function testDaily() {
+
+        $this->parse(
+            'FREQ=DAILY;INTERVAL=3;UNTIL=20111025T000000Z',
+            '2011-10-07',
+            array(
+                '2011-10-07 00:00:00',
+                '2011-10-10 00:00:00',
+                '2011-10-13 00:00:00',
+                '2011-10-16 00:00:00',
+                '2011-10-19 00:00:00',
+                '2011-10-22 00:00:00',
+                '2011-10-25 00:00:00',
+            )
+        );
+
+    }
+
+    function testDailyByDayByHour() {
+
+        $this->parse(
+            'FREQ=DAILY;BYDAY=SA,SU;BYHOUR=6,7',
+            '2011-10-08 06:00:00',
+            array(
+                '2011-10-08 06:00:00',
+                '2011-10-08 07:00:00',
+                '2011-10-09 06:00:00',
+                '2011-10-09 07:00:00',
+                '2011-10-15 06:00:00',
+                '2011-10-15 07:00:00',
+                '2011-10-16 06:00:00',
+                '2011-10-16 07:00:00',
+                '2011-10-22 06:00:00',
+                '2011-10-22 07:00:00',
+                '2011-10-23 06:00:00',
+                '2011-10-23 07:00:00',
+            )
+        );
+
+    }
+
+    function testDailyByHour() {
+
+        $this->parse(
+            'FREQ=DAILY;INTERVAL=2;BYHOUR=10,11,12,13,14,15',
+            '2012-10-11 12:00:00',
+            array(
+                '2012-10-11 12:00:00',
+                '2012-10-11 13:00:00',
+                '2012-10-11 14:00:00',
+                '2012-10-11 15:00:00',
+                '2012-10-13 10:00:00',
+                '2012-10-13 11:00:00',
+                '2012-10-13 12:00:00',
+                '2012-10-13 13:00:00',
+                '2012-10-13 14:00:00',
+                '2012-10-13 15:00:00',
+                '2012-10-15 10:00:00',
+                '2012-10-15 11:00:00',
+            )
+        );
+
+    }
+
+    function testDailyByDay() {
+
+        $this->parse(
+            'FREQ=DAILY;INTERVAL=2;BYDAY=TU,WE,FR',
+            '2011-10-07 12:00:00',
+            array(
+                '2011-10-07 12:00:00',
+                '2011-10-11 12:00:00',
+                '2011-10-19 12:00:00',
+                '2011-10-21 12:00:00',
+                '2011-10-25 12:00:00',
+                '2011-11-02 12:00:00',
+                '2011-11-04 12:00:00',
+                '2011-11-08 12:00:00',
+                '2011-11-16 12:00:00',
+                '2011-11-18 12:00:00',
+                '2011-11-22 12:00:00',
+                '2011-11-30 12:00:00',
+            )
+        );
+
+    }
+
+    function testDailyCount() {
+
+        $this->parse(
+            'FREQ=DAILY;COUNT=5',
+            '2014-08-01 18:03:00',
+            array(
+                '2014-08-01 18:03:00',
+                '2014-08-02 18:03:00',
+                '2014-08-03 18:03:00',
+                '2014-08-04 18:03:00',
+                '2014-08-05 18:03:00',
+            )
+        );
+
+    }
+
+    function testDailyByMonth() {
+
+        $this->parse(
+            'FREQ=DAILY;BYMONTH=9,10;BYDAY=SU',
+            '2007-10-04 16:00:00',
+            array(
+                "2013-09-29 16:00:00",
+                "2013-10-06 16:00:00",
+                "2013-10-13 16:00:00",
+                "2013-10-20 16:00:00",
+                "2013-10-27 16:00:00",
+                "2014-09-07 16:00:00"
+            ),
+            '2013-09-28'
+        );
+
+    }
+
+    function testWeekly() {
+
+        $this->parse(
+            'FREQ=WEEKLY;INTERVAL=2;COUNT=10',
+            '2011-10-07 00:00:00',
+            array(
+                '2011-10-07 00:00:00',
+                '2011-10-21 00:00:00',
+                '2011-11-04 00:00:00',
+                '2011-11-18 00:00:00',
+                '2011-12-02 00:00:00',
+                '2011-12-16 00:00:00',
+                '2011-12-30 00:00:00',
+                '2012-01-13 00:00:00',
+                '2012-01-27 00:00:00',
+                '2012-02-10 00:00:00',
+            )
+        );
+
+    }
+
+    function testWeeklyByDay() {
+
+        $this->parse(
+            'FREQ=WEEKLY;INTERVAL=1;COUNT=4;BYDAY=MO;WKST=SA',
+            '2014-08-01 00:00:00',
+            array(
+                '2014-08-01 00:00:00',
+                '2014-08-04 00:00:00',
+                '2014-08-11 00:00:00',
+                '2014-08-18 00:00:00',
+            )
+        );
+
+    }
+
+    function testWeeklyByDay2() {
+
+        $this->parse(
+            'FREQ=WEEKLY;INTERVAL=2;BYDAY=TU,WE,FR;WKST=SU',
+            '2011-10-07 00:00:00',
+            array(
+                '2011-10-07 00:00:00',
+                '2011-10-18 00:00:00',
+                '2011-10-19 00:00:00',
+                '2011-10-21 00:00:00',
+                '2011-11-01 00:00:00',
+                '2011-11-02 00:00:00',
+                '2011-11-04 00:00:00',
+                '2011-11-15 00:00:00',
+                '2011-11-16 00:00:00',
+                '2011-11-18 00:00:00',
+                '2011-11-29 00:00:00',
+                '2011-11-30 00:00:00',
+            )
+        );
+
+    }
+
+    function testWeeklyByDayByHour() {
+
+        $this->parse(
+            'FREQ=WEEKLY;INTERVAL=2;BYDAY=TU,WE,FR;WKST=MO;BYHOUR=8,9,10',
+            '2011-10-07 08:00:00',
+            array(
+                '2011-10-07 08:00:00',
+                '2011-10-07 09:00:00',
+                '2011-10-07 10:00:00',
+                '2011-10-18 08:00:00',
+                '2011-10-18 09:00:00',
+                '2011-10-18 10:00:00',
+                '2011-10-19 08:00:00',
+                '2011-10-19 09:00:00',
+                '2011-10-19 10:00:00',
+                '2011-10-21 08:00:00',
+                '2011-10-21 09:00:00',
+                '2011-10-21 10:00:00',
+                '2011-11-01 08:00:00',
+                '2011-11-01 09:00:00',
+                '2011-11-01 10:00:00',
+            )
+        );
+
+    }
+
+    function testWeeklyByDaySpecificHour() {
+
+        $this->parse(
+            'FREQ=WEEKLY;INTERVAL=2;BYDAY=TU,WE,FR;WKST=SU',
+            '2011-10-07 18:00:00',
+            array(
+                '2011-10-07 18:00:00',
+                '2011-10-18 18:00:00',
+                '2011-10-19 18:00:00',
+                '2011-10-21 18:00:00',
+                '2011-11-01 18:00:00',
+                '2011-11-02 18:00:00',
+                '2011-11-04 18:00:00',
+                '2011-11-15 18:00:00',
+                '2011-11-16 18:00:00',
+                '2011-11-18 18:00:00',
+                '2011-11-29 18:00:00',
+                '2011-11-30 18:00:00',
+            )
+        );
+
+    }
+
+    function testMonthly() {
+
+        $this->parse(
+            'FREQ=MONTHLY;INTERVAL=3;COUNT=5',
+            '2011-12-05 00:00:00',
+            array(
+                 '2011-12-05 00:00:00',
+                 '2012-03-05 00:00:00',
+                 '2012-06-05 00:00:00',
+                 '2012-09-05 00:00:00',
+                 '2012-12-05 00:00:00',
+            )
+        );
+
+    }
+
+    function testMonlthyEndOfMonth() {
+
+        $this->parse(
+            'FREQ=MONTHLY;INTERVAL=2;COUNT=12',
+            '2011-12-31 00:00:00',
+            array(
+                '2011-12-31 00:00:00',
+                '2012-08-31 00:00:00',
+                '2012-10-31 00:00:00',
+                '2012-12-31 00:00:00',
+                '2013-08-31 00:00:00',
+                '2013-10-31 00:00:00',
+                '2013-12-31 00:00:00',
+                '2014-08-31 00:00:00',
+                '2014-10-31 00:00:00',
+                '2014-12-31 00:00:00',
+                '2015-08-31 00:00:00',
+                '2015-10-31 00:00:00',
+            )
+        );
+
+    }
+
+    function testMonthlyByMonthDay() {
+
+        $this->parse(
+            'FREQ=MONTHLY;INTERVAL=5;COUNT=9;BYMONTHDAY=1,31,-7',
+            '2011-01-01 00:00:00',
+            array(
+                '2011-01-01 00:00:00',
+                '2011-01-25 00:00:00',
+                '2011-01-31 00:00:00',
+                '2011-06-01 00:00:00',
+                '2011-06-24 00:00:00',
+                '2011-11-01 00:00:00',
+                '2011-11-24 00:00:00',
+                '2012-04-01 00:00:00',
+                '2012-04-24 00:00:00',
+            )
+        );
+
+    }
+
+    function testMonthlyByDay() {
+
+        $this->parse(
+            'FREQ=MONTHLY;INTERVAL=2;COUNT=16;BYDAY=MO,-2TU,+1WE,3TH',
+            '2011-01-03 00:00:00',
+            array(
+                '2011-01-03 00:00:00',
+                '2011-01-05 00:00:00',
+                '2011-01-10 00:00:00',
+                '2011-01-17 00:00:00',
+                '2011-01-18 00:00:00',
+                '2011-01-20 00:00:00',
+                '2011-01-24 00:00:00',
+                '2011-01-31 00:00:00',
+                '2011-03-02 00:00:00',
+                '2011-03-07 00:00:00',
+                '2011-03-14 00:00:00',
+                '2011-03-17 00:00:00',
+                '2011-03-21 00:00:00',
+                '2011-03-22 00:00:00',
+                '2011-03-28 00:00:00',
+                '2011-05-02 00:00:00',
+            )
+        );
+
+    }
+
+    function testMonthlyByDayByMonthDay() {
+
+        $this->parse(
+            'FREQ=MONTHLY;COUNT=10;BYDAY=MO;BYMONTHDAY=1',
+            '2011-08-01 00:00:00',
+            array(
+                '2011-08-01 00:00:00',
+                '2012-10-01 00:00:00',
+                '2013-04-01 00:00:00',
+                '2013-07-01 00:00:00',
+                '2014-09-01 00:00:00',
+                '2014-12-01 00:00:00',
+                '2015-06-01 00:00:00',
+                '2016-02-01 00:00:00',
+                '2016-08-01 00:00:00',
+                '2017-05-01 00:00:00',
+            )
+        );
+
+    }
+
+    function testMonthlyByDayBySetPos() {
+
+        $this->parse(
+            'FREQ=MONTHLY;COUNT=10;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=1,-1',
+            '2011-01-03 00:00:00',
+            array(
+                '2011-01-03 00:00:00',
+                '2011-01-31 00:00:00',
+                '2011-02-01 00:00:00',
+                '2011-02-28 00:00:00',
+                '2011-03-01 00:00:00',
+                '2011-03-31 00:00:00',
+                '2011-04-01 00:00:00',
+                '2011-04-29 00:00:00',
+                '2011-05-02 00:00:00',
+                '2011-05-31 00:00:00',
+            )
+        );
+
+    }
+
+    function testYearly() {
+
+        $this->parse(
+            'FREQ=YEARLY;COUNT=10;INTERVAL=3',
+            '2011-01-01 00:00:00',
+            array(
+                '2011-01-01 00:00:00',
+                '2014-01-01 00:00:00',
+                '2017-01-01 00:00:00',
+                '2020-01-01 00:00:00',
+                '2023-01-01 00:00:00',
+                '2026-01-01 00:00:00',
+                '2029-01-01 00:00:00',
+                '2032-01-01 00:00:00',
+                '2035-01-01 00:00:00',
+                '2038-01-01 00:00:00',
+            )
+        );
+    }
+
+    function testYearlyLeapYear() {
+
+        $this->parse(
+            'FREQ=YEARLY;COUNT=3',
+            '2012-02-29 00:00:00',
+            array(
+                '2012-02-29 00:00:00',
+                '2016-02-29 00:00:00',
+                '2020-02-29 00:00:00',
+            )
+        );
+    }
+
+    function testYearlyByMonth() {
+
+        $this->parse(
+            'FREQ=YEARLY;COUNT=8;INTERVAL=4;BYMONTH=4,10',
+            '2011-04-07 00:00:00',
+            array(
+                '2011-04-07 00:00:00',
+                '2011-10-07 00:00:00',
+                '2015-04-07 00:00:00',
+                '2015-10-07 00:00:00',
+                '2019-04-07 00:00:00',
+                '2019-10-07 00:00:00',
+                '2023-04-07 00:00:00',
+                '2023-10-07 00:00:00',
+            )
+        );
+
+    }
+
+    function testYearlyByMonthByDay() {
+
+        $this->parse(
+            'FREQ=YEARLY;COUNT=8;INTERVAL=5;BYMONTH=4,10;BYDAY=1MO,-1SU',
+            '2011-04-04 00:00:00',
+            array(
+                '2011-04-04 00:00:00',
+                '2011-04-24 00:00:00',
+                '2011-10-03 00:00:00',
+                '2011-10-30 00:00:00',
+                '2016-04-04 00:00:00',
+                '2016-04-24 00:00:00',
+                '2016-10-03 00:00:00',
+                '2016-10-30 00:00:00',
+            )
+        );
+
+    }
+
+    function testFastForward() {
+
+        // The idea is that we're fast-forwarding too far in the future, so
+        // there will be no results left.
+        $this->parse(
+            'FREQ=YEARLY;COUNT=8;INTERVAL=5;BYMONTH=4,10;BYDAY=1MO,-1SU',
+            '2011-04-04 00:00:00',
+            array(),
+            '2020-05-05 00:00:00'
+        );
+
+    } 
+
+    /**
+     * The bug that was in the
+     * system before would fail on the 5th tuesday of the month, if the 5th
+     * tuesday did not exist.
+     *
+     * A pretty slow test. Had to be marked as 'medium' for phpunit to not die
+     * after 1 second. Would be good to optimize later.
+     *
+     * @medium
+     */
+    function testFifthTuesdayProblem() {
+
+        $this->parse(
+            'FREQ=MONTHLY;INTERVAL=1;UNTIL=20071030T035959Z;BYDAY=5TU',
+            '2007-10-04 14:46:42',
+            array(
+                "2007-10-04 14:46:42",
+            )
+        );
+
+    }
+
+    /**
+     * This bug came from a Fruux customer. This would result in a never-ending
+     * request.
+     */
+    function testFastFowardTooFar() {
+
+        $this->parse(
+            'FREQ=WEEKLY;BYDAY=MO;UNTIL=20090704T205959Z;INTERVAL=1',
+            '2009-04-20 18:00:00',
+            array(
+                '2009-04-20 18:00:00',
+                '2009-04-27 18:00:00',
+                '2009-05-04 18:00:00',
+                '2009-05-11 18:00:00',
+                '2009-05-18 18:00:00',
+                '2009-05-25 18:00:00',
+                '2009-06-01 18:00:00',
+                '2009-06-08 18:00:00',
+                '2009-06-15 18:00:00',
+                '2009-06-22 18:00:00',
+                '2009-06-29 18:00:00',
+            )
+        );
+
+    }
+
+    /**
+     * This also at one point caused an infinite loop. We're keeping the test.
+     */
+    function testYearlyByMonthLoop() {
+
+        $this->parse(
+            'FREQ=YEARLY;INTERVAL=1;UNTIL=20120203T225959Z;BYMONTH=2;BYSETPOS=1;BYDAY=SU,MO,TU,WE,TH,FR,SA',
+            '2012-01-01 15:45:00',
+            array(
+                '2012-02-01 15:45:00',
+            ),
+            '2012-01-29 23:00:00'
+        );
+
+
+    }
+
+    /**
+     * Something, somewhere produced an ics with an interval set to 0. Because
+     * this means we increase the current day (or week, month) by 0, this also
+     * results in an infinite loop.
+     *
+     * @expectedException InvalidArgumentException
+     */
+    function testZeroInterval() {
+
+        $this->parse(
+            'FREQ=YEARLY;INTERVAL=0',
+            '2012-08-24 14:57:00',
+            array(),
+            '2013-01-01 23:00:00'
+        );
+
+    }
+
+    /**
+     * @expectedException InvalidArgumentException
+     */
+    function testInvalidFreq() {
+
+        $this->parse(
+            'FREQ=SMONTHLY;INTERVAL=3;UNTIL=20111025T000000Z',
+            '2011-10-07',
+            array()
+        );
+
+    }
+
+    /**
+     * @expectedException InvalidArgumentException
+     */
+    function testByDayBadOffset() {
+
+        $this->parse(
+            'FREQ=WEEKLY;INTERVAL=1;COUNT=4;BYDAY=0MO;WKST=SA',
+            '2014-08-01 00:00:00',
+            array()
+        );
+
+    }
+
+    function testUntilBeginHAsTimezone() {
+
+        $this->parse(
+            'FREQ=WEEKLY;UNTIL=20131118T183000',
+            '2013-09-23 18:30:00',
+            array(
+                '2013-09-23 18:30:00',
+                '2013-09-30 18:30:00',
+                '2013-10-07 18:30:00',
+                '2013-10-14 18:30:00',
+                '2013-10-21 18:30:00',
+                '2013-10-28 18:30:00',
+                '2013-11-04 18:30:00',
+                '2013-11-11 18:30:00',
+                '2013-11-18 18:30:00',
+            ),
+            null,
+            'America/New_York'
+        );
+
+    }
+
+    function testUntilBeforeDtStart() {
+
+        $this->parse(
+            'FREQ=DAILY;UNTIL=20140101T000000Z',
+            '2014-08-02 00:15:00',
+            array(
+                '2014-08-02 00:15:00',
+            )
+        );
+
+    }
+
+    function testIgnoredStuff() {
+
+        $this->parse(
+            'FREQ=DAILY;BYSECOND=1;BYMINUTE=1;BYYEARDAY=1;BYWEEKNO=1;COUNT=2',
+            '2014-08-02 00:15:00',
+            array(
+                '2014-08-02 00:15:00',
+                '2014-08-03 00:15:00',
+            )
+        );
+
+    }
+
+    function testMinusFifthThursday() {
+
+        $this->parse(
+            'FREQ=MONTHLY;BYDAY=-4TH,-5TH;COUNT=4',
+            '2015-01-01 00:15:00',
+            array(
+                '2015-01-01 00:15:00',
+                '2015-01-08 00:15:00',
+                '2015-02-05 00:15:00',
+                '2015-03-05 00:15:00'
+            )
+        );
+
+    }
+
+    /**
+     * @expectedException InvalidArgumentException
+     */
+    function testUnsupportedPart() {
+
+        $this->parse(
+            'FREQ=DAILY;BYWODAN=1',
+            '2014-08-02 00:15:00',
+            array()
+        );
+
+    }
+
+    function testIteratorFunctions() {
+
+        $parser = new RRuleIterator('FREQ=DAILY', new DateTime('2014-08-02 00:00:13'));
+        $parser->next();
+        $this->assertEquals(
+            new DateTime('2014-08-03 00:00:13'),
+            $parser->current()
+        );
+        $this->assertEquals(
+            1,
+            $parser->key()
+        );
+
+        $parser->rewind();
+
+        $this->assertEquals(
+            new DateTime('2014-08-02 00:00:13'),
+            $parser->current()
+        );
+        $this->assertEquals(
+            0,
+            $parser->key()
+        );
+
+    }
+
+    function parse($rule, $start, $expected, $fastForward = null, $tz = 'UTC') {
+
+        $dt = new DateTime($start, new DateTimeZone($tz));
+        $parser = new RRuleIterator($rule, $dt);
+
+        if ($fastForward) {
+            $parser->fastForward(new DateTime($fastForward));
+        }
+
+        $result = array();
+        while($parser->valid()) {
+
+            $item = $parser->current();
+            $result[] = $item->format('Y-m-d H:i:s');
+
+            if ($parser->isInfinite() && count($result) >= count($expected)) {
+                break;
+            }
+            $parser->next();
+
+        }
+
+        $this->assertEquals(
+            $expected,
+            $result
+        );
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/RecurrenceIterator/UntilRespectsTimezoneTest.ics b/vendor/sabre/vobject/tests/VObject/RecurrenceIterator/UntilRespectsTimezoneTest.ics
new file mode 100644
index 0000000000000000000000000000000000000000..6b2cccbc49a656881cd945a2be28bc0a5acec5a7
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/RecurrenceIterator/UntilRespectsTimezoneTest.ics
@@ -0,0 +1,39 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+X-WR-TIMEZONE:America/New_York
+PRODID:-//www.churchcommunitybuilder.com//Church Community Builder//EN
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+X-WR-CALNAME:Test Event
+BEGIN:VTIMEZONE
+TZID:America/New_York
+X-LIC-LOCATION:America/New_York
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+UID:10621-1440@ccbchurch.com
+DTSTART;TZID=America/New_York:20130923T183000
+DTEND;TZID=America/New_York:20130923T203000
+DTSTAMP:20131216T170211
+RRULE:FREQ=WEEKLY;UNTIL=20131118T183000
+CREATED:20130423T161111
+DESCRIPTION:Test Event ending November 11, 2013
+LAST-MODIFIED:20131126T163428
+SEQUENCE:1387231331
+SUMMARY:Test
+TRANSP:OPAQUE
+END:VEVENT
+END:VCALENDAR
diff --git a/vendor/sabre/vobject/tests/VObject/SlashRTest.php b/vendor/sabre/vobject/tests/VObject/SlashRTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..fd4dd784ba0ffbd8846a0fb380b66bb65ceefb37
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/SlashRTest.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * This issue was pointed out in Issue 55. \r should be stripped completely 
+ * when encoding property values.
+ */
+class SlashRTest extends \PHPUnit_Framework_TestCase {
+
+    function testEncode() {
+
+        $vcal = new Component\VCalendar();
+        $prop = $vcal->add('test', "abc\r\ndef");
+        $this->assertEquals("TEST:abc\\ndef\r\n", $prop->serialize());
+
+    }
+
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Splitter/ICalendarTest.php b/vendor/sabre/vobject/tests/VObject/Splitter/ICalendarTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..58a2691ac2761cdde2562610f3fdfd68a1188e76
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Splitter/ICalendarTest.php
@@ -0,0 +1,325 @@
+<?php
+
+namespace Sabre\VObject\Splitter;
+
+use Sabre\VObject;
+
+class ICalendarTest extends \PHPUnit_Framework_TestCase {
+
+    protected $version;
+
+    function setUp() {
+        $this->version = VObject\Version::VERSION;
+    }
+
+    function createStream($data) {
+
+        $stream = fopen('php://memory','r+');
+        fwrite($stream, $data);
+        rewind($stream);
+        return $stream;
+
+    }
+
+    function testICalendarImportValidEvent() {
+
+        $data = <<<EOT
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foo
+DTSTAMP:20140122T233226Z
+DTSTART:20140101T070000Z
+END:VEVENT
+END:VCALENDAR
+EOT;
+        $tempFile = $this->createStream($data);
+
+        $objects = new ICalendar($tempFile);
+
+        $return = "";
+        while($object=$objects->getNext()) {
+            $return .= $object->serialize();
+        }
+        $this->assertEquals(array(), VObject\Reader::read($return)->validate());
+    }
+
+    /**
+     * @expectedException Sabre\VObject\ParseException
+     */
+    function testICalendarImportWrongType() {
+
+        $data = <<<EOT
+BEGIN:VCARD
+UID:foo1
+END:VCARD
+BEGIN:VCARD
+UID:foo2
+END:VCARD
+EOT;
+        $tempFile = $this->createStream($data);
+
+        $objects = new ICalendar($tempFile);
+
+    }
+
+    function testICalendarImportEndOfData() {
+        $data = <<<EOT
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foo
+DTSTAMP:20140122T233226Z
+END:VEVENT
+END:VCALENDAR
+EOT;
+        $tempFile = $this->createStream($data);
+
+        $objects = new ICalendar($tempFile);
+
+        $return = "";
+        while($object=$objects->getNext()) {
+            $return .= $object->serialize();
+        }
+        $this->assertNull($object=$objects->getNext());
+    }
+
+    /**
+     * @expectedException Sabre\VObject\ParseException
+     */
+    function testICalendarImportInvalidEvent() {
+        $data = <<<EOT
+EOT;
+        $tempFile = $this->createStream($data);
+        $objects = new ICalendar($tempFile);
+
+    }
+
+    function testICalendarImportMultipleValidEvents() {
+
+        $event[] = <<<EOT
+BEGIN:VEVENT
+UID:foo1
+DTSTAMP:20140122T233226Z
+DTSTART:20140101T050000Z
+END:VEVENT
+EOT;
+
+$event[] = <<<EOT
+BEGIN:VEVENT
+UID:foo2
+DTSTAMP:20140122T233226Z
+DTSTART:20140101T060000Z
+END:VEVENT
+EOT;
+
+        $data = <<<EOT
+BEGIN:VCALENDAR
+$event[0]
+$event[1]
+END:VCALENDAR
+
+EOT;
+        $tempFile = $this->createStream($data);
+
+        $objects = new ICalendar($tempFile);
+
+        $return = "";
+        $i = 0;
+        while($object=$objects->getNext()) {
+
+            $expected = <<<EOT
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $this->version//EN
+CALSCALE:GREGORIAN
+$event[$i]
+END:VCALENDAR
+
+EOT;
+
+            $return .= $object->serialize();
+            $expected = str_replace("\n", "\r\n", $expected);
+            $this->assertEquals($expected, $object->serialize());
+            $i++;
+        }
+        $this->assertEquals(array(), VObject\Reader::read($return)->validate());
+    }
+
+    function testICalendarImportEventWithoutUID() {
+
+        $data = <<<EOT
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $this->version//EN
+CALSCALE:GREGORIAN
+BEGIN:VEVENT
+DTSTART:20140101T040000Z
+DTSTAMP:20140122T233226Z
+END:VEVENT
+END:VCALENDAR
+
+EOT;
+        $tempFile = $this->createStream($data);
+
+        $objects = new ICalendar($tempFile);
+
+        $return = "";
+        while($object=$objects->getNext()) {
+            $return .= $object->serialize();
+        }
+
+        $messages = VObject\Reader::read($return)->validate();
+
+        if ($messages) {
+            $messages = array_map(
+                function($item) { return $item['message']; },
+                $messages
+            );
+            $this->fail('Validation errors: ' . implode("\n", $messages));
+        } else {
+            $this->assertEquals(array(), $messages);
+        }
+    }
+
+    function testICalendarImportMultipleVTIMEZONESAndMultipleValidEvents() {
+
+        $timezones = <<<EOT
+BEGIN:VTIMEZONE
+TZID:Europe/Berlin
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+DTSTART:19810329T020000
+TZNAME:MESZ
+TZOFFSETTO:+0200
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+DTSTART:19961027T030000
+TZNAME:MEZ
+TZOFFSETTO:+0100
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VTIMEZONE
+TZID:Europe/London
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+DTSTART:19810329T010000
+TZNAME:GMT+01:00
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+DTSTART:19961027T020000
+TZNAME:GMT
+TZOFFSETTO:+0000
+END:STANDARD
+END:VTIMEZONE
+EOT;
+
+        $event[] = <<<EOT
+BEGIN:VEVENT
+UID:foo1
+DTSTAMP:20140122T232710Z
+DTSTART:20140101T010000Z
+END:VEVENT
+EOT;
+
+        $event[] = <<<EOT
+BEGIN:VEVENT
+UID:foo2
+DTSTAMP:20140122T232710Z
+DTSTART:20140101T020000Z
+END:VEVENT
+EOT;
+
+        $event[] = <<<EOT
+BEGIN:VEVENT
+UID:foo3
+DTSTAMP:20140122T232710Z
+DTSTART:20140101T030000Z
+END:VEVENT
+EOT;
+
+        $data = <<<EOT
+BEGIN:VCALENDAR
+$timezones
+$event[0]
+$event[1]
+$event[2]
+END:VCALENDAR
+
+EOT;
+        $tempFile = $this->createStream($data);
+
+        $objects = new ICalendar($tempFile);
+
+        $return = "";
+        $i = 0;
+        while($object=$objects->getNext()) {
+
+            $expected = <<<EOT
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $this->version//EN
+CALSCALE:GREGORIAN
+$timezones
+$event[$i]
+END:VCALENDAR
+
+EOT;
+            $expected = str_replace("\n", "\r\n", $expected);
+
+            $this->assertEquals($expected, $object->serialize());
+            $return .= $object->serialize();
+            $i++;
+
+        }
+
+        $this->assertEquals(array(), VObject\Reader::read($return)->validate());
+    }
+
+    function testICalendarImportWithOutVTIMEZONES() {
+
+        $data = <<<EOT
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//Mac OS X 10.8//EN
+CALSCALE:GREGORIAN
+BEGIN:VEVENT
+CREATED:20120605T072109Z
+UID:D6716295-C10F-4B20-82F9-E1A3026C7DCF
+DTEND;VALUE=DATE:20120717
+TRANSP:TRANSPARENT
+SUMMARY:Start Vorbereitung
+DTSTART;VALUE=DATE:20120716
+DTSTAMP:20120605T072115Z
+SEQUENCE:2
+BEGIN:VALARM
+X-WR-ALARMUID:A99EDA6A-35EB-4446-B8BC-CDA3C60C627D
+UID:A99EDA6A-35EB-4446-B8BC-CDA3C60C627D
+TRIGGER:-PT15H
+X-APPLE-DEFAULT-ALARM:TRUE
+ATTACH;VALUE=URI:Basso
+ACTION:AUDIO
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+
+EOT;
+        $tempFile = $this->createStream($data);
+
+        $objects = new ICalendar($tempFile);
+
+        $return = "";
+        while($object=$objects->getNext()) {
+            $return .= $object->serialize();
+        }
+
+        $messages = VObject\Reader::read($return)->validate();
+        $this->assertEquals(array(), $messages);
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/Splitter/VCardTest.php b/vendor/sabre/vobject/tests/VObject/Splitter/VCardTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..7fa559db27d5b2f1e203c864550a30f74f462ee0
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/Splitter/VCardTest.php
@@ -0,0 +1,195 @@
+<?php
+
+namespace Sabre\VObject\Splitter;
+
+use Sabre\VObject;
+
+class VCardTest extends \PHPUnit_Framework_TestCase {
+
+    function createStream($data) {
+
+        $stream = fopen('php://memory','r+');
+        fwrite($stream, $data);
+        rewind($stream);
+        return $stream;
+
+    }
+
+    function testVCardImportValidVCard() {
+        $data = <<<EOT
+BEGIN:VCARD
+UID:foo
+END:VCARD
+EOT;
+        $tempFile = $this->createStream($data);
+
+        $objects = new VCard($tempFile);
+
+        $count = 0;
+        while($objects->getNext()) {
+            $count++;
+        }
+        $this->assertEquals(1, $count);
+
+    }
+
+    /**
+     * @expectedException Sabre\VObject\ParseException
+     */
+    function testVCardImportWrongType() {
+        $event[] = <<<EOT
+BEGIN:VEVENT
+UID:foo1
+DTSTAMP:20140122T233226Z
+DTSTART:20140101T050000Z
+END:VEVENT
+EOT;
+
+$event[] = <<<EOT
+BEGIN:VEVENT
+UID:foo2
+DTSTAMP:20140122T233226Z
+DTSTART:20140101T060000Z
+END:VEVENT
+EOT;
+
+        $data = <<<EOT
+BEGIN:VCALENDAR
+$event[0]
+$event[1]
+END:VCALENDAR
+
+EOT;
+        $tempFile = $this->createStream($data);
+
+        $splitter = new VCard($tempFile);
+
+        while($object=$splitter->getNext()) {
+        }
+
+    }
+
+    function testVCardImportValidVCardsWithCategories() {
+        $data = <<<EOT
+BEGIN:VCARD
+UID:card-in-foo1-and-foo2
+CATEGORIES:foo1,foo2
+END:VCARD
+BEGIN:VCARD
+UID:card-in-foo1
+CATEGORIES:foo1
+END:VCARD
+BEGIN:VCARD
+UID:card-in-foo3
+CATEGORIES:foo3
+END:VCARD
+BEGIN:VCARD
+UID:card-in-foo1-and-foo3
+CATEGORIES:foo1\,foo3
+END:VCARD
+EOT;
+        $tempFile = $this->createStream($data);
+
+        $splitter = new VCard($tempFile);
+
+        $count = 0;
+        while($object=$splitter->getNext()) {
+            $count++;
+        }
+        $this->assertEquals(4, $count);
+
+    }
+
+    function testVCardImportEndOfData() {
+        $data = <<<EOT
+BEGIN:VCARD
+UID:foo
+END:VCARD
+EOT;
+        $tempFile = $this->createStream($data);
+
+        $objects = new VCard($tempFile);
+        $object=$objects->getNext();
+
+        $this->assertNull($objects->getNext());
+
+
+    }
+
+    /**
+     * @expectedException \Sabre\VObject\ParseException
+     */
+    function testVCardImportCheckInvalidArgumentException() {
+        $data = <<<EOT
+BEGIN:FOO
+END:FOO
+EOT;
+        $tempFile = $this->createStream($data);
+
+        $objects = new VCard($tempFile);
+        while($objects->getNext()) { }
+
+    }
+
+    function testVCardImportMultipleValidVCards() {
+        $data = <<<EOT
+BEGIN:VCARD
+UID:foo
+END:VCARD
+BEGIN:VCARD
+UID:foo
+END:VCARD
+EOT;
+        $tempFile = $this->createStream($data);
+
+        $objects = new VCard($tempFile);
+
+        $count = 0;
+        while($objects->getNext()) {
+            $count++;
+        }
+        $this->assertEquals(2, $count);
+
+    }
+
+    function testImportMultipleSeparatedWithNewLines() {
+        $data = <<<EOT
+BEGIN:VCARD
+UID:foo
+END:VCARD
+
+
+BEGIN:VCARD
+UID:foo
+END:VCARD
+
+
+EOT;
+        $tempFile = $this->createStream($data);
+        $objects = new VCard($tempFile);
+
+        $count = 0;
+        while ($objects->getNext()) {
+            $count++;
+        }
+        $this->assertEquals(2, $count);
+    }
+
+    function testVCardImportVCardWithoutUID() {
+        $data = <<<EOT
+BEGIN:VCARD
+END:VCARD
+EOT;
+        $tempFile = $this->createStream($data);
+
+        $objects = new VCard($tempFile);
+
+        $count = 0;
+        while($objects->getNext()) {
+            $count++;
+        }
+
+        $this->assertEquals(1, $count);
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/StringUtilTest.php b/vendor/sabre/vobject/tests/VObject/StringUtilTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..8e0bc483d152e75e0b65e7d4a3d120d606d3e6b7
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/StringUtilTest.php
@@ -0,0 +1,55 @@
+<?php
+
+namespace Sabre\VObject;
+
+class StringUtilTest extends \PHPUnit_Framework_TestCase {
+
+    function testNonUTF8() {
+
+        $string = StringUtil::isUTF8(chr(0xbf));
+
+        $this->assertEquals(false, $string);
+
+    }
+
+    function testIsUTF8() {
+
+        $string = StringUtil::isUTF8('I 💚 SabreDAV');
+
+        $this->assertEquals(true, $string);
+
+    }
+
+    function testUTF8ControlChar() {
+
+        $string = StringUtil::isUTF8(chr(0x00));
+
+        $this->assertEquals(false, $string);
+
+    }
+
+    function testConvertToUTF8nonUTF8() {
+
+        $string = StringUtil::convertToUTF8(chr(0xbf));
+
+        $this->assertEquals(utf8_encode(chr(0xbf)), $string);
+
+    }
+
+    function testConvertToUTF8IsUTF8() {
+
+        $string = StringUtil::convertToUTF8('I 💚 SabreDAV');
+
+        $this->assertEquals('I 💚 SabreDAV', $string);
+
+    }
+
+    function testConvertToUTF8ControlChar() {
+
+        $string = StringUtil::convertToUTF8(chr(0x00));
+
+        $this->assertEquals('', $string);
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/TestCase.php b/vendor/sabre/vobject/tests/VObject/TestCase.php
new file mode 100644
index 0000000000000000000000000000000000000000..d81559dd168d65f0cf1a27b1cea384e460206d6e
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/TestCase.php
@@ -0,0 +1,50 @@
+<?php
+
+namespace Sabre\VObject;
+
+class TestCase extends \PHPUnit_Framework_TestCase {
+
+    /**
+     * This method tests wether two vcards or icalendar objects are
+     * semantically identical.
+     *
+     * It supports objects being supplied as strings, streams or
+     * Sabre\VObject\Component instances.
+     *
+     * PRODID is removed from both objects as this is often variable.
+     *
+     * @param resource|string|Component $expected
+     * @param resource|string|Component $actual
+     * @param string $message
+     */
+    function assertVObjEquals($expected, $actual, $message = '') {
+
+        $self = $this;
+        $getObj = function($input) use ($self) {
+
+            if (is_resource($input)) {
+                $input = stream_get_contents($input);
+            }
+            if (is_string($input)) {
+                $input = Reader::read($input);
+            }
+            if (!$input instanceof Component) {
+                $this->fail('Input must be a string, stream or VObject component');
+            }
+            unset($input->PRODID);
+            return $input;
+
+        };
+
+        $expected = $getObj($expected);
+        $actual = $getObj($actual);
+
+        $this->assertEquals(
+            $expected->serialize(),
+            $actual->serialize(),
+            $message
+        );
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/TimeZoneUtilTest.php b/vendor/sabre/vobject/tests/VObject/TimeZoneUtilTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..9c747e8b5044a4069ef579099f073f50a20929ff
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/TimeZoneUtilTest.php
@@ -0,0 +1,369 @@
+<?php
+
+namespace Sabre\VObject;
+
+class TimezoneUtilTest extends \PHPUnit_Framework_TestCase {
+
+    function setUp() {
+
+        // clearning the tz cache
+        TimezoneUtil::$map = null;
+
+    }
+
+    /**
+     * @dataProvider getMapping
+     */
+    function testCorrectTZ($timezoneName) {
+
+        try {
+            $tz = new \DateTimeZone($timezoneName);
+            $this->assertInstanceOf('DateTimeZone', $tz);
+        } catch (\Exception $e) {
+            if (strpos($e->getMessage(), "Unknown or bad timezone")!==false) {
+                $this->markTestSkipped($timezoneName . ' is not (yet) supported in this PHP version. Update pecl/timezonedb');
+            } else {
+                throw $e;
+            }
+
+        }
+
+    }
+
+    function getMapping() {
+
+        TimeZoneUtil::loadTzMaps();
+
+        // PHPUNit requires an array of arrays
+        return array_map(
+            function($value) {
+                return array($value);
+            },
+            TimeZoneUtil::$map
+        );
+
+    }
+
+    function testExchangeMap() {
+
+        $vobj = <<<HI
+BEGIN:VCALENDAR
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:foo
+X-MICROSOFT-CDO-TZID:2
+BEGIN:STANDARD
+DTSTART:16010101T030000
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:16010101T020000
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20120416T092149Z
+DTSTART;TZID="foo":20120418T1
+ 00000
+SUMMARY:Begin Unterhaltsreinigung
+UID:040000008200E00074C5B7101A82E0080000000010DA091DC31BCD01000000000000000
+ 0100000008FECD2E607780649BE5A4C9EE6418CBC
+ 000
+END:VEVENT
+END:VCALENDAR
+HI;
+
+        $tz = TimeZoneUtil::getTimeZone('foo', Reader::read($vobj));
+        $ex = new \DateTimeZone('Europe/Lisbon');
+
+        $this->assertEquals($ex->getName(), $tz->getName());
+
+    }
+
+    function testWetherMicrosoftIsStillInsane() {
+
+        $vobj = <<<HI
+BEGIN:VCALENDAR
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:(GMT+01.00) Sarajevo/Warsaw/Zagreb
+X-MICROSOFT-CDO-TZID:2
+BEGIN:STANDARD
+DTSTART:16010101T030000
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
+HI;
+
+        $tz = TimeZoneUtil::getTimeZone('(GMT+01.00) Sarajevo/Warsaw/Zagreb', Reader::read($vobj));
+        $ex = new \DateTimeZone('Europe/Sarajevo');
+
+        $this->assertEquals($ex->getName(), $tz->getName());
+
+    }
+
+    function testUnknownExchangeId() {
+
+        $vobj = <<<HI
+BEGIN:VCALENDAR
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:foo
+X-MICROSOFT-CDO-TZID:2000
+BEGIN:STANDARD
+DTSTART:16010101T030000
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:16010101T020000
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20120416T092149Z
+DTSTART;TZID="foo":20120418T1
+ 00000
+SUMMARY:Begin Unterhaltsreinigung
+UID:040000008200E00074C5B7101A82E0080000000010DA091DC31BCD01000000000000000
+ 0100000008FECD2E607780649BE5A4C9EE6418CBC
+DTEND;TZID="Sarajevo, Skopje, Sofija, Vilnius, Warsaw, Zagreb":20120418T103
+ 000
+END:VEVENT
+END:VCALENDAR
+HI;
+
+        $tz = TimeZoneUtil::getTimeZone('foo', Reader::read($vobj));
+        $ex = new \DateTimeZone(date_default_timezone_get());
+        $this->assertEquals($ex->getName(), $tz->getName());
+
+    }
+
+    function testWindowsTimeZone() {
+
+        $tz = TimeZoneUtil::getTimeZone('Eastern Standard Time');
+        $ex = new \DateTimeZone('America/New_York');
+        $this->assertEquals($ex->getName(), $tz->getName());
+
+    }
+
+    /**
+     * @dataProvider getPHPTimeZoneIdentifiers
+     */
+    function testTimeZoneIdentifiers($tzid) {
+
+        $tz = TimeZoneUtil::getTimeZone($tzid);
+        $ex = new \DateTimeZone($tzid);
+
+        $this->assertEquals($ex->getName(), $tz->getName());
+
+    }
+
+    /**
+     * @dataProvider getPHPTimeZoneBCIdentifiers
+     */
+    function testTimeZoneBCIdentifiers($tzid) {
+
+        $tz = TimeZoneUtil::getTimeZone($tzid);
+        $ex = new \DateTimeZone($tzid);
+
+        $this->assertEquals($ex->getName(), $tz->getName());
+
+    }
+
+    function getPHPTimeZoneIdentifiers() {
+
+        // PHPUNit requires an array of arrays
+        return array_map(
+            function($value) {
+                return array($value);
+            },
+            \DateTimeZone::listIdentifiers()
+        );
+
+    }
+
+    function getPHPTimeZoneBCIdentifiers() {
+
+        // PHPUNit requires an array of arrays
+        return array_map(
+            function($value) {
+                return array($value);
+            },
+            TimeZoneUtil::getIdentifiersBC()
+        );
+
+    }
+
+    function testTimezoneOffset() {
+
+        $tz = TimeZoneUtil::getTimeZone('GMT-0400', null, true);
+
+        if (version_compare(PHP_VERSION, '5.5.10', '>=') && !defined('HHVM_VERSION')) {
+            $ex = new \DateTimeZone('-04:00');
+        } else {
+            $ex = new \DateTimeZone('Etc/GMT-4');
+        }
+        $this->assertEquals($ex->getName(), $tz->getName());
+
+    }
+
+    /**
+     * @expectedException InvalidArgumentException
+     */
+    function testTimezoneFail() {
+
+        $tz = TimeZoneUtil::getTimeZone('FooBar', null, true);
+
+    }
+
+    function testFallBack() {
+
+        $vobj = <<<HI
+BEGIN:VCALENDAR
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:foo
+BEGIN:STANDARD
+DTSTART:16010101T030000
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:16010101T020000
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20120416T092149Z
+DTSTART;TZID="foo":20120418T1
+ 00000
+SUMMARY:Begin Unterhaltsreinigung
+UID:040000008200E00074C5B7101A82E0080000000010DA091DC31BCD01000000000000000
+ 0100000008FECD2E607780649BE5A4C9EE6418CBC
+ 000
+END:VEVENT
+END:VCALENDAR
+HI;
+
+        $tz = TimeZoneUtil::getTimeZone('foo', Reader::read($vobj));
+        $ex = new \DateTimeZone(date_default_timezone_get());
+        $this->assertEquals($ex->getName(), $tz->getName());
+
+    }
+
+    function testLjubljanaBug() {
+
+        $vobj = <<<HI
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Ximian//NONSGML Evolution Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/freeassociation.sourceforge.net/Tzfile/Europe/Ljubljana
+X-LIC-LOCATION:Europe/Ljubljana
+BEGIN:STANDARD
+TZNAME:CET
+DTSTART:19701028T030000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:CEST
+DTSTART:19700325T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+UID:foo
+DTSTART;TZID=/freeassociation.sourceforge.net/Tzfile/Europe/Ljubljana:
+ 20121003T080000
+DTEND;TZID=/freeassociation.sourceforge.net/Tzfile/Europe/Ljubljana:
+ 20121003T083000
+TRANSP:OPAQUE
+SEQUENCE:2
+SUMMARY:testing
+CREATED:20121002T172613Z
+LAST-MODIFIED:20121002T172613Z
+END:VEVENT
+END:VCALENDAR
+
+HI;
+
+
+        $tz = TimeZoneUtil::getTimeZone('/freeassociation.sourceforge.net/Tzfile/Europe/Ljubljana', Reader::read($vobj));
+        $ex = new \DateTimeZone('Europe/Ljubljana');
+        $this->assertEquals($ex->getName(), $tz->getName());
+
+    }
+
+    function testWeirdSystemVLICs() {
+
+$vobj = <<<HI
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Ximian//NONSGML Evolution Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/freeassociation.sourceforge.net/Tzfile/SystemV/EST5EDT
+X-LIC-LOCATION:SystemV/EST5EDT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19701104T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19700311T020000
+RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+UID:20121026T021107Z-6301-1000-1-0@chAir
+DTSTAMP:20120905T172126Z
+DTSTART;TZID=/freeassociation.sourceforge.net/Tzfile/SystemV/EST5EDT:
+ 20121026T153000
+DTEND;TZID=/freeassociation.sourceforge.net/Tzfile/SystemV/EST5EDT:
+ 20121026T160000
+TRANSP:OPAQUE
+SEQUENCE:5
+SUMMARY:pick up Ibby
+CLASS:PUBLIC
+CREATED:20121026T021108Z
+LAST-MODIFIED:20121026T021118Z
+X-EVOLUTION-MOVE-CALENDAR:1
+END:VEVENT
+END:VCALENDAR
+HI;
+
+        $tz = TimeZoneUtil::getTimeZone('/freeassociation.sourceforge.net/Tzfile/SystemV/EST5EDT', Reader::read($vobj), true);
+        $ex = new \DateTimeZone('America/New_York');
+        $this->assertEquals($ex->getName(), $tz->getName());
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/UUIDUtilTest.php b/vendor/sabre/vobject/tests/VObject/UUIDUtilTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..d33a8794607f947ca72bdb667469cced2c507040
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/UUIDUtilTest.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace Sabre\VObject;
+
+class UUIDUtilTest extends \PHPUnit_Framework_TestCase {
+
+    function testValidateUUID() {
+
+        $this->assertTrue(
+            UUIDUtil::validateUUID('11111111-2222-3333-4444-555555555555')
+        );
+        $this->assertFalse(
+            UUIDUtil::validateUUID(' 11111111-2222-3333-4444-555555555555')
+        );
+        $this->assertTrue(
+            UUIDUtil::validateUUID('ffffffff-2222-3333-4444-555555555555')
+        );
+        $this->assertFalse(
+            UUIDUtil::validateUUID('fffffffg-2222-3333-4444-555555555555')
+        );
+
+    }
+
+    /**
+     * @depends testValidateUUID
+     */
+    function testGetUUID() {
+
+        $this->assertTrue(
+            UUIDUtil::validateUUID(
+                UUIDUtil::getUUID()
+            )
+        );
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/VCard21Test.php b/vendor/sabre/vobject/tests/VObject/VCard21Test.php
new file mode 100644
index 0000000000000000000000000000000000000000..9c6994da42d38251740a0bb86168c03bc715ecec
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/VCard21Test.php
@@ -0,0 +1,52 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * Assorted vcard 2.1 tests.
+ */
+class VCard21Test extends \PHPUnit_Framework_TestCase {
+
+    function testPropertyWithNoName() {
+
+        $input = <<<VCF
+BEGIN:VCARD\r
+VERSION:2.1\r
+EMAIL;HOME;WORK:evert@fruux.com\r
+END:VCARD\r
+
+VCF;
+
+        $vobj = Reader::read($input);
+        $output = $vobj->serialize($input);
+
+        $this->assertEquals($input, $output);
+
+    }
+
+    function testPropertyPadValueCount() {
+
+        $input = <<<VCF
+BEGIN:VCARD
+VERSION:2.1
+N:Foo
+END:VCARD
+
+VCF;
+
+        $vobj = Reader::read($input);
+        $output = $vobj->serialize($input);
+
+        $expected = <<<VCF
+BEGIN:VCARD\r
+VERSION:2.1\r
+N:Foo;;;;\r
+END:VCARD\r
+
+VCF;
+
+
+        $this->assertEquals($expected, $output);
+
+    }
+}
diff --git a/vendor/sabre/vobject/tests/VObject/VCardConverterTest.php b/vendor/sabre/vobject/tests/VObject/VCardConverterTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..9e7b2df3c5fb5898d3495313654c93e8a89f5777
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/VCardConverterTest.php
@@ -0,0 +1,531 @@
+<?php
+
+namespace Sabre\VObject;
+
+class VCardConverterTest extends TestCase {
+
+    function testConvert30to40() {
+
+        $input = <<<IN
+BEGIN:VCARD
+VERSION:3.0
+PRODID:foo
+FN;CHARSET=UTF-8:Steve
+TEL;TYPE=PREF,HOME:+1 555 666 777
+ITEM1.TEL:+1 444 555 666
+ITEM1.X-ABLABEL:CustomLabel
+PHOTO;ENCODING=b;TYPE=JPEG,HOME:Zm9v
+PHOTO;ENCODING=b;TYPE=GIF:Zm9v
+PHOTO;X-PARAM=FOO;ENCODING=b;TYPE=PNG:Zm9v
+PHOTO;VALUE=URI:http://example.org/foo.png
+X-ABShowAs:COMPANY
+END:VCARD
+IN;
+
+        $output = <<<OUT
+BEGIN:VCARD
+VERSION:4.0
+FN:Steve
+TEL;PREF=1;TYPE=HOME:+1 555 666 777
+ITEM1.TEL:+1 444 555 666
+ITEM1.X-ABLABEL:CustomLabel
+PHOTO;TYPE=HOME:data:image/jpeg;base64,Zm9v
+PHOTO:data:image/gif;base64,Zm9v
+PHOTO;X-PARAM=FOO:data:image/png;base64,Zm9v
+PHOTO:http://example.org/foo.png
+KIND:ORG
+END:VCARD
+OUT;
+
+        $vcard = Reader::read($input);
+        $vcard = $vcard->convert(Document::VCARD40);
+
+        $this->assertVObjEquals(
+            $output,
+            $vcard
+        );
+
+    }
+
+    function testConvert40to40() {
+
+        $input = <<<IN
+BEGIN:VCARD
+VERSION:4.0
+FN:Steve
+TEL;PREF=1;TYPE=HOME:+1 555 666 777
+PHOTO:data:image/jpeg;base64,Zm9v
+PHOTO:data:image/gif;base64,Zm9v
+PHOTO;X-PARAM=FOO:data:image/png;base64,Zm9v
+PHOTO:http://example.org/foo.png
+END:VCARD
+
+IN;
+
+        $output = <<<OUT
+BEGIN:VCARD
+VERSION:4.0
+FN:Steve
+TEL;PREF=1;TYPE=HOME:+1 555 666 777
+PHOTO:data:image/jpeg;base64,Zm9v
+PHOTO:data:image/gif;base64,Zm9v
+PHOTO;X-PARAM=FOO:data:image/png;base64,Zm9v
+PHOTO:http://example.org/foo.png
+END:VCARD
+
+OUT;
+
+        $vcard = Reader::read($input);
+        $vcard = $vcard->convert(Document::VCARD40);
+
+        $this->assertVObjEquals(
+            $output,
+            $vcard
+        );
+
+    }
+
+    function testConvert21to40() {
+
+        $input = <<<IN
+BEGIN:VCARD
+VERSION:2.1
+N:Family;Johnson
+FN:Johnson Family
+TEL;HOME;VOICE:555-12345-345
+ADR;HOME:;;100 Street Lane;Saubel Beach;ON;H0H0H0
+LABEL;HOME;ENCODING=QUOTED-PRINTABLE:100 Street Lane=0D=0ASaubel Beach,
+ ON H0H0H0
+REV:20110731T040251Z
+UID:12345678
+END:VCARD
+IN;
+
+        $output = <<<OUT
+BEGIN:VCARD
+VERSION:4.0
+N:Family;Johnson;;;
+FN:Johnson Family
+TEL;TYPE=HOME,VOICE:555-12345-345
+ADR;TYPE=HOME:;;100 Street Lane;Saubel Beach;ON;H0H0H0;
+REV:20110731T040251Z
+UID:12345678
+END:VCARD
+
+OUT;
+
+        $vcard = Reader::read($input);
+        $vcard = $vcard->convert(Document::VCARD40);
+
+        $this->assertVObjEquals(
+            $output,
+            $vcard
+        );
+
+    }
+
+    function testConvert30to30() {
+
+        $input = <<<IN
+BEGIN:VCARD
+VERSION:3.0
+PRODID:foo
+FN;CHARSET=UTF-8:Steve
+TEL;TYPE=PREF,HOME:+1 555 666 777
+PHOTO;ENCODING=b;TYPE=JPEG:Zm9v
+PHOTO;ENCODING=b;TYPE=GIF:Zm9v
+PHOTO;X-PARAM=FOO;ENCODING=b;TYPE=PNG:Zm9v
+PHOTO;VALUE=URI:http://example.org/foo.png
+END:VCARD
+
+IN;
+
+        $output = <<<OUT
+BEGIN:VCARD
+VERSION:3.0
+PRODID:foo
+FN;CHARSET=UTF-8:Steve
+TEL;TYPE=PREF,HOME:+1 555 666 777
+PHOTO;ENCODING=b;TYPE=JPEG:Zm9v
+PHOTO;ENCODING=b;TYPE=GIF:Zm9v
+PHOTO;X-PARAM=FOO;ENCODING=b;TYPE=PNG:Zm9v
+PHOTO;VALUE=URI:http://example.org/foo.png
+END:VCARD
+
+OUT;
+
+        $vcard = Reader::read($input);
+        $vcard = $vcard->convert(Document::VCARD30);
+
+        $this->assertVObjEquals(
+            $output,
+            $vcard
+        );
+
+    }
+
+    function testConvert40to30() {
+
+        $input = <<<IN
+BEGIN:VCARD
+VERSION:4.0
+PRODID:foo
+FN:Steve
+TEL;PREF=1;TYPE=HOME:+1 555 666 777
+PHOTO:data:image/jpeg;base64,Zm9v
+PHOTO:data:image/gif,foo
+PHOTO;X-PARAM=FOO:data:image/png;base64,Zm9v
+PHOTO:http://example.org/foo.png
+KIND:ORG
+END:VCARD
+
+IN;
+
+        $output = <<<OUT
+BEGIN:VCARD
+VERSION:3.0
+FN:Steve
+TEL;TYPE=PREF,HOME:+1 555 666 777
+PHOTO;ENCODING=b;TYPE=JPEG:Zm9v
+PHOTO;ENCODING=b;TYPE=GIF:Zm9v
+PHOTO;ENCODING=b;TYPE=PNG;X-PARAM=FOO:Zm9v
+PHOTO;VALUE=URI:http://example.org/foo.png
+X-ABSHOWAS:COMPANY
+END:VCARD
+
+OUT;
+
+        $vcard = Reader::read($input);
+        $vcard = $vcard->convert(Document::VCARD30);
+
+        $this->assertVObjEquals(
+            $output,
+            $vcard
+        );
+
+    }
+
+    function testConvertGroupCard() {
+
+        $input = <<<IN
+BEGIN:VCARD
+VERSION:3.0
+PRODID:foo
+X-ADDRESSBOOKSERVER-KIND:GROUP
+END:VCARD
+
+IN;
+
+        $output = <<<OUT
+BEGIN:VCARD
+VERSION:4.0
+KIND:GROUP
+END:VCARD
+
+OUT;
+
+        $vcard = Reader::read($input);
+        $vcard = $vcard->convert(Document::VCARD40);
+
+        $this->assertVObjEquals(
+            $output,
+            $vcard
+        );
+
+        $input = $output;
+        $output = <<<OUT
+BEGIN:VCARD
+VERSION:3.0
+X-ADDRESSBOOKSERVER-KIND:GROUP
+END:VCARD
+
+OUT;
+
+        $vcard = Reader::read($input);
+        $vcard = $vcard->convert(Document::VCARD30);
+
+        $this->assertVObjEquals(
+            $output,
+            $vcard
+        );
+
+    }
+
+    function testBDAYConversion() {
+
+        $input = <<<IN
+BEGIN:VCARD
+VERSION:3.0
+PRODID:foo
+BDAY;X-APPLE-OMIT-YEAR=1604:1604-04-16
+END:VCARD
+
+IN;
+
+        $output = <<<OUT
+BEGIN:VCARD
+VERSION:4.0
+BDAY:--04-16
+END:VCARD
+
+OUT;
+
+        $vcard = Reader::read($input);
+        $vcard = $vcard->convert(Document::VCARD40);
+
+        $this->assertVObjEquals(
+            $output,
+            $vcard
+        );
+
+        $input = $output;
+        $output = <<<OUT
+BEGIN:VCARD
+VERSION:3.0
+BDAY;X-APPLE-OMIT-YEAR=1604:1604-04-16
+END:VCARD
+
+OUT;
+
+        $vcard = Reader::read($input);
+        $vcard = $vcard->convert(Document::VCARD30);
+
+        $this->assertVObjEquals(
+            $output,
+            $vcard
+        );
+
+    }
+
+    /**
+     * @expectedException InvalidArgumentException
+     */
+    function testUnknownSourceVCardVersion() {
+
+        $input = <<<IN
+BEGIN:VCARD
+VERSION:4.2
+PRODID:foo
+FN;CHARSET=UTF-8:Steve
+TEL;TYPE=PREF,HOME:+1 555 666 777
+ITEM1.TEL:+1 444 555 666
+ITEM1.X-ABLABEL:CustomLabel
+PHOTO;ENCODING=b;TYPE=JPEG,HOME:Zm9v
+PHOTO;ENCODING=b;TYPE=GIF:Zm9v
+PHOTO;X-PARAM=FOO;ENCODING=b;TYPE=PNG:Zm9v
+PHOTO;VALUE=URI:http://example.org/foo.png
+X-ABShowAs:COMPANY
+END:VCARD
+
+IN;
+
+        $vcard = Reader::read($input);
+        $vcard->convert(Document::VCARD40);
+
+    }
+
+    /**
+     * @expectedException InvalidArgumentException
+     */
+    function testUnknownTargetVCardVersion() {
+
+        $input = <<<IN
+BEGIN:VCARD
+VERSION:3.0
+PRODID:foo
+END:VCARD
+
+IN;
+
+        $vcard = Reader::read($input);
+        $vcard->convert(Document::VCARD21);
+
+    }
+
+    function testConvertIndividualCard() {
+
+        $input = <<<IN
+BEGIN:VCARD
+VERSION:4.0
+PRODID:foo
+KIND:INDIVIDUAL
+END:VCARD
+
+IN;
+
+        $output = <<<OUT
+BEGIN:VCARD
+VERSION:3.0
+END:VCARD
+
+OUT;
+
+        $vcard = Reader::read($input);
+        $vcard = $vcard->convert(Document::VCARD30);
+
+        $this->assertVObjEquals(
+            $output,
+            $vcard
+        );
+
+        $input = $output;
+        $output = <<<OUT
+BEGIN:VCARD
+VERSION:4.0
+END:VCARD
+
+OUT;
+
+        $vcard = Reader::read($input);
+        $vcard = $vcard->convert(Document::VCARD40);
+
+        $this->assertVObjEquals(
+            $output,
+            $vcard
+        );
+
+    }
+
+    function testAnniversary() {
+
+        $input = <<<IN
+BEGIN:VCARD
+VERSION:4.0
+ITEM1.ANNIVERSARY:20081210
+END:VCARD
+
+IN;
+
+        $output = <<<'OUT'
+BEGIN:VCARD
+VERSION:3.0
+ITEM1.X-ABDATE;VALUE=DATE-AND-OR-TIME:20081210
+ITEM1.X-ABLABEL:_$!<Anniversary>!$_
+ITEM1.X-ANNIVERSARY;VALUE=DATE-AND-OR-TIME:20081210
+END:VCARD
+
+OUT;
+
+        $vcard = Reader::read($input);
+        $vcard = $vcard->convert(Document::VCARD30);
+
+        $this->assertVObjEquals(
+            $output,
+            $vcard
+        );
+
+        // Swapping input and output
+        list(
+            $input,
+            $output
+        ) = array(
+            $output,
+            $input
+        );
+
+        $vcard = Reader::read($input);
+        $vcard = $vcard->convert(Document::VCARD40);
+
+        $this->assertVObjEquals(
+            $output,
+            $vcard
+        );
+
+    }
+
+    function testMultipleAnniversaries() {
+
+        $input = <<<IN
+BEGIN:VCARD
+VERSION:4.0
+ITEM1.ANNIVERSARY:20081210
+ITEM2.ANNIVERSARY:20091210
+ITEM3.ANNIVERSARY:20101210
+END:VCARD
+
+IN;
+
+        $output = <<<'OUT'
+BEGIN:VCARD
+VERSION:3.0
+ITEM1.X-ABDATE;VALUE=DATE-AND-OR-TIME:20081210
+ITEM1.X-ABLABEL:_$!<Anniversary>!$_
+ITEM1.X-ANNIVERSARY;VALUE=DATE-AND-OR-TIME:20081210
+ITEM2.X-ABDATE;VALUE=DATE-AND-OR-TIME:20091210
+ITEM2.X-ABLABEL:_$!<Anniversary>!$_
+ITEM2.X-ANNIVERSARY;VALUE=DATE-AND-OR-TIME:20091210
+ITEM3.X-ABDATE;VALUE=DATE-AND-OR-TIME:20101210
+ITEM3.X-ABLABEL:_$!<Anniversary>!$_
+ITEM3.X-ANNIVERSARY;VALUE=DATE-AND-OR-TIME:20101210
+END:VCARD
+
+OUT;
+
+        $vcard = Reader::read($input);
+        $vcard = $vcard->convert(Document::VCARD30);
+
+        $this->assertVObjEquals(
+            $output,
+            $vcard
+        );
+
+        // Swapping input and output
+        list(
+            $input,
+            $output
+        ) = array(
+            $output,
+            $input
+        );
+
+        $vcard = Reader::read($input);
+        $vcard = $vcard->convert(Document::VCARD40);
+
+        $this->assertVObjEquals(
+            $output,
+            $vcard
+        );
+
+    }
+
+    function testNoLabel() {
+
+      $input = <<<VCF
+BEGIN:VCARD
+VERSION:3.0
+UID:foo
+N:Doe;John;;;
+FN:John Doe
+item1.X-ABDATE;type=pref:2008-12-11
+END:VCARD
+
+VCF;
+
+      $vcard = Reader::read($input);
+
+      $this->assertInstanceOf('Sabre\\VObject\\Component\\VCard', $vcard);
+      $vcard = $vcard->convert(Document::VCARD40);
+      $vcard = $vcard->serialize();
+
+      $converted = Reader::read($vcard);
+      $converted->validate();
+
+      $version = Version::VERSION;
+
+      $expected = <<<VCF
+BEGIN:VCARD
+VERSION:4.0
+PRODID:-//Sabre//Sabre VObject $version//EN
+UID:foo
+N:Doe;John;;;
+FN:John Doe
+ITEM1.X-ABDATE;PREF=1:2008-12-11
+END:VCARD
+
+VCF;
+
+      $this->assertEquals($expected, str_replace("\r","", $vcard));
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/VersionTest.php b/vendor/sabre/vobject/tests/VObject/VersionTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b3d41b20078f17d3c8536aeee463b45e61ea5f9c
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/VersionTest.php
@@ -0,0 +1,14 @@
+<?php
+
+namespace Sabre\VObject;
+
+class VersionTest extends \PHPUnit_Framework_TestCase {
+
+    function testString() {
+
+        $v = Version::VERSION;
+        $this->assertEquals(-1, version_compare('2.0.0',$v));
+
+    }
+
+}
diff --git a/vendor/sabre/vobject/tests/VObject/issue153.vcf b/vendor/sabre/vobject/tests/VObject/issue153.vcf
new file mode 100644
index 0000000000000000000000000000000000000000..5fb0fa297c564d4f29f2ace82768859b129692fe
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/issue153.vcf
@@ -0,0 +1,352 @@
+BEGIN:VCARD
+VERSION:3.0
+N:Benutzer;Test;;;
+FN:Test Benutzer
+PHOTO;BASE64:
+  /9j/4AAQSkZJRgABAQAAAQABAAD/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQA
+  AAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAABQKADAAQAAAABAAABQAAAAAD/2wBD
+  AAIBAQIBAQICAQICAgICAwUDAwMDAwYEBAMFBwYHBwcGBgYHCAsJBwgKCAYGCQ0JCgsLDAwMBwkN
+  Dg0MDgsMDAv/2wBDAQICAgMCAwUDAwULCAYICwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsL
+  CwsLCwsLCwsLCwsLCwsLCwsLCwv/wAARCAFAAUADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAA
+  AAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKB
+  kaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZn
+  aGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT
+  1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcI
+  CQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV
+  YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6
+  goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk
+  5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD8J7JbO8tYo1tIFCDLOVG5qfdaVZRwmSOFWzyA
+  F4H1rLt5WViMhdp6HgmtKK8O3B+4Rhx6fSgBI9FtjaNN5aErwRjilSys7lFAt41xyTtqc2yJCVlY
+  7eqgGqv2jyLcebjZnGPWncdzT0+w0u5eQXtrGiBcIyoPmNMXwpb/AGMTSRRbH6YAyPwqK21GKdfL
+  BAVfu+1SQX4jnjKFsp03dPypCKN9oEaKSkC7R0bGKpnSlSPdHErZOORXV3Ouy337sCLB6kpx+FY0
+  t+VfyrgcbuCB1oAfoMemrcImq2sZX+I7ATXS618PdK1DRlvvDEaMq5LoV2nisx4LVrUfu5BOePau
+  m8EQS6PY3HmFXjljKhTzjOf1oA4mz8OxvMrLbW5RD8wbByKg1LRrRriRYY408w/KAMba1pRaWt/H
+  a6a7CVm2u7N8lUPEujzaRekzSK6tgqVNAGNBZJauY5Yon92GTRJp0ROY0Un0A4q3c2odkaYOMjii
+  KL7NIDGcj1NDAZBplmmWv1xnoFHStfS/DFpewqYoYm3DutZ8lv8AapdyOqk8EVteEbSe3KBSrDrQ
+  BT8S+HbawiiWGCAPjsuMnPesqHS4JSFlSMP7DitbXbvfrkkM2eGw3p+FMfTh5X+hr8w7t3oAhOhW
+  u8MkMZUY3fL0Heo9UsrN5FFrbxKmMBgoG41fWFra0Acjpzg9aoXjtgRoo29vagCoun27kbY059qn
+  bwykskYjRArdTT7GEl2UqMr2q/JtVU27iR15NADdK8DC/wBPle2iicxNg5ALH6Umm6FZ/a3ttQt4
+  g2Cqnb0PbJ+tamn3j6ZCW0nILfeBORWVfO4dhLw7fMW7560AZuqeHf7MuTFcRpv6qVGVx70q2Eci
+  QwyW0SsPvOqjJrUtb6S9tHQKGeMZYuM8VUs7gRxbrncy9mWgB1x4QtTHvsQWkHJVhhax3tkhugHh
+  UkfeAXIFdPZ3v2uxkQ9G4jI6/j+tYun3r2Fy6yxeb2Py5IoAqXenJ5xaGNNvXH/1qcLSGeBdkSg9
+  CcdaswC3be0pfexOMnpn2qaS1KQkQASKoydvLCgDNi09RKTNCuO2BxVjSobc6gqXMERQHkleDUsc
+  u9VADbG6qOWAp11bLbptkjlCkZRsde9AFi5sbO3kKfZYTnkHaOlVbuO2F5thtYcADjaKXUpHj8ku
+  Co2VDFL5wLeg696YFwQ2z7Qtlb8HJO0c1Zsr7T7a9kL6XazZ4CmMFRWfHdkEgjGRjPpU9raP5LSP
+  j5h2pAWdQ0+z1KdG+y21qvcRqBn8qXSvC+iTu63ssqyE/IAuR+NQwSrGm1g+c8E9qiSQW9wPNYYP
+  OR2oAW68GNa28k3lwGNHwvzDJGfSqM9nHBgm3j59QMVdmma4zIjsUBHy5OKp6o8s2BJjZjjAoAro
+  /nysbgYY9zWmLPCR+WQQwyaz4k2F/Pbft/GtKxvUeFN+B2x+NAEptsWpZSdo9etZe8su2X7pPFdU
+  LeOazKqVwevNYt7pw5EA5HIxQBQA8tAIeGz1NWIJvJlhW5OQBzjrUMR/eN9pwoXjB4qQ3ERJeYcy
+  9P8AZoA0jf8AmybVxsHAFS6jp63ixmwjIwOfrWfaou12GcDpmt/w5qJhXc6hh2GM0AZkHiRpblVl
+  G0RjGMdxXQ+H/E0Rm+bjdw1crqEHm3EksY4Y9PTmq0cskc42qUOfpmgDovHOhLBOZ9O+aEnIUdRW
+  QZft1sgum/1Ywua3fDfiFDL5WoEPEwxzzirPizwTFPZC60kYUjcAp4NAHPSq91EoRS3061DHD9nb
+  94Mkfw020v57GbcCRt4IIqzNcedIH2jc3JyOaAIYrRZmJxtNdB4fkGn2hluBgBR+NZ2n2X9ozAQD
+  5qvaxGbKIRXkuFU4C96AMDxBKZdQkuEUkStuUegpNM1eWScAkqpHTHNPlwbjMzExZ4Pal1PS/s6+
+  dY/6vuwPSgC9G8c0A+1xEknrnpUVxaeXNm2dVUfjVazvEZAEkMrccZzV1YYyBIhJP8SZ6fhQBSmV
+  4JfMVT+96UJdSQdcMO4A6fjVmTUoJiqTOMJ/q+elRyQs0TtaxF0PVhzmgCzpd55r7YI2HHPTmrV0
+  sDTF7gnJXGO4OKyNKgn80NbFhjoBzWjqdg6SISPmIBOaAKVnI1leyhsMJOD7CqOqRtZqotjiFulW
+  rhsSMshKH1ogsZbmF475TKifdf0oApabevHIAhCYOdxp0t59luS0I+995uxqpdRyWsrqmXGeCR/K
+  rVlZfaogqv8AvD/CaAIY42kV3K5zzn1p9jNLp6u/A80YPNWWsJNPAVpC4JAZT2HfFWJoVmVVjhVk
+  HTPrQBPoi2wsoo4APtBHL+tP1mS5uVEFxgJGNqH15plp5WmyBriMRsowM8UybXTNdbrpd6A/KKAD
+  xbJAGs44FIPlnd9c/wD16ynt/LiDW2SR2qa5vP7RnMs6BNuQMd6jhkAUb2K8+tADYp0fhj8w6itC
+  yQ3CFYeAOoqi8Uew+UMuf4u9T2NwIW+UgMetO4FmS6RJ1ik6HqxHAqC+gimUiA8DvjrU0kcE8ieY
+  itu+8c0+bShaWxksSZoM4b0SkBTgha0cq33Cuc1SvrrLFV6jpWqbuGe1HnnDdAKy7i3WSY7OT2NN
+  AMulWSV8ZDNzxV7SlbaFjClx69Kpww7W3ct7jpUtnNJHd5UjZnt1NIDdt7h7NQ7qGfpt7VR1XVEh
+  dhEpP94/4VpafexTy7ZlbBGDVHxFbQh1j04HaOTkdKAM5ZVlYso3E+tVp4w8gx0Bqd7QxNu+6D6V
+  DIoVySxAx2NAFyNmli2pjYBz61paW3lWrFS3BwP8/hWJbTBFJy2D6HgfWtiTWPsqxraBHyOeBg0A
+  RSoLSTdIepzz0606exTWyQGMXljORTNT1B7+ECZR5fHzDqapfbHjbFkTsIwSTQA43ptyyS44Paun
+  8N64Z7Bre4YlZBtU5+7XLTQbjwN4Pb+IfWn2lw9uyrIw2Z5HpQBv3GirHc7LxWVZOVI71FNp7WDg
+  QYlIIGD6VvaPdi+tljb5yeAzcn8DT9YtbPSpVhDM87jJ3Htjnn6UAUIrJreD7Si7MDoKhv8AUxqt
+  pGt5GqIOr9zRfLM8ZFgZGtex2nGe4zWKN8rsDhYx2JpJ3Atx+HxcRSzWcpcL/CRwaj0zW1sQy3cS
+  nsFPSoYJpbIl7dm8tT8wzV7+0hqEO1Y4lQ9cqMn9KoCp9kW7kaaxU+Yx+5j5etWrb/RGxfr5bkdu
+  lW7KFILpfspDbVyc1fjNnrLtHqOYWP8AFjGfxpAc/e6Ql/GzW4AfqBWfpupS6Xer5vPlHmMjg10V
+  5pp0u4JhYNGvAYHrUn2WLWrVo41AvSMRZAC/8CPr1oAvafdWOuNG+lqDekY+zg8MPXPX/wDXWZrF
+  tcWNw0erKElB4Rf4R6c1BpqyaBdbrnEcwyAc4x06H0rQS9a9jUTgOXPzMwycexoAw7u1jYb3zkU3
+  Srtgdk54PFamv2C2pDQbWjcfKCeSa56aJld23YA6ZOKFqBrXGjjULuOKxKuZOTn+H/OKwr/ztOvs
+  uCrg7RgVLYapPbXAEW4EkHJNdBNBH4gtgyhFmXuw60AVpbT7VpiPJ94jLetQWsDRSIYz8mec1c0+
+  1nexdrw7GjJXk/epsFtDPG0bOdw+b5SaAKWsXA+14Y71FQi5S4RvlAC8A0y5hHmHarhvQ9BVGSQx
+  sUXPHX3oAmDCJ8rzgHg96gQ+ZGWbg9vahNRG7EnalkkF6hEXyD270MCWF3aEhdue1OsmNnMAih/r
+  VaBgAUY8561PaubdnMxJXseuKANhIY5Assp2v12itZtAgubEi2nb5xuKYHWubstQaO6SVzujTqpP
+  X8K2rXWLRF8xZJPMfjAzgUAcxcNiaRSpUocc96sW+yNgZCMVF4lvJdRvTOYkj52jbgZ98D6VWmlY
+  2qCUnJOKaVwCzviibANwYc8Utkdl7tbKhjxmpUspvm8tgn16ipigSEG4G4pxu9TSA27GeFbRlGGm
+  P3cdhUN8GEP2hV3JjafrWfpU/wBmuAcZLA4/Sr1trkarJHcRmSEZO3uTQBmrcbZCLoDZ2x1qOHSi
+  yebJIAPQipp4kmbzI1EQJ6GtCxsoHP8Ap91GB2yDQBlSWO+M/ZsBHHzZ71XkfMIWNgGU9vSt3U9N
+  t9m21uonz0Iz/hVCfRkjg82FhtHDGgCuZ8EMjDZjBzSZ8pAwU7XbGT0pWtEjjAZgV4PFOml2QKqk
+  OoOcU1qBNYRSrdkrhw3BIrah8KwXoV/m3PyVzyDWNp999kccgZq/ea7PFAGgZlJ6EUgN23thpdi4
+  V1Eucr7ev9K53V/ER1a/MkuWdBtG04zioLrXJ5wDK2XAxmqVqmZ2YPtHJ/GgDsvC3i0ppr2d2ish
+  yFAHIz706bRLNdOPnErKw4y3NcvZ3pjA8o4kB61o3OpSX9nbx3QIkU/MwoAj/sGaPzFjlWSJjk46
+  ioYYwqssjIHHAHpWm4ESN9nYDIFZV+I7uVI1wrY5b1oAtafcvb3W4MM9Nx6U/VZpNRys54ToU4zW
+  KXaDKrJuC8cVdtpi1gzs43HNAD9N195bdYtRIUR4wD1NX2KuA9uThuSQelcsZwzq9xyzfezV/SdX
+  e3m8pXJhkPKkUAdYZk8RywjVVJES7U2cE/WtA+HDHohuY3Uxg7RF/GeaPBlxaawMW6rHKnAU9SOO
+  lX/FFv8A2bpzTQk+cpAAz93nrQBx+r4c5CODEOA3Y+wrKu5V1C1GFKznkk9K6Wzv49fs8Xf7y7DY
+  MhGNgrmtX0s2t66WknnKvUp0/WgCnbrJFdot0NwJxkDFdDYp86oMjjIArJivxbR7LuMyEjKitS21
+  MW8auuW44H93/PFAG15aXdr5Uv7uULkA/wCFc+Yvstw0at8+eoq/p+rm6vRJMNwIx9KranYySXSy
+  WEZZHOCw7UARXFyj5STAk7ntWVf2gALLyfUVoataLbfLO2SO/Ws2c+VwhLK3QDpQBmz2xAyCG56d
+  6uWPlnCkFcjoTzUBkMc/3cZpwn8oZkDFs8HsKALN1apDIHOeaiLkRkMOtSXE6yxAsRUcdxldswIJ
+  HANMCuJW8xQgOP51oacWPPGAeRUUOIZQzDhecd6mbIcbPusM0gLmq6bHPohlhDeZuH4c1zzF1+Rs
+  HByDXTae0s0IhjjZg3GPWqOs+HpLCTbNGyb+cHrQBZitjPEzW/LL97vinw2v2m2aORec9AKXQbsw
+  ygBBiX72TWxfaS8kiGFQAwz8vWkncDlbqNraT5cjb/n+lMGckx8kjOa1tU2TxkPkMpxyKyrhJ4Wa
+  KIDbTAkgvIp7URzgBwe/BpZYrd4vmZWNZ81x5cgBXDdzVlIvtUOGIBHpQA2aEROpR8DsB2q3bvG9
+  iySzEsTkLnrVMqViCZzt7nrT7GBVuQRnODQA6Q+Sx80A4HApEJB3BAR9K19EmhkvCJ0ZsKe3tUc8
+  Mc1yy7cpn6YoAzoUiclnYYY8AHpUl8zRxqpPy9qtC2tULgSMAvQ460lzIl9b7YiDt4GaAKMMQlJ5
+  z9Kj8gIW5yKnS3Crlzhh6d6k0mbyZT565Q5z60ANtrRpPmhzWhbwy7DJcDhhwMdKlt7aK+gb+z33
+  yKdxVuMCqaz5cqGYfWgB6yu8rBB8o6Gs/UpjGQXBGPTvVmSfyImyepqrqjbIw3WgCDz1ib9yOTg4
+  NbVlNBJYvlVBHt1rBaPzQWU4IHSn2FwRJslJxQA6e3M0O4oAzdB6VXR2iKGQENGOK0ms1eAkFjF/
+  BjrVGaAo371smgC7pety2kwl06Vo5AOWXmuwm+Itv4g8Ota30aWlySAJQfmkP/1zXIeG4Y5SVBB3
+  evamXGly2tydwG0nKkHpQBZ86fRbpBLI252y4PGRWhO8Ml1IbJhHn+BTnNU9O1oRwvDqqhB2lHJP
+  4U6awb+z4JdKbzdh5ZurDHtQBat5LaRHiaOP7QejEZKD/Oauy+FI7W3Bsroyhxkq3QH8q5a7ujM8
+  nWOQnBqTR9burCT98xdR60AbbaHc6ZG3ymJsZC/3hVnw/fNIXt7hygHzZp2oeIBqCxzqfmCgEe3+
+  RVdrmLVAEtf3bxfOW/ve36UAV7+7DXMu5Q4/Os2e3eRWkiAGOijtWrPodxfQmeNVAPOPWsppJIpi
+  JxsKcY9aAMwRyTSbpflx68VOYvOXb97OKtXAiZdzkqT0AGc037BIIRLHjsR60AVprZrZwGj4qTY0
+  xyRj3PUVMJDduFfqvFRzxJCzrCzEr60ALEu+YI53c4qeGB7lGCnBU4FUopTBLvfk1at9R2sAMjNA
+  GtaXsnhy2FzPHvC46jgnNQ33imTXrkz3oVFAwo9Kfrtq03hAzEfJ5gyc81hWM5hhKrhgT0NPcByS
+  P5g2uVI98Vp6X4uuNGlyzCQIQR0bI7/1rNQxqW+05J7Y4qK5ZYUP2ZCW9TSA7SR9M8V30X9nMFZw
+  WfcNi5qPWPDtjo0pE7O03U/Mf055rmtFmN9E0DEox+atPWbiW7lSO8Ja4jQbcDC4A9PXFADYtM0+
+  6nc3u7aOm3IP6Vnak9tYt/xL/M445zTIbieOdmWNsE46cip42EkyC4hYx469KAFsrT7XEJgFPOT6
+  1s+H9PD3XlzxnL/MDtqn9pghgb7GjL/eJORWqfEnmrA9oFRoxjJ5BoAp6NqDW2pzRXtuyIAw3FMf
+  rVS4iF08pydmeCDxWvqeuC+Ro9qglcMw71mwReXD5aAlFJPPU0AZ0cEsbkSZKH15FD2xJJiJVj6c
+  VfnzLGEXAA71PFpDPaebE6/KOh60AYVws8TBgrFe57CmHUG25RVJA7AVozzSLbNvX5T1AHNY/m/Z
+  nPlqwDetAEtvqzJNu3FZBwQBjI96vPqkd3mRtokH31UYx+VZqWruxaFl+frkZxT1tvs1ujJgEH5m
+  PR/pQAXl2S371XAHI+Wkaf7VD8hGR2arKySylRccQ98DmiS0jifdsdgeODQBQd9x3IBx1xTYlBm3
+  En86sXUAwPswKg9QeaBErIEj6nrQC0NHRtUjt0K3AHzDABGcVW1fTzJL51jyOpz0NVooispebBI4
+  wK2YFEthk8qR07igDAgJil+TKtnnHFaP2h5yI3ZsgdSfaqd2P3im3BGM9aktsjmRgCOaAJZrMwR7
+  3A5PT0pdMvZtOning+byzuVDyh/A8VHczSzDPy7RwOKgiuHEewjKeoFAzp7TUNM8XXEw8RhYNQmP
+  7ny18uNeOM7cCtMfDiS8uY0tDEYghyynjPbn864htP8ANhLIehzWzovxDvtFsDB9+PI4I/rQI0r3
+  wNc6DO0N2VaQqW2q24YxmqFhYRgE/vkkDfMGBBP4GrSeJ7tZd6SxvIfmK4yQP84p0XiyC71gS65G
+  00zAKGX5Qv4UAbFpd28WnIsBLsDzmub1+AXt1LJEoQqfu4xu+lbWsWgs4/NsCXjPIbqK5+5kklmE
+  rDD54BFAGb5cjybCrAnnB6ipEvXil2sM4GMVpFY7m4UNmNyOWJ4qteaM0BISVZe+RQBFHC2/zISg
+  B69KlIVhIHA3HuR70lqotlBulY5P4Vcls44k3u6N5oyoHb60wM6O1SRir5LemOKv2vhuW4iLg7VA
+  6k4FTR2ax4aaVIwR3HWqGua5PcQm1WRBH6jqaQFzWbE2nhzynuIi+8HaHyKweJSEQEN6jpVcKyOw
+  cMVznOeKmtZvOPDKuOKAJbi0JYFf4eue9IW8sncfvdqnlvVFyFyu09abI0bysMZx0oArC4eCTcgb
+  juK2dNvE1N1M0ohljGQzc5A7cfSs6aweWAk7kTuapQysIT9mOSvG49aAOkvzLMxk06QNuG1l7j3r
+  PlnnJAuGJij+nNQ6XqT7wEYqyn5v9utLULaW7j321uiEjLqMkKKAIotbghb/AI8hKGPIBHNXLG6t
+  7uzk3RLbKG/iP+Fc+8f2d1eFztzyD2q5p2oCFWRoxOX52nPFAGgLyC2lyZFKdB70r69buxRJBHjr
+  nvWVdeXLE7xE8fwnoPpVKZUnQPkBhwRmgDq7a9tLyARWiiWYngL1qG4gurJ28+NowO2a5a3v3smD
+  aa5WUd1HNbC6zI0KSX13JO7D5lbHFAE4V7pi0b5x1GazdUtXSM7v4iPw5rQ0/XrcXX75FgUdxzuq
+  /qFrp+sWRe3uDkc4BFAHLRDY42ycd6uPOXiiV+RGPlWnXOg3IQvEmIB/Ft6/jUUEZmMcgydvzECg
+  C1G2+Ly3YAvyM9qY88kaFcmmp807uwPJ4FS3do+Fzn5ulAFVrjbgS8Z4yah2C03SMffNWZdPknVA
+  iluQOnHWmX9pILvyY13HHK46UAVre7LSyOCTmtjSiy7VijLeZ0IqO08OzPIUiTI74Ga6bRP7O01F
+  h1KYJOv3V4BoA4zU1lExMrkbOAvpVcSifhjgrzmtjxPp7pO7SggOcqfUViy25hG5fSgC8rrLAojb
+  d7d6SexlEgwpRfTNV7e5LFBbKAwPNWHeX7TguxI7GmBPBExhaNVIJ6egqOVknO1fkx1J61aj1gLC
+  UEKlk4LVWvozC67kCFxkD1pAQ24e3uDLC3z9CR3H/wCqrczJdOGiOxvYc5/CocMYhtUBj3xU8Qjk
+  XbKPIZOjqclvzoAu2HiO60xPKvd7wY/1fGBWnJo8WuW6y6XIPMYZEAzuH9KxISonAuzuRzgk9qtR
+  79KmMuhTt5cRyxznFADLzS2tMw6pAY5OoDEZ/Sm20TQQ74YwVQckGtMatB4kUpqreVIRw5+8aqXF
+  jc6bAsbD9yThWz94UAOmmjvrRCMJjOQRVS0sD9pLyABM5Of6Vdtrdn+RUGcZqO6uRBG0MuFI79KA
+  MfV7r7ZqDI7kohAVT6U2eJNimJQOuTnpSXFussrMvBz1pJov3YUsR9O9ABblRncQ3bAqY2EUwIiA
+  Vqr20ojfYqZx3q9bSKAGcYJPIoAoq7OCEQBffrRDGEcleM8nNPjuGkhHmbB74ApvmxltsuTnuDQA
+  +SFEjDwu5buD0qpLL5vMg2kEdOlXECMAyZGOMMePyprQRI5N0rt3BXO326UAV4b0Wt0pC5HrXS2W
+  qq9zE7jcO+OhFc81kbg7iMqeAFHSpLa8eymaNOUIwD6UAavjPQYYybq1bBmXcF9O39Kw4iXdDKcE
+  DAxW3q7NdWELISdiYIz71kz6ZNZNHI0cjqQfujIFAEtzAtu/7vODzmqlyzNyAo9vWp7uWSWJd+AM
+  jjGGqOWCSWRVVW2+uKAKskpWU5TP0p8c+ExsPPNTmCVD+5U/QrzRJHJGymeOQc45HFAFczh497KR
+  jirWlEsAudvII9znitEeBp7yAPZvEVPJUsP5ZqCO3j0yYDUNwliI6dOPpQBt/wDCR3Wj6eHFujvI
+  do3DIX9KoHXoL6J11CJYZAONlaWueIYtY8Nwx6ZHu2MdxVeTXKG0eaXKRuCeuBQB0mn+HRe2Yeze
+  MqRkFmwfyra0rwsIrRmvZICcgDLVw7xXFuFd2uEQfeAJAxUkkjSxh4J7gjPAErf40Abvjq1i0y4S
+  KByCdrfL+FUI7SR4Wc+WzMOCW5qhf3Mt9cCV2ZiihRk5qpdTSBgRI+R2DnFAFw2k6AqJZMjuD1qn
+  cxzyyAkPuiP3ieT/AJzV+01R7a2RpMZPVmGQ1WVuTqLDCptcfMBwRQBEkst/YMCSTH8vJqtJaoYQ
+  JPv1o+ZDZKAo+UnBpmrCBpRNp4/0crgZ9f8A9dAzCdGgkOynxSus2xjkj+L1qW5/fxYj+8D+NRWz
+  R4fzCd2O9Ai0lzI6mPaMOcZqW4uI7rbtJ3IMc1XScKqncQT0olPlKWfBz6UATKjSDcmdoFWtPCyR
+  kzckHiqUV0623lKVIPzHHWp7Ic/vSRz0zQBcCqdyT4J7YqC3uZdKv1a2UupO7B6H2NMglMUsmcnd
+  0Lc4q3BmaMBiDjr60AWJRBfyb9P2RueWJ6KfQVLHqMdtcEysxJXayN0x0yKyWihWQBdwTOSdxHNb
+  zWEF5ErXhX7QQAMNge2f0oAnhs4rq2kksHwirkg9SfauXnJnmL3AbL9jXSRWh0N28x1cEfMqtnA/
+  Cs+70+O9/fWRIb+76fhSTuBimbyyyKDgnipLk7AML1pZbCWO7Hnjn26U6ZykRL+veqAryuvm/Jwf
+  Sk3mo2AyHyCT6Ux5pLU5Gwg88gGkBPNAILUO3KmooyjL8ueegzTvPMsRjG4qBwKrW1sxJZzsIPGa
+  AJbmfp5q7MZx71NZawEi8qZSyHg4NRGLzCPtB3eme1R3Nutocodyd8UAaVtqEUDlI8/N3PaqV2Ht
+  X2x4lIOSwHFSWkEFyo+cD1BpbmNbNdkh20AMh1UiJ1c9RzWj/wAJa1vYiK1RmRvvetY5gDENxgnp
+  UlhN5TiI4O4845oAmu51lXzFDGQ8jnpTra4uJkBAOQavXvhG8tIhPawvJAfmY9gKE1COwgIiAZiO
+  3rQBV866T52Qsw6YrXguZNTs0WSJ8IPnHr9KwZNamNumZSpPU4pbPxBeRy/uJjtXqfWgDodMtnXK
+  QjYeo3VnalpiXjMzXMKS9O9VV1ydCXkmLY/SorWwTVJTmQEt81AHTeCY49Mik+0SJKmOg71W1bxH
+  HLdgaXaSRNnjdzWapGlBBG2ec4GKtQ6yZD5hjLMvbIzQBfutWC2ajV4ywwN2OM/Sql/JY2kKGzU/
+  McnBBqlf3Lam5e8lKMv3Yz2FU4VjgzsGQ3WgDa0ya0u7kxzgqCCcn1q43hizkEjRkOoXcAOua5Ka
+  6Mc3ygEVb0nW57ac/ZC4Xuo5zQBBeZjcwuMxRn5fUUmnySx6kv2cgg98deK1LjT31pTLpymSVuWi
+  Xqv17U2GzFgFBUCVOo7igCTT7cnTp/ty5ZnyCvGOKz2uwimOY7geQB0FWY7tzu8xiqk8A96qOvmy
+  MSowOc0AVpkkgk3uAiP39KkjtonYtnO4cKOP1q1Z3K+X5V2N6OeM8gfWiewaxiKhDsAyJB2oAk0u
+  1juAwniYshwoB61FLZfaJDv/AHWexpulXRNwpjkP7s8nu1Wd4uC7zfezxQBTjxZTHzlMigbdy8Up
+  YXEv7nPvk1aNqbhDhgARnFZMCvbzuWZgc/nQBo2l6qs63AJA6VIsiG4DI4jXP8XeqcbrK5JH3xkH
+  0pWhWVR52CF6UAa8kUd7H8rD5f1p5txHAfNPasWRCjgh8D0BrV0a+DgCdfM3DaB9RigCml/JFPyB
+  159xV+C/wfNHAbtUN9orxO3k5dhycfw1XmT7JarIjb1k6U2BcuNSVGDSAPu6be1QTXcO0CVSwbPA
+  7VRtpftEmxW2Mx6HvUv2V1J2jkdaQBFJB5jBVYemetRyW6SqTKCfTFNllCHBX5vWkLBPvk4NADTG
+  0ePKB5qdLN5NjycqvNQIpZAFVj71LsaJQBuGaAH3aCVwycKODUMsZgJjxv8AXIzUs0DpHhmBycjm
+  gOd37wdRjNAFETeTcARAbSeTViApfrhjufHXNJNCsUu18Z61Xit3Q5JxQBdW0MYKyn5hSf2BPIjS
+  24I29T6f5xUMMrs5HOF71ooVmtMyu3ynAAzQBqeCfG7aaPsmuYkiYFG3HseKq67YQW2rSNpLCS0l
+  GQ5GSh74xWZc2SyxK4OZl5x7d/0rV0K+j+xPFOu4Pwpx0oAo3OnFreM7AR9Kp/2eYpxtyCx6VoXd
+  g2nSlQzMh6UxJdjqSpKgfN6mgCOLSZGkKyYw/wCn+c1YltRodoWA+Y8Z+taPhWz866DQqxLdmq34
+  x0ZbS23yY3NgkUAcZcSyrjcc7zw3YU62meOeTazdOhrZ07TYLkYvSFVfmqveQWkDj7CW9zg0AZs9
+  8wbO3L8ZpvmGRsyZQDsO9WLu0EwZojwMc1DJCrsA5we1AFmGVZLc7Y1bA6nvU1gIyNzgxtnoKr7I
+  NgHO8dx0pJ3AYG3UnHegDRS+NpL5lsxh3dQverj38OtL/pKCKSPhWU/f+tYEt98xMnC9qgludrrJ
+  GzFl7DvQBq6pYNGdzHGO3aqS33kEBhlSME0+01z7OcXGXRupJ5H0q5fafFqNuJLLnofmGDRsBmJe
+  DzMEZGevpW7o8sN/bzLqTBML8oB71k/2YYh83FQRqbdtr7sDv60AX7jSo4ZsiVo067hj9anuNHey
+  jVizMj8gkdaqQyi+UxjO7O0A96tXDz6rEFucp5HygUANGEQKjDJGaqzWbzgyn5QOPY1p2xZtOaGN
+  VMo5BPoKqxa1NHHtmij+Q4xkUAUraZFiYScMOgNMf76CIZHf2q5KRq8arEjK4OTsGaki0oKwAEhP
+  uDmgCohEsqq/O6rrMNMj3AEdgfQmn3tqUgEcaYz1JFMtLdn0wpFGxYHhjQBa026M0XM2WQ/NnHzU
+  6Yw6tCPt6rbpH0CdvzrPtrZ45ceU4cHk9qtzW6XLOjqwY9+1AEa+HWun8zR28xU5LAZx+VLaGSV9
+  jrkr145amvEY4hGkjKMg5XoPY/571vaHFDr95HHqDMkoU4C9G+uKAOevoo5iSBjBxVYwLdRkL1Xt
+  XSeK/CdzpkjRMqyJ95SjbsD3rmJbUwoeuGOCfSgC9eWc9rcbbdA0KHPmhcq39Ka8e9DkBS5zk1X0
+  /wAR3dvEtuTm3AwVzW/D4w0xIEivbOaSTAVWBAH40AYMu6CZDkFcHcTz6UrtkYlwVHIwOtb91olr
+  qtuRZSL5h5EX8VY97pc1jKAqZ2jB/wA/nQBRJhubjE4YOOnNMC+S+DzmrMkIA819wPTbjmqwfzcM
+  4w3vQA9mbYwgIz/ENvSm2t+6jZsYKeTkVYjn/eqwGAOp9aeW+2sdkgVf5UAQLKY5MHGferNv+6IM
+  XT07CmyaeZIS1vtmkUdQKbZ+akOZoyqMe45oAvRzjUJPLLgSds8/zqyPDzwETagy4U8YwARWMbcw
+  NuDDePenPrbXEfkTn5hwrdqAO709LPSbbzlZdvqD0Ncnr/iufX793uWQrGdmFGBjpmstdQeFRHKx
+  2Nn5f73+f61E7iLCxDnrjvQBaubtNypAxyRzg0q263DMsJIzzyc1mwyDeSD82e9XIGUIrSyBNw+X
+  2+tAD3tSpcFvufrVZbdL2XbnDdjnGKnhs2nkYtcIEJ6461HMiJIApBVe5HWgB8mmtpzDzSrrkZYU
+  65mRGYoBgirEkCStiJlC7c5IqjLNsYhtu0d6AKkshbAZcAdc81Gdwb5SD6cVZjYy5WXBVu/pWppn
+  h63urfdLdxR47MDk0AYjnhehxntVq11OVANuTj8q2/8AhBZ7mwkm00CYKQBtHXrWe+kTWS7J4zE+
+  OQ1ACQX/ANrkC3DD0wODV280KQwM0jxheueKdZWcCrvkjYYHUHvRe6jFLapHtLKeDjg0AVrDQ5xd
+  xuhIUEMHx8pH1roZtH+2W+dPIbHDMOcms+81YNoqWltlFKhQD1HNP0e5udHsHFkcyMRkDoaALUPh
+  aa1n8yUgqRgjPOO/eq+reDkvHzoQYIB85JzzW5HBLqWmCSWQJM3UEdB3/Sk0S3uNPmIkBlgJyXAw
+  o/Ci4EHh3QYfDsfm3mHklGGLdFqS91HSYpvMw0jjkhTx/KqXjLUg8hihYiMn746H6Vg+QYxuV9vH
+  1oA3xrem38TNe28rqp+VUyD+gpbTU7O6ylvEYoEBPzjDAjp2HeuUk1aeyfNqMH+8BTrvVhqEAMuP
+  O7n1oA3X1Q3U0klp5S7OGHFZt7rj4DwxlTJ6riqMTiDZsHTn6/WpbfU5EP8AxMVMqdFIOMfWgCZb
+  lpEO/GDgn9K6bwZpktjcC7lUsAMYPvj/AArBi0lrpc2sqbZsHbjkV20SvDp8UUZBcDp60AY+ueIZ
+  dIu3Frh0lbD+YNxAPXBPSqLrpuunyNPBSSM7mZyQpJ/KtWQ2uqvNDcjypQjAFjnJx0rhNYhntbvy
+  7jcucgIe9AEUMOy5ImYgg4xViVVa4UFSoToc9a6DxZoEdqv2rTsHzDlx/dFcujFpG27vlPGe9AEi
+  anPpV359o7b143jqo/yP0rWs/FSavF9l1JltlB3tOerd+axl3XGfMXC9896iu7UbtyYIxg0AdTc2
+  Vrqe3+zZxIF4Uj+I1S1Hwpexu0kts8aL7Vg2t9JZ8REjJ+UD+Guh0TxjeaW3/EwAuFAxh260AY8y
+  ujfLkBOCOuabHcqgCxYAbrz0rsbSysfHdzks1rO33Y0AwTWd4h+D2r6M5mmt0ER5D85P1oAxLfWZ
+  LSYrbnAb5eKnudVnyELFkHOcCqUmjzRzBWyD9K6W38JtLo6TtkLzmgDHtryGZiZUDZqDU1Vl3wp8
+  g+9jsf8AOKmGnw2cpE8jFR1I7VdGjRXMQa0kdoSPmHrQBn6bYnWz5NydjgZVgORWeztBK8ZBJQld
+  x6nFdZ4ZtoNI1QPI7O+OB7VX8faO9rdC7ESrC4BJHqaAOcgUTtuORiraW0M9yiXLAIeoPc+1RWar
+  u6Haxq7e6ekEZkBGzGVz1ptgVprUw3ku3iJDgDPUYFEzAwZRN2CDgUw3JEkezD7+xolvytwn2pVV
+  RkADv060gLVlMk4aLIDHp7+1Vbu1+yzgThiHOOelElyIZl8v5CDkVtxWkGtaYs0bMblCcr/KgDCe
+  3LzsN20L2HepUQJnHI9KsX+gT29pHKCd79qWw0u4aPcwU4796AL+meIr2G1aDSbiWHOMhR1qxZXz
+  xXBl1n/iYBBlg/FR6VZW1nciS9mdJADgYGO1Q3pIOOu5hz60AO1vxLDqluP7Pt47eJSQ2KzvtiSg
+  eWuPpU89gsfzH5cc+1ZaSpbXRZT8tAGjjz237gNuPwrc0O48uUPOM4GBXORXC3HmJD1bB/QVZivZ
+  fLwp+71oA6fVfEiwXC+UBGjfKTj14qZbi7gtJWjkY2zx5C9s4rnbCRdZiaOUkFQTke3P9KbYa1c6
+  XcBARLEWxhzwBU2AotqzH5Ls5YdFPOKmiu1KgxfvCOqHrXTL4EXxLbl9MO6bGRkYzXPal4TuNLu2
+  ju/3csfUD9KoDO19yChhO3OcqO1VoZEUbHVckZL9x3q09s8a5uDkZxUDWX2i4OzgHvQBLCwkwyEF
+  c4z6VNDZm7utkROCfwqCzAhuGRhhV/WtR5okjjkQ7ST2oAlSRtMdUjHzR1p2OuOI2Ly4kHQViS3K
+  iYBMsW5zSNF9klEjPnPSgC1dzm4uVKSMZd4JP41oeJPD8+r6ZHLbwmW5H3yCMqvr/Os6xu/tDfvU
+  CqSOfWuj0yf7OxLO2CAG9x6UAZs6vcIqSiVw3GQMisR7RVvpFkGFU46e1dN4c1hYmCXm0quDIO9c
+  54quVl16drdDHGzZX6UAV5bTzWIi4Ws6/DQEoQSpI5q9BfywxkS7WU9OOlMa3F8hG7bj5sn86AKc
+  ErggKVA96lFwLcYHX3NQPAHnYD5e26pAnluA/JoAu6JevFqsEqs4YN0HQV39p8aL+CJVnWKWOP5c
+  OAf6VwCzrbxAIMMefpT48zEFD9RQB6hZ+PNE8YqsfiJFt5GOC0abcH6ioPF+i2/hiGK50xmuLOQ4
+  AjO9s/T8a8wlzLIdxKkHIwcc1s6R43vdJi2xurxsdriQbto9RnpQBal1C1urtzcIVjfqu3FRMNM8
+  zbpplViehyAKnuU0/X4N+ixtFdR/67e2fN+g4xzWPcWzWFyDL8gP3Qw+9+NAGhqulSWzpJHt/wBn
+  Bzj2NejeHLG28f8Ahox6/HsmA2DHBGO9eTrrksUTKSOD0Par+n/EnVdMRVsZYgpHIK9u9KwEvjn4
+  eTeF9UY2Jie3HI+bJFc6b6eMkt909j2rsrTxpYa7bGHWYpXlc8Ord/yrOu/B8gEjQul3Ao6RjLL9
+  cGhaAcu0skr7mK8HtTjEAcMMk881Zm0l7JXxg7uQBywqqzysygDBPr1qgHSWqzANL6UunXjWBOxW
+  KsaZcggbu4HSlindrf5ANxNIDqblPteiWrESNC2fujJ7Vd0bRY7KLfZswWYZYSdT2/pWJ4Q8ST21
+  1b2krIYj8pBFdd4k024ht0nsdpjA4AHNAHO6npkSs2SwPase6ieJcSYdenB+atGbWykgF9G2cHvi
+  qGqMxiWW0GFyCSRnFAFeSN4yGiLE9we1QXYEhzMo+bnAqaC9YzbpSGY8CoL/ACwDQ80AV1mxdJwQ
+  q9h1qd71WHU/QdqgDO0gJAyevFE4WI8dW60AafhzUHt5v3ZAzxVzXNFku/38Odg9KwbK4ELA4z+N
+  ddourgQKJsMv92gCr4Y8Qy6VGUmkdLcDjn5/8a6vS5tM8SWTG3kkaZeP3xIyfxrmPEuk/ZXF9akG
+  CY/LHj7tZy38tvcxSwnYw7DpQB0viLwrIigwhcHqAeKxDpbmcgJtKjOfStXRPHgjlEeuAzZ6bf4e
+  lajX+navE4gZIyQcFmxQBxd5ZPG+9iuDxmqitHGR5oO09M+tdDqmjNsDl90YPBHSsJ4N7uH7dOOt
+  MByxj+EkE/d5qwYGkUNu+VetUgxVz6gVNAryx7Y84J5PpSAeZWjG8A/Lg1sabqn2hF8wnniqPkK6
+  qk/z/TilaEWo/cgqKANPSbRba8zM6MXGDzVPxHYPPOzOOVPy471R03XmSRXlQEHv6VstqaakgJKh
+  h0X1oA5jBjYrP8uTkA9TQ0qoxLHqPyrQ1+z6TMu104x65/8A1ViSsVc5GdwoAseWbkDyQWC01QVv
+  S+5WGcbe9OguTFZqIjhxnPHWnWTCO6LyKjPnpQBDfs4n3sMc8Y7VPBKWT922498U7X0RCjRnJmAL
+  KP4aq2rtA/ycBu5HXFAGkYg0GT8rY5J5qIw5jyMORxU28zwAou5jxj1pnktAzCUlT1xQBHFP/Z8w
+  dpNsg6ccj8a6jQPFNjqdqbfxJbvPM/yxTE/LF9c1zsNsJ1U3EYIP8VPe1iicCORsnnHTBoAtat4Z
+  mS92Wn79WBK7aw0ia3uXW4jdChxkjvW/Z+KLjTZFd4hKwyAc44qy+nwazpxEOPNdvMdx1UdTQBzb
+  AbSNyqGPf+lWvDPiW58IXDtZzOIpRiVVON4qS/0ePcG04/aYV4Z8YwaoPGJrgq2AqnAPY0AdVdww
+  eJLX7XoxSKfbnyRwzn61zGooyMzsreYpwQTyn+P/ANap9NvX0S4DQtzu7dhW/rel2viWzWfRiPtC
+  L88a/wAfuaAOQEvyDepIOOamtbFJZWKzrH7Gpk02QRBLgYYHkDtSTaf5LBgM7u1AEVxbS2aiSNfm
+  xw3St7RfiTLFZi2vUe4VRt44xWJDczTzoLoFgvO096bMomlkaJfI5ztFAG7Jqdlrcm2WNYHA+82C
+  KidbiCAoVLWzfKoHOawo1dyGO4bQcc9frWppOvSwQLDcDzQSOvbmgCjcWBQsqDYwOTmo44BdAZfG
+  OeuK1NYdZLjzCdu8dAKzpLYQt+6OKAK88ciXREQ3AY5/Ckmt3dlMoznPSrMU2zJxgD2zSSRmX5kY
+  gdiO9AFWO3KSDgqMjrXQ6fYuUAjG3HO7rWRawNeSDLYKnHPeunVG0bR4ruTnc20g96AHxn7ZbNA7
+  qzgcVzup2s2mzOl0CAT8jYzvrb1TxpZ3tgr6fBFFL/EUqpp+pJqpxeqJAPulucfSgDDfcjgxAqSP
+  mB60xXXlZFBPXpV2+tms5W2oTnpk1nht0uZCAfTFAG9oOvCJBb6jueJj8qj+Grer6XFCqvHMvHTA
+  zmuajlMUmWHznoKvQ6tLDEPtKeZnsT0oAkaBVLGX7x54qOG6NvkEEA/rV2dYLi08y3fMhH3e4rMR
+  mkDLOMkHg9KALcN7vXI4Iq9ZyG5jw7An1rFuWMWMAopxTzqMkIxZAuOpINAD7ZAcg9F6VqaXdRFg
+  pX5h92sPzRbfKQdvr61c0+4MjDyxsYHkkUAdA2lvdQ+ZcDIPGOuawNY0wWNywjwVbocdK2E1ubTF
+  +T5gw5yM1Lc2kOqaX5kXMxG4nPT8KAOSUSKu5VGM03aZmRo22k9Tird26Fgp+6hwcVAZfNmCnBVu
+  mKAJp7N71FDcuOI8d6pJlLlt+d44PoK0dTZLKCI2HmCZQCd33c+1R6iqXKpJBu34+bPQGmBNpzND
+  bgH7zHjPapLiXMhEvzMRwarQXG+ILcfMP7w7VZjdHj+QgMOmaQCRF7AsVBZO2am2G5t2kIAJ9O1V
+  2vzM21l+UU9Cjj5M8eh4NAAIXjUeRl8/pUa6k1hGFtWyG6n+lWYX25Y8dsUs9t5tkVkK7Tz7+tAE
+  9l4hAj8q/RUf+Db0P1qZ/DUWrTO0paK9cfLGg+Qn61zc0SeYc53DgVr+HNfk0u623LgwSDaxHLY9
+  QaYFa80a60G58vU1VmbqF5AFWdC1k6PqaTW6qyEbSD+FdRJd2s8IikZJbO46MTmRB7nr2/WsrxD4
+  QjtohLo+9kHXPb0pAd6uh6Lrekm6hkkQSRgNtQfK/p+dc1f/AAsuGUnSWSVScgynbisHQfGFxpki
+  RKw8tRyD0z/nNWPFHji/1lFihkCxKMAocUAaNt8NNSt3bzYrYsnT5xTLvwZYQTIuqzlLh/vqigqP
+  xrk/7QuIwRHcXG4jnMpP9ary3kzhvtUkrSH7p3E0AdXqPgvT1vI47K4kfcCcYAx0/wAar2ngu2uW
+  ZIJX3pnjHFc3DqUikfPIGHU5PFb2ka3PDe7dPZGGzGW7/wCc0AX7LRLSzcxb3eXrhhxVG78JeVcA
+  bvvcVfEgudqaoyrOrbiV9Pwpmo311pMnmWmySH3w1AGRrXh6TRfLMq8yfcHGPxqxZ6fpmnmNddml
+  jlk5+RQRx/8ArqO51ptT3vMwWU9iOF/CsOZHnkIkYu3YnmgDo7qPTtPszcWTu5LcAr1ycVl6p4hk
+  1BRbsCEXkCqEGqz20wEWGEZGAeRxVy+vRqV2JpUVJiACQMAUAZ0+mvaNuuz88hwAOmaktbt7C4Ub
+  c8jvW5rGkp/YUEsRM0nLSf7PFYogSWEF/lJ6CgDWcjXyuMhwOAO9Y09hLbSyKy9+pqzpM9xo90Jr
+  co2OMMM5ropr2PxBYGK7VVXBbIXG4jnrQByUI8xSADs6HPWpPLIjGxssvr3pxQmcqx+VGwFHenJI
+  gOF5oAW0jZB5nQnnH6Usnzjrg0rW2/8AeISD1x2pWR5VySNo60AQBX2EzHIXpSQJ5kjOOFpLgrtI
+  iLFvWi2Y3CFYuoNAEt4myTBBQ46Gq6OyHKjGTzSyyyXUm+/cnHc0+PY42RtuDcDigDS03UzdQlHG
+  WHFSw3/2CX99lo+hA64NUorOeyG9FJA68VJFaLqNu0hkIlXkgelAF3VtEjvNMF1pKOctyPTFc/bw
+  tGVeMfMRzW54f119M8yJ2IjlGzk9B/k1p6f4fsmi2xXsUmeP88U7gYV5Et3aQlWCsox+NR2eUnWG
+  7bdvrZ1TRY7FXjuQsatzHJ7VkyeXbxnz38xl6NmkBFfiXR3MDKQjHI9xUMV0ijMnNdBZWbeJbUcC
+  SZU+U454rFu/DF7byNJcW0qxqeeOtAE0EcbI+4nax49qnKNY7CCG46Vjw3DRHO1gtaNrqPnBRKu1
+  R0Y80AXYDHPAzlPmzzTWG2Evn8KafMMWIsFfamKxcAyjAHbNAFSeRJpOBg0xrXykVjyp6VLqFv5b
+  AqwTI6dal02ZZ5VjuMNGentQBJZxXFtFuUZDcitDSPFrwOYrkFkfj6Vl30l7p87RpKRDn92eoIqG
+  31gRxk3qMzqRnmgC/wCJtIa2uzLYfMjgEj2rNs70woyIMjPLHtW7Y3y38gkUnGBke1R6p4dS/mNx
+  obeZgfvIVH3Pf3oAz7W3EmGzgrSSRqszF13+4/hqOOLdGSrk5HO0d6WCUxYaUMYhw4HegCM6TLcy
+  Ztkd0wckd6jtZZbPiI+aqnlem2tTStXNvcbYZyiSA4QcdMf41Y8Taf8A2dZieGMR7sAkc7s8H+dA
+  GVJqTT3AKtjIxtrStNVy/kyLuUj1rAlhG4NtKqOc/wB+l+2SpP8AcKMn3s07gdJdeHPtLRS2zpCr
+  csD171laro72bGSFWZRwzHpQdUe8hTDEMg5xU0N7Pcx7GVpIf4lzSAwlk2yAoevUDpWpa2hvYeTg
+  0mo2UM8w8lPs4HUDvRpsFz9oYW6NKB07U0BbjvptGhkgJDRMu01VLRyyIYQSgA3HstVdVMiSlZyx
+  bPKiksbyS1hdWUmKQ5K0gJpt8UgAw69iKn0/UyJdrdOmKIPIvW/cyLEqj7p4zUEUIEr+blHXJBx1
+  oAk1O28q6VoSFVhk1GbZQ25TzUlvcfakIucKAcAnqaWK1cyFkQlB70AJvJdNq5I4+tBcbCnCjv71
+  LIVcAowVhxj0qO2t9zkXHKt0bsKAIpbPIHlKWUjk06wgaNiqIBzViF/kKKwBHA9aguI5oX3REk9j
+  TQErWypGPOGc/pTLTy47gMFyob5fetB7EmcG3G6N8hSTjNWRpgsws/y7ouWB70gKd5dGSRcfKnIP
+  HFXrHSYL61e4kfyVVcYA61lC7OrxurAKxbIHtUtxfC2sTDA/A49KAEazRmkEw+TqG9as+H7YSTeX
+  bvu7ccYrIt7qRdobPLc59K6jw9pf2KUXcJBVjuI/z9aALF88MsJh1AiRoPl54Iqt5GmXUG3ABx1x
+  0/WneMbGfTryO8VB5d2N6qfTJHP5VBoNtFqUb/b28uU/d2d6AJLPV4dGtP8AQyokHGKgu/Fwu9wl
+  PXgj0pmpaSmnOxmYEdu5rOht2knZ4FX3oAimiju3AtlAznrVWSAW7OC2HQ/d7VdNjLaMjurbSeMC
+  s+4WS41BjyEB5zQBcgnk2ARnJbqKZcydmZt3fFVxB+9DRkjHfNWLh/KKGTp/6FQBGLg3C5PzFeBT
+  LeT5yEzlB0p1zb7wGtzt9RTNhWVQOHPWgDc0iUajbPbTgM5GE9aydTtPKk8sKcDrk9adZX5+0FLc
+  FZM/K1dPpmgReJLR2nOyZDhQT1z60AYWgXYtrvy5cFXBXA9+OtGpLceH9YIsZ3BwGI4+YHsaNR09
+  9C1ERTFTMjBgE6YyO9S+IoDqHlag5++RGPfGKALelpb+IbtA+Ldk+ZkXofxqHxFpn2Vpv7OXdGOW
+  56Vk3GpCBQB8pB429a0bHXN8kX2gKY1ILju1AGakfmFfJXLN0/z+VdZYQG503yda5xyPp/8AqqXw
+  2LKJJvsqbjIdwDL936Viarq8u9nhA8sNg88/TFAGrdeFbeWBHscSL/AM9DWRqnhObyS7KUYdfetH
+  wkx1Gdnm3rECAB6Vu674psYbIRxeZuHBJHWgDzZw2nybQMluDVnT9T2PsJK56Ve1OS1vJ/OhOfXj
+  pWVdWctu/mJhgTxQBeYrOS0xAxTojJHKHspCQ3GPSqaXCTuqpnf+lTQIJ5XRXwy0AaN7YxzWzT3I
+  /fSHp6VnS2LI8Yt13kj5ucAU17me4hYbvkHXJ5qvJfDMYDNlevqeaAJTAVJGBuHPFSWuoMN32iNW
+  UgjOelVo5vNUvg8HGKVollOIG4HNAGhb6dHewhrVy8gPK4qaFTZZRssT1GKzLWd7C5zDlS1a9rq5
+  vU2uFAIznuaAK93po2GSIEjqefu1C8QZApc+uBxWnbQpeyCG1OB1cnjmi5sUuTlxgpTQFBAYCWEQ
+  bjrmmsHvDypH0qYqYGPlk56DPSnWFuz3BN2MCkB0niGK10bw/ExCyMxwhVskH8K5O98SPfWixqPm
+  AxkjBNEkkz2iQSzgqn3U54rPm4RkY4YEfhQBd0gPBMGnwc8fSpvElpFBIGU5Y4Ix0qjcanIkKBG5
+  7VGzPdIHvF3P9aAHpGtymc4Ira0fU5YYUG7KA5P0rAEgjOFjfHtVqzndD8ilFkGKAPTri4h1fRrW
+  DVAojmjwjdwPY/XNcJK6aTfubdjhDgc9a19PnbUYLW2upsRJ8o61S8WeH1sryKJ2AeRSUb1oApTX
+  TXpaQMWJGcdal8PSf6UTcj5WOKz5YW0zgTKZG44Bq4THLpSqj7LhWJdsdfSgDo9e16OGFba0ji3p
+  wZCBzXOoYZp2N2u0Mecd6Zp12cIbkfIBzTbwRG53W4wp5oAbeWVmgY2ZYeuTVC4SWFAzjdGO5qws
+  HmK28jaTVi1vhaR+XfRGeJhtVR69jz6dfwpgZEcrPcAp92pl2IzMxLuRwamfSJZCXtnRhnLgcFR6
+  VWc7J9mNpbtikAW9w0MheQj5ea3NG1Y2sPmWhCvjuf5Vk7UadY48RseW960rDS11C3b7EMzL3oAt
+  6hpn9pZu4GzGq7djH5g2PzpPDsMV/Y3Fveg/uVZl+vNJYRy2KhXfcB972q5aRw310/2eZLbcuCWH
+  X8qaA4yTeT845B4qaEqjZlVtzflV+80qY31z/Z8T3ENqMs8ZAAGcd6zoZMncEwH6H0pAdDpusLZQ
+  7Rjc3ApkFoZJHmY4iAPXpms8R7oh/Gc5HtXQaALbUtGMN6ApPHrzQA/TvEdsdOWD92rRk8gcmud8
+  QXkl1cZzlfapr3QP7NujGjfKTlSKzr2Jmdgx/wBX096AIkn8ucBQQjdat/bWMLZKOOnOOKzdjL0P
+  BoiXe2Cu7vQBpxC0KAyK2488Hiql3LskbaDtbpjrV+3tlubYC2TExGBVe+tJNOAF4PmHNAFO0meG
+  R1bI9jU0iK23zcbsdagWYO+xOH7mrkMWYcNgkUAQwKGA4JC5pzyFmPlEADt61asYIgSJWA3dOKv6
+  zosFpdxPaBGVlG445BwKAMwuWADAbqs6eI/3hl++Pu1cj8NFyrRncAdxb0psElpY37NMhljD4YKe
+  poAsWmm/aIjKknlsvUnoalhtHLcbiueucA1Uu9UMs8wt4SsOfkUnkCrOmXcotj9rkV0HSLnmgDoD
+  4JSXSzPNNFJhdwCkZX9a5+K9gD+XPgDdjNTpez6ZZywwPskcZbk/KK5qZ2llPmvvYnrQATr8zE5D
+  N1zxRbou7951anhZNYuUVFw7dvSp59IltXdZ1IZKAGvpLNGfLAfufaqDCSKUEkgdMkVd07VWs7oG
+  XLL0x60+7ePUjyCpByMUAV3bBGxsk1ZikV4gAMkHOKpzW5SUmN849qjjnlil3KODxj0oA6KykW7t
+  yJW8pk4BFdxrGhwax4TS5JWWaEBEY9QDn/CvNrPUfJmBcZDHLV0s2vsfDMwt2ZYy4z7cGgDHv9NK
+  yjfD+8bgYFUNRtTps4S6HlkjIBPU/wCcVeN86xKZmJlyMc5p/ifU5L/RYVmto9wJUyZ5oAy01Dfb
+  qZV2xnoKbfX6NEv2ZcHHWmPLFJYQx2ZLTL1U1EIJA+2bAJ6Y5oAIboyDb0PU1c8xLkBJLna4Hy44
+  5x06VAbZbdcyZ3elNBXeCRjnOaAG2808N5syYmJ7fx+5q7tW5QCZQso/iqsULT7rXLr6k4xVi0dX
+  +9kmgBlxpbI7SxqZAoGWz0p+i3txZ3AezJAHXjrWlZ26mFyzEnPC+vStzTLO3vZ1M8Yjwp6Hr0oA
+  5/xFqyrIggQKrLlsdc96xpQZ5wySbu2DVnVYQ9/MJCSitxVOQFW4G1aAOm+H3iGPSbie1upBDBqC
+  CKRugwOfwrI8VWsenazNHZtvs0fEb/3h6j171Elg02N65x6Gt200i18VwwwXcjQ3Fou2NQMiTvye
+  3WgDn4riKEhkfKf3h6+9aFlGLeyS8eT5DIMoDnv3FXZ9I0iwhJFxJLMpwY2ACg1TvvISzMs77S5w
+  EUcUAW9dH9qW6y6ZKBgcgdawoNOu7iWMmNiWOMDtT4Jxb5e1bKuMEHsfWpNM1ZrG4WWFmct0BHSg
+  CprWivp0u193mMeR6VHa2jmQbVH0zV3WNRkv5mkn5YnjFRJGBMjRMScdKANvR7OO1u4pS+SGGV68
+  d61/GnhSHUYReQyqsZXiPI64rK0S5hRNzfePXvWr5w1KIwwucAccUAefW1q8kqiT+WK0RpdzFFuE
+  bFT0bHBqxrFj/Z87LjDZ/Km2ctw7Kgk3KO3SgDPQPuHmqNynv2rRs7hrhjDIcDqD6VPeafDfWbbC
+  UnUjav8AeHfn8qsaL4bl2pLcYWJT85PYdzQBq6dfjRtKX7QnmC4JQH07f1rIl0SztbsSrcoQnJQH
+  qaseJ7mBVT7PIXtDwrYwQ3esOO4RrxvLZmjI+90P5UAXrm881T9lHOeAOareXPH+8BKOB19Kb9rF
+  pcq0ILDPc8mp7m+S6k3fdKj7vWgB8Gtj7Oq3AZ3fCs7DmorqxQTbl+oAqJJlu4gJMKwIxT3kNq+H
+  G5/7o7D1zTA7Pwpd6NBrk5vQwMv3Pl+7UnjAwwXX7tFe3l5UjBbHvXP3GnCOxhuo2IL1G+qPcFYX
+  cknoT/n2pbgVZtGFxZvNbH5VOBk+vt+FZ8lrPakrcqyHGcEYzWidWS3lCxAlVPUdDWxf6pa6nLH/
+  AGlH99QoI4wTwKbA45pHEirjk1asbxYZCsoDYH1rV17wyumSKVbeGG4Y6gVk/wBn7UdgCpPc0gLw
+  aEwtLKMDtWhoNykVwHdd8JGCjDIrDkSW1g2zOhVhkVLo+puSVlKlccYoA6Dxf4PbSLRb21wto7DG
+  W7ntj61mpKdXtxaOQvlfMCSBuJrqLfWIfEvhg2muKzQoN4CnBJHT9cVyU5hEjNbB0CHABPNAGTPa
+  fZriQONjqcZ6flUtqqB1SRmMr/dJzWlDaLrEUh1Qbnx+628ZNZE1s9nfctxEccjpQBO9tLcy7Zjw
+  vfNQ31q9oee3A75qe2Yyzby5OKiutRMsjKQDg4FG4EVvEyfM5xnsD1q5bbzKHBAB9KrCJN4YMd3p
+  V+wt8szRZUCnYDXsWSGPz7jGI+SMVVuvErXKEWuRk9QMYqXVyLXTUyRmRcmsSC4EAO8D2pAXxbma
+  IMR8w7+tVdRtkUAT9ew71as7wsF2nFGsKodDOMzHo/YU0rgULe7j098qW545Gaki1FIbwzeYyzfw
+  EdvyqkyGSfaw+bvRcQLayqyEnAyaQHR6gi6/pXnBER0IGFHzN15rnmlXyTGRuQHByeQau2GrS20G
+  9OhO3H1//VWhf6RprXbXmnrMtuYsOjNk78DkfiDQBi2rpHIVQjb1otHPnBZAMAdRVUQiW6Bgyis2
+  Buq29q2nXJjn/eDsycUAOLCG8yg9zkcVCzeVIZY+cenekN0LqYRSHAHA9aLMCOTy5BlTyPegCxa6
+  ltkL2+ORzxjFWbTXpLSV3Y84+XFVJvLilKjgVFMpAyBxQBq6prEF7bQSzA+ZJ97jpVRGjDbUJAB+
+  U+tUywlJUdE6VteHLK3kuoDqQZ0zyAcYFAG3feVo+io90u2d13R/LyR35rm77VZNSmzC5SEj5hnH
+  14/Otu+hv/FN3gTWywW4KRqQM4/OsUeFZp5miaVAc9R0oAaXWa0EUWCIjuA9PeqEMbCYM3G77oAr
+  bi8Gz2YDmeLc3ygev61X1CxnnuTE8TvPb9fKXigDMuIJFlBdtzHnAPSrEF0IwDCm5hw2VNRzxTWt
+  0BeKVMnTIxj8KZ/ahtgY49uT7UAX7VH1K63oERVOTxiuu0ex0nS7L7chJkm+R1kwwyPQZrh4JJDw
+  zbVbk4/OrNpefLsnyyg5UUAf/9k=
+END:VCARD
diff --git a/vendor/sabre/vobject/tests/VObject/issue64.vcf b/vendor/sabre/vobject/tests/VObject/issue64.vcf
new file mode 100644
index 0000000000000000000000000000000000000000..611052907a2571293041ffbd3aac82957961390b
--- /dev/null
+++ b/vendor/sabre/vobject/tests/VObject/issue64.vcf
@@ -0,0 +1,351 @@
+BEGIN:VCARD
+VERSION:2.1
+PHOTO;ENCODING=BASE64;JPEG:
+  /9j/4AAQSkZJRgABAQAAAQABAAD/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQA
+  AAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAABQKADAAQAAAABAAABQAAAAAD/2wBD
+  AAIBAQIBAQICAQICAgICAwUDAwMDAwYEBAMFBwYHBwcGBgYHCAsJBwgKCAYGCQ0JCgsLDAwMBwkN
+  Dg0MDgsMDAv/2wBDAQICAgMCAwUDAwULCAYICwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsL
+  CwsLCwsLCwsLCwsLCwsLCwsLCwv/wAARCAFAAUADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAA
+  AAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKB
+  kaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZn
+  aGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT
+  1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcI
+  CQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV
+  YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6
+  goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk
+  5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD8J7JbO8tYo1tIFCDLOVG5qfdaVZRwmSOFWzyA
+  F4H1rLt5WViMhdp6HgmtKK8O3B+4Rhx6fSgBI9FtjaNN5aErwRjilSys7lFAt41xyTtqc2yJCVlY
+  7eqgGqv2jyLcebjZnGPWncdzT0+w0u5eQXtrGiBcIyoPmNMXwpb/AGMTSRRbH6YAyPwqK21GKdfL
+  BAVfu+1SQX4jnjKFsp03dPypCKN9oEaKSkC7R0bGKpnSlSPdHErZOORXV3Ouy337sCLB6kpx+FY0
+  t+VfyrgcbuCB1oAfoMemrcImq2sZX+I7ATXS618PdK1DRlvvDEaMq5LoV2nisx4LVrUfu5BOePau
+  m8EQS6PY3HmFXjljKhTzjOf1oA4mz8OxvMrLbW5RD8wbByKg1LRrRriRYY408w/KAMba1pRaWt/H
+  a6a7CVm2u7N8lUPEujzaRekzSK6tgqVNAGNBZJauY5Yon92GTRJp0ROY0Un0A4q3c2odkaYOMjii
+  KL7NIDGcj1NDAZBplmmWv1xnoFHStfS/DFpewqYoYm3DutZ8lv8AapdyOqk8EVteEbSe3KBSrDrQ
+  BT8S+HbawiiWGCAPjsuMnPesqHS4JSFlSMP7DitbXbvfrkkM2eGw3p+FMfTh5X+hr8w7t3oAhOhW
+  u8MkMZUY3fL0Heo9UsrN5FFrbxKmMBgoG41fWFra0Acjpzg9aoXjtgRoo29vagCoun27kbY059qn
+  bwykskYjRArdTT7GEl2UqMr2q/JtVU27iR15NADdK8DC/wBPle2iicxNg5ALH6Umm6FZ/a3ttQt4
+  g2Cqnb0PbJ+tamn3j6ZCW0nILfeBORWVfO4dhLw7fMW7560AZuqeHf7MuTFcRpv6qVGVx70q2Eci
+  QwyW0SsPvOqjJrUtb6S9tHQKGeMZYuM8VUs7gRxbrncy9mWgB1x4QtTHvsQWkHJVhhax3tkhugHh
+  UkfeAXIFdPZ3v2uxkQ9G4jI6/j+tYun3r2Fy6yxeb2Py5IoAqXenJ5xaGNNvXH/1qcLSGeBdkSg9
+  CcdaswC3be0pfexOMnpn2qaS1KQkQASKoydvLCgDNi09RKTNCuO2BxVjSobc6gqXMERQHkleDUsc
+  u9VADbG6qOWAp11bLbptkjlCkZRsde9AFi5sbO3kKfZYTnkHaOlVbuO2F5thtYcADjaKXUpHj8ku
+  Co2VDFL5wLeg696YFwQ2z7Qtlb8HJO0c1Zsr7T7a9kL6XazZ4CmMFRWfHdkEgjGRjPpU9raP5LSP
+  j5h2pAWdQ0+z1KdG+y21qvcRqBn8qXSvC+iTu63ssqyE/IAuR+NQwSrGm1g+c8E9qiSQW9wPNYYP
+  OR2oAW68GNa28k3lwGNHwvzDJGfSqM9nHBgm3j59QMVdmma4zIjsUBHy5OKp6o8s2BJjZjjAoAro
+  /nysbgYY9zWmLPCR+WQQwyaz4k2F/Pbft/GtKxvUeFN+B2x+NAEptsWpZSdo9etZe8su2X7pPFdU
+  LeOazKqVwevNYt7pw5EA5HIxQBQA8tAIeGz1NWIJvJlhW5OQBzjrUMR/eN9pwoXjB4qQ3ERJeYcy
+  9P8AZoA0jf8AmybVxsHAFS6jp63ixmwjIwOfrWfaou12GcDpmt/w5qJhXc6hh2GM0AZkHiRpblVl
+  G0RjGMdxXQ+H/E0Rm+bjdw1crqEHm3EksY4Y9PTmq0cskc42qUOfpmgDovHOhLBOZ9O+aEnIUdRW
+  QZft1sgum/1Ywua3fDfiFDL5WoEPEwxzzirPizwTFPZC60kYUjcAp4NAHPSq91EoRS3061DHD9nb
+  94Mkfw020v57GbcCRt4IIqzNcedIH2jc3JyOaAIYrRZmJxtNdB4fkGn2hluBgBR+NZ2n2X9ozAQD
+  5qvaxGbKIRXkuFU4C96AMDxBKZdQkuEUkStuUegpNM1eWScAkqpHTHNPlwbjMzExZ4Pal1PS/s6+
+  dY/6vuwPSgC9G8c0A+1xEknrnpUVxaeXNm2dVUfjVazvEZAEkMrccZzV1YYyBIhJP8SZ6fhQBSmV
+  4JfMVT+96UJdSQdcMO4A6fjVmTUoJiqTOMJ/q+elRyQs0TtaxF0PVhzmgCzpd55r7YI2HHPTmrV0
+  sDTF7gnJXGO4OKyNKgn80NbFhjoBzWjqdg6SISPmIBOaAKVnI1leyhsMJOD7CqOqRtZqotjiFulW
+  rhsSMshKH1ogsZbmF475TKifdf0oApabevHIAhCYOdxp0t59luS0I+995uxqpdRyWsrqmXGeCR/K
+  rVlZfaogqv8AvD/CaAIY42kV3K5zzn1p9jNLp6u/A80YPNWWsJNPAVpC4JAZT2HfFWJoVmVVjhVk
+  HTPrQBPoi2wsoo4APtBHL+tP1mS5uVEFxgJGNqH15plp5WmyBriMRsowM8UybXTNdbrpd6A/KKAD
+  xbJAGs44FIPlnd9c/wD16ynt/LiDW2SR2qa5vP7RnMs6BNuQMd6jhkAUb2K8+tADYp0fhj8w6itC
+  yQ3CFYeAOoqi8Uew+UMuf4u9T2NwIW+UgMetO4FmS6RJ1ik6HqxHAqC+gimUiA8DvjrU0kcE8ieY
+  itu+8c0+bShaWxksSZoM4b0SkBTgha0cq33Cuc1SvrrLFV6jpWqbuGe1HnnDdAKy7i3WSY7OT2NN
+  AMulWSV8ZDNzxV7SlbaFjClx69Kpww7W3ct7jpUtnNJHd5UjZnt1NIDdt7h7NQ7qGfpt7VR1XVEh
+  dhEpP94/4VpafexTy7ZlbBGDVHxFbQh1j04HaOTkdKAM5ZVlYso3E+tVp4w8gx0Bqd7QxNu+6D6V
+  DIoVySxAx2NAFyNmli2pjYBz61paW3lWrFS3BwP8/hWJbTBFJy2D6HgfWtiTWPsqxraBHyOeBg0A
+  RSoLSTdIepzz0606exTWyQGMXljORTNT1B7+ECZR5fHzDqapfbHjbFkTsIwSTQA43ptyyS44Paun
+  8N64Z7Bre4YlZBtU5+7XLTQbjwN4Pb+IfWn2lw9uyrIw2Z5HpQBv3GirHc7LxWVZOVI71FNp7WDg
+  QYlIIGD6VvaPdi+tljb5yeAzcn8DT9YtbPSpVhDM87jJ3Htjnn6UAUIrJreD7Si7MDoKhv8AUxqt
+  pGt5GqIOr9zRfLM8ZFgZGtex2nGe4zWKN8rsDhYx2JpJ3Atx+HxcRSzWcpcL/CRwaj0zW1sQy3cS
+  nsFPSoYJpbIl7dm8tT8wzV7+0hqEO1Y4lQ9cqMn9KoCp9kW7kaaxU+Yx+5j5etWrb/RGxfr5bkdu
+  lW7KFILpfspDbVyc1fjNnrLtHqOYWP8AFjGfxpAc/e6Ql/GzW4AfqBWfpupS6Xer5vPlHmMjg10V
+  5pp0u4JhYNGvAYHrUn2WLWrVo41AvSMRZAC/8CPr1oAvafdWOuNG+lqDekY+zg8MPXPX/wDXWZrF
+  tcWNw0erKElB4Rf4R6c1BpqyaBdbrnEcwyAc4x06H0rQS9a9jUTgOXPzMwycexoAw7u1jYb3zkU3
+  Srtgdk54PFamv2C2pDQbWjcfKCeSa56aJld23YA6ZOKFqBrXGjjULuOKxKuZOTn+H/OKwr/ztOvs
+  uCrg7RgVLYapPbXAEW4EkHJNdBNBH4gtgyhFmXuw60AVpbT7VpiPJ94jLetQWsDRSIYz8mec1c0+
+  1nexdrw7GjJXk/epsFtDPG0bOdw+b5SaAKWsXA+14Y71FQi5S4RvlAC8A0y5hHmHarhvQ9BVGSQx
+  sUXPHX3oAmDCJ8rzgHg96gQ+ZGWbg9vahNRG7EnalkkF6hEXyD270MCWF3aEhdue1OsmNnMAih/r
+  VaBgAUY8561PaubdnMxJXseuKANhIY5Assp2v12itZtAgubEi2nb5xuKYHWubstQaO6SVzujTqpP
+  X8K2rXWLRF8xZJPMfjAzgUAcxcNiaRSpUocc96sW+yNgZCMVF4lvJdRvTOYkj52jbgZ98D6VWmlY
+  2qCUnJOKaVwCzviibANwYc8Utkdl7tbKhjxmpUspvm8tgn16ipigSEG4G4pxu9TSA27GeFbRlGGm
+  P3cdhUN8GEP2hV3JjafrWfpU/wBmuAcZLA4/Sr1trkarJHcRmSEZO3uTQBmrcbZCLoDZ2x1qOHSi
+  yebJIAPQipp4kmbzI1EQJ6GtCxsoHP8Ap91GB2yDQBlSWO+M/ZsBHHzZ71XkfMIWNgGU9vSt3U9N
+  t9m21uonz0Iz/hVCfRkjg82FhtHDGgCuZ8EMjDZjBzSZ8pAwU7XbGT0pWtEjjAZgV4PFOml2QKqk
+  OoOcU1qBNYRSrdkrhw3BIrah8KwXoV/m3PyVzyDWNp999kccgZq/ea7PFAGgZlJ6EUgN23thpdi4
+  V1Eucr7ev9K53V/ER1a/MkuWdBtG04zioLrXJ5wDK2XAxmqVqmZ2YPtHJ/GgDsvC3i0ppr2d2ish
+  yFAHIz706bRLNdOPnErKw4y3NcvZ3pjA8o4kB61o3OpSX9nbx3QIkU/MwoAj/sGaPzFjlWSJjk46
+  ioYYwqssjIHHAHpWm4ESN9nYDIFZV+I7uVI1wrY5b1oAtafcvb3W4MM9Nx6U/VZpNRys54ToU4zW
+  KXaDKrJuC8cVdtpi1gzs43HNAD9N195bdYtRIUR4wD1NX2KuA9uThuSQelcsZwzq9xyzfezV/SdX
+  e3m8pXJhkPKkUAdYZk8RywjVVJES7U2cE/WtA+HDHohuY3Uxg7RF/GeaPBlxaawMW6rHKnAU9SOO
+  lX/FFv8A2bpzTQk+cpAAz93nrQBx+r4c5CODEOA3Y+wrKu5V1C1GFKznkk9K6Wzv49fs8Xf7y7DY
+  MhGNgrmtX0s2t66WknnKvUp0/WgCnbrJFdot0NwJxkDFdDYp86oMjjIArJivxbR7LuMyEjKitS21
+  MW8auuW44H93/PFAG15aXdr5Uv7uULkA/wCFc+Yvstw0at8+eoq/p+rm6vRJMNwIx9KranYySXSy
+  WEZZHOCw7UARXFyj5STAk7ntWVf2gALLyfUVoataLbfLO2SO/Ws2c+VwhLK3QDpQBmz2xAyCG56d
+  6uWPlnCkFcjoTzUBkMc/3cZpwn8oZkDFs8HsKALN1apDIHOeaiLkRkMOtSXE6yxAsRUcdxldswIJ
+  HANMCuJW8xQgOP51oacWPPGAeRUUOIZQzDhecd6mbIcbPusM0gLmq6bHPohlhDeZuH4c1zzF1+Rs
+  HByDXTae0s0IhjjZg3GPWqOs+HpLCTbNGyb+cHrQBZitjPEzW/LL97vinw2v2m2aORec9AKXQbsw
+  ygBBiX72TWxfaS8kiGFQAwz8vWkncDlbqNraT5cjb/n+lMGckx8kjOa1tU2TxkPkMpxyKyrhJ4Wa
+  KIDbTAkgvIp7URzgBwe/BpZYrd4vmZWNZ81x5cgBXDdzVlIvtUOGIBHpQA2aEROpR8DsB2q3bvG9
+  iySzEsTkLnrVMqViCZzt7nrT7GBVuQRnODQA6Q+Sx80A4HApEJB3BAR9K19EmhkvCJ0ZsKe3tUc8
+  Mc1yy7cpn6YoAzoUiclnYYY8AHpUl8zRxqpPy9qtC2tULgSMAvQ460lzIl9b7YiDt4GaAKMMQlJ5
+  z9Kj8gIW5yKnS3Crlzhh6d6k0mbyZT565Q5z60ANtrRpPmhzWhbwy7DJcDhhwMdKlt7aK+gb+z33
+  yKdxVuMCqaz5cqGYfWgB6yu8rBB8o6Gs/UpjGQXBGPTvVmSfyImyepqrqjbIw3WgCDz1ib9yOTg4
+  NbVlNBJYvlVBHt1rBaPzQWU4IHSn2FwRJslJxQA6e3M0O4oAzdB6VXR2iKGQENGOK0ms1eAkFjF/
+  BjrVGaAo371smgC7pety2kwl06Vo5AOWXmuwm+Itv4g8Ota30aWlySAJQfmkP/1zXIeG4Y5SVBB3
+  evamXGly2tydwG0nKkHpQBZ86fRbpBLI252y4PGRWhO8Ml1IbJhHn+BTnNU9O1oRwvDqqhB2lHJP
+  4U6awb+z4JdKbzdh5ZurDHtQBat5LaRHiaOP7QejEZKD/Oauy+FI7W3Bsroyhxkq3QH8q5a7ujM8
+  nWOQnBqTR9burCT98xdR60AbbaHc6ZG3ymJsZC/3hVnw/fNIXt7hygHzZp2oeIBqCxzqfmCgEe3+
+  RVdrmLVAEtf3bxfOW/ve36UAV7+7DXMu5Q4/Os2e3eRWkiAGOijtWrPodxfQmeNVAPOPWsppJIpi
+  JxsKcY9aAMwRyTSbpflx68VOYvOXb97OKtXAiZdzkqT0AGc037BIIRLHjsR60AVprZrZwGj4qTY0
+  xyRj3PUVMJDduFfqvFRzxJCzrCzEr60ALEu+YI53c4qeGB7lGCnBU4FUopTBLvfk1at9R2sAMjNA
+  GtaXsnhy2FzPHvC46jgnNQ33imTXrkz3oVFAwo9Kfrtq03hAzEfJ5gyc81hWM5hhKrhgT0NPcByS
+  P5g2uVI98Vp6X4uuNGlyzCQIQR0bI7/1rNQxqW+05J7Y4qK5ZYUP2ZCW9TSA7SR9M8V30X9nMFZw
+  WfcNi5qPWPDtjo0pE7O03U/Mf055rmtFmN9E0DEox+atPWbiW7lSO8Ja4jQbcDC4A9PXFADYtM0+
+  6nc3u7aOm3IP6Vnak9tYt/xL/M445zTIbieOdmWNsE46cip42EkyC4hYx469KAFsrT7XEJgFPOT6
+  1s+H9PD3XlzxnL/MDtqn9pghgb7GjL/eJORWqfEnmrA9oFRoxjJ5BoAp6NqDW2pzRXtuyIAw3FMf
+  rVS4iF08pydmeCDxWvqeuC+Ro9qglcMw71mwReXD5aAlFJPPU0AZ0cEsbkSZKH15FD2xJJiJVj6c
+  VfnzLGEXAA71PFpDPaebE6/KOh60AYVws8TBgrFe57CmHUG25RVJA7AVozzSLbNvX5T1AHNY/m/Z
+  nPlqwDetAEtvqzJNu3FZBwQBjI96vPqkd3mRtokH31UYx+VZqWruxaFl+frkZxT1tvs1ujJgEH5m
+  PR/pQAXl2S371XAHI+Wkaf7VD8hGR2arKySylRccQ98DmiS0jifdsdgeODQBQd9x3IBx1xTYlBm3
+  En86sXUAwPswKg9QeaBErIEj6nrQC0NHRtUjt0K3AHzDABGcVW1fTzJL51jyOpz0NVooispebBI4
+  wK2YFEthk8qR07igDAgJil+TKtnnHFaP2h5yI3ZsgdSfaqd2P3im3BGM9aktsjmRgCOaAJZrMwR7
+  3A5PT0pdMvZtOning+byzuVDyh/A8VHczSzDPy7RwOKgiuHEewjKeoFAzp7TUNM8XXEw8RhYNQmP
+  7ny18uNeOM7cCtMfDiS8uY0tDEYghyynjPbn864htP8ANhLIehzWzovxDvtFsDB9+PI4I/rQI0r3
+  wNc6DO0N2VaQqW2q24YxmqFhYRgE/vkkDfMGBBP4GrSeJ7tZd6SxvIfmK4yQP84p0XiyC71gS65G
+  00zAKGX5Qv4UAbFpd28WnIsBLsDzmub1+AXt1LJEoQqfu4xu+lbWsWgs4/NsCXjPIbqK5+5kklmE
+  rDD54BFAGb5cjybCrAnnB6ipEvXil2sM4GMVpFY7m4UNmNyOWJ4qteaM0BISVZe+RQBFHC2/zISg
+  B69KlIVhIHA3HuR70lqotlBulY5P4Vcls44k3u6N5oyoHb60wM6O1SRir5LemOKv2vhuW4iLg7VA
+  6k4FTR2ax4aaVIwR3HWqGua5PcQm1WRBH6jqaQFzWbE2nhzynuIi+8HaHyKweJSEQEN6jpVcKyOw
+  cMVznOeKmtZvOPDKuOKAJbi0JYFf4eue9IW8sncfvdqnlvVFyFyu09abI0bysMZx0oArC4eCTcgb
+  juK2dNvE1N1M0ohljGQzc5A7cfSs6aweWAk7kTuapQysIT9mOSvG49aAOkvzLMxk06QNuG1l7j3r
+  PlnnJAuGJij+nNQ6XqT7wEYqyn5v9utLULaW7j321uiEjLqMkKKAIotbghb/AI8hKGPIBHNXLG6t
+  7uzk3RLbKG/iP+Fc+8f2d1eFztzyD2q5p2oCFWRoxOX52nPFAGgLyC2lyZFKdB70r69buxRJBHjr
+  nvWVdeXLE7xE8fwnoPpVKZUnQPkBhwRmgDq7a9tLyARWiiWYngL1qG4gurJ28+NowO2a5a3v3smD
+  aa5WUd1HNbC6zI0KSX13JO7D5lbHFAE4V7pi0b5x1GazdUtXSM7v4iPw5rQ0/XrcXX75FgUdxzuq
+  /qFrp+sWRe3uDkc4BFAHLRDY42ycd6uPOXiiV+RGPlWnXOg3IQvEmIB/Ft6/jUUEZmMcgydvzECg
+  C1G2+Ly3YAvyM9qY88kaFcmmp807uwPJ4FS3do+Fzn5ulAFVrjbgS8Z4yah2C03SMffNWZdPknVA
+  iluQOnHWmX9pILvyY13HHK46UAVre7LSyOCTmtjSiy7VijLeZ0IqO08OzPIUiTI74Ga6bRP7O01F
+  h1KYJOv3V4BoA4zU1lExMrkbOAvpVcSifhjgrzmtjxPp7pO7SggOcqfUViy25hG5fSgC8rrLAojb
+  d7d6SexlEgwpRfTNV7e5LFBbKAwPNWHeX7TguxI7GmBPBExhaNVIJ6egqOVknO1fkx1J61aj1gLC
+  UEKlk4LVWvozC67kCFxkD1pAQ24e3uDLC3z9CR3H/wCqrczJdOGiOxvYc5/CocMYhtUBj3xU8Qjk
+  XbKPIZOjqclvzoAu2HiO60xPKvd7wY/1fGBWnJo8WuW6y6XIPMYZEAzuH9KxISonAuzuRzgk9qtR
+  79KmMuhTt5cRyxznFADLzS2tMw6pAY5OoDEZ/Sm20TQQ74YwVQckGtMatB4kUpqreVIRw5+8aqXF
+  jc6bAsbD9yThWz94UAOmmjvrRCMJjOQRVS0sD9pLyABM5Of6Vdtrdn+RUGcZqO6uRBG0MuFI79KA
+  MfV7r7ZqDI7kohAVT6U2eJNimJQOuTnpSXFussrMvBz1pJov3YUsR9O9ABblRncQ3bAqY2EUwIiA
+  Vqr20ojfYqZx3q9bSKAGcYJPIoAoq7OCEQBffrRDGEcleM8nNPjuGkhHmbB74ApvmxltsuTnuDQA
+  +SFEjDwu5buD0qpLL5vMg2kEdOlXECMAyZGOMMePyprQRI5N0rt3BXO326UAV4b0Wt0pC5HrXS2W
+  qq9zE7jcO+OhFc81kbg7iMqeAFHSpLa8eymaNOUIwD6UAavjPQYYybq1bBmXcF9O39Kw4iXdDKcE
+  DAxW3q7NdWELISdiYIz71kz6ZNZNHI0cjqQfujIFAEtzAtu/7vODzmqlyzNyAo9vWp7uWSWJd+AM
+  jjGGqOWCSWRVVW2+uKAKskpWU5TP0p8c+ExsPPNTmCVD+5U/QrzRJHJGymeOQc45HFAFczh497KR
+  jirWlEsAudvII9znitEeBp7yAPZvEVPJUsP5ZqCO3j0yYDUNwliI6dOPpQBt/wDCR3Wj6eHFujvI
+  do3DIX9KoHXoL6J11CJYZAONlaWueIYtY8Nwx6ZHu2MdxVeTXKG0eaXKRuCeuBQB0mn+HRe2Yeze
+  MqRkFmwfyra0rwsIrRmvZICcgDLVw7xXFuFd2uEQfeAJAxUkkjSxh4J7gjPAErf40Abvjq1i0y4S
+  KByCdrfL+FUI7SR4Wc+WzMOCW5qhf3Mt9cCV2ZiihRk5qpdTSBgRI+R2DnFAFw2k6AqJZMjuD1qn
+  cxzyyAkPuiP3ieT/AJzV+01R7a2RpMZPVmGQ1WVuTqLDCptcfMBwRQBEkst/YMCSTH8vJqtJaoYQ
+  JPv1o+ZDZKAo+UnBpmrCBpRNp4/0crgZ9f8A9dAzCdGgkOynxSus2xjkj+L1qW5/fxYj+8D+NRWz
+  R4fzCd2O9Ai0lzI6mPaMOcZqW4uI7rbtJ3IMc1XScKqncQT0olPlKWfBz6UATKjSDcmdoFWtPCyR
+  kzckHiqUV0623lKVIPzHHWp7Ic/vSRz0zQBcCqdyT4J7YqC3uZdKv1a2UupO7B6H2NMglMUsmcnd
+  0Lc4q3BmaMBiDjr60AWJRBfyb9P2RueWJ6KfQVLHqMdtcEysxJXayN0x0yKyWihWQBdwTOSdxHNb
+  zWEF5ErXhX7QQAMNge2f0oAnhs4rq2kksHwirkg9SfauXnJnmL3AbL9jXSRWh0N28x1cEfMqtnA/
+  Cs+70+O9/fWRIb+76fhSTuBimbyyyKDgnipLk7AML1pZbCWO7Hnjn26U6ZykRL+veqAryuvm/Jwf
+  Sk3mo2AyHyCT6Ux5pLU5Gwg88gGkBPNAILUO3KmooyjL8ueegzTvPMsRjG4qBwKrW1sxJZzsIPGa
+  AJbmfp5q7MZx71NZawEi8qZSyHg4NRGLzCPtB3eme1R3Nutocodyd8UAaVtqEUDlI8/N3PaqV2Ht
+  X2x4lIOSwHFSWkEFyo+cD1BpbmNbNdkh20AMh1UiJ1c9RzWj/wAJa1vYiK1RmRvvetY5gDENxgnp
+  UlhN5TiI4O4845oAmu51lXzFDGQ8jnpTra4uJkBAOQavXvhG8tIhPawvJAfmY9gKE1COwgIiAZiO
+  3rQBV866T52Qsw6YrXguZNTs0WSJ8IPnHr9KwZNamNumZSpPU4pbPxBeRy/uJjtXqfWgDodMtnXK
+  QjYeo3VnalpiXjMzXMKS9O9VV1ydCXkmLY/SorWwTVJTmQEt81AHTeCY49Mik+0SJKmOg71W1bxH
+  HLdgaXaSRNnjdzWapGlBBG2ec4GKtQ6yZD5hjLMvbIzQBfutWC2ajV4ywwN2OM/Sql/JY2kKGzU/
+  McnBBqlf3Lam5e8lKMv3Yz2FU4VjgzsGQ3WgDa0ya0u7kxzgqCCcn1q43hizkEjRkOoXcAOua5Ka
+  6Mc3ygEVb0nW57ac/ZC4Xuo5zQBBeZjcwuMxRn5fUUmnySx6kv2cgg98deK1LjT31pTLpymSVuWi
+  Xqv17U2GzFgFBUCVOo7igCTT7cnTp/ty5ZnyCvGOKz2uwimOY7geQB0FWY7tzu8xiqk8A96qOvmy
+  MSowOc0AVpkkgk3uAiP39KkjtonYtnO4cKOP1q1Z3K+X5V2N6OeM8gfWiewaxiKhDsAyJB2oAk0u
+  1juAwniYshwoB61FLZfaJDv/AHWexpulXRNwpjkP7s8nu1Wd4uC7zfezxQBTjxZTHzlMigbdy8Up
+  YXEv7nPvk1aNqbhDhgARnFZMCvbzuWZgc/nQBo2l6qs63AJA6VIsiG4DI4jXP8XeqcbrK5JH3xkH
+  0pWhWVR52CF6UAa8kUd7H8rD5f1p5txHAfNPasWRCjgh8D0BrV0a+DgCdfM3DaB9RigCml/JFPyB
+  159xV+C/wfNHAbtUN9orxO3k5dhycfw1XmT7JarIjb1k6U2BcuNSVGDSAPu6be1QTXcO0CVSwbPA
+  7VRtpftEmxW2Mx6HvUv2V1J2jkdaQBFJB5jBVYemetRyW6SqTKCfTFNllCHBX5vWkLBPvk4NADTG
+  0ePKB5qdLN5NjycqvNQIpZAFVj71LsaJQBuGaAH3aCVwycKODUMsZgJjxv8AXIzUs0DpHhmBycjm
+  gOd37wdRjNAFETeTcARAbSeTViApfrhjufHXNJNCsUu18Z61Xit3Q5JxQBdW0MYKyn5hSf2BPIjS
+  24I29T6f5xUMMrs5HOF71ooVmtMyu3ynAAzQBqeCfG7aaPsmuYkiYFG3HseKq67YQW2rSNpLCS0l
+  GQ5GSh74xWZc2SyxK4OZl5x7d/0rV0K+j+xPFOu4Pwpx0oAo3OnFreM7AR9Kp/2eYpxtyCx6VoXd
+  g2nSlQzMh6UxJdjqSpKgfN6mgCOLSZGkKyYw/wCn+c1YltRodoWA+Y8Z+taPhWz866DQqxLdmq34
+  x0ZbS23yY3NgkUAcZcSyrjcc7zw3YU62meOeTazdOhrZ07TYLkYvSFVfmqveQWkDj7CW9zg0AZs9
+  8wbO3L8ZpvmGRsyZQDsO9WLu0EwZojwMc1DJCrsA5we1AFmGVZLc7Y1bA6nvU1gIyNzgxtnoKr7I
+  NgHO8dx0pJ3AYG3UnHegDRS+NpL5lsxh3dQverj38OtL/pKCKSPhWU/f+tYEt98xMnC9qgludrrJ
+  GzFl7DvQBq6pYNGdzHGO3aqS33kEBhlSME0+01z7OcXGXRupJ5H0q5fafFqNuJLLnofmGDRsBmJe
+  DzMEZGevpW7o8sN/bzLqTBML8oB71k/2YYh83FQRqbdtr7sDv60AX7jSo4ZsiVo067hj9anuNHey
+  jVizMj8gkdaqQyi+UxjO7O0A96tXDz6rEFucp5HygUANGEQKjDJGaqzWbzgyn5QOPY1p2xZtOaGN
+  VMo5BPoKqxa1NHHtmij+Q4xkUAUraZFiYScMOgNMf76CIZHf2q5KRq8arEjK4OTsGaki0oKwAEhP
+  uDmgCohEsqq/O6rrMNMj3AEdgfQmn3tqUgEcaYz1JFMtLdn0wpFGxYHhjQBa026M0XM2WQ/NnHzU
+  6Yw6tCPt6rbpH0CdvzrPtrZ45ceU4cHk9qtzW6XLOjqwY9+1AEa+HWun8zR28xU5LAZx+VLaGSV9
+  jrkr145amvEY4hGkjKMg5XoPY/571vaHFDr95HHqDMkoU4C9G+uKAOevoo5iSBjBxVYwLdRkL1Xt
+  XSeK/CdzpkjRMqyJ95SjbsD3rmJbUwoeuGOCfSgC9eWc9rcbbdA0KHPmhcq39Ka8e9DkBS5zk1X0
+  /wAR3dvEtuTm3AwVzW/D4w0xIEivbOaSTAVWBAH40AYMu6CZDkFcHcTz6UrtkYlwVHIwOtb91olr
+  qtuRZSL5h5EX8VY97pc1jKAqZ2jB/wA/nQBRJhubjE4YOOnNMC+S+DzmrMkIA819wPTbjmqwfzcM
+  4w3vQA9mbYwgIz/ENvSm2t+6jZsYKeTkVYjn/eqwGAOp9aeW+2sdkgVf5UAQLKY5MHGferNv+6IM
+  XT07CmyaeZIS1vtmkUdQKbZ+akOZoyqMe45oAvRzjUJPLLgSds8/zqyPDzwETagy4U8YwARWMbcw
+  NuDDePenPrbXEfkTn5hwrdqAO709LPSbbzlZdvqD0Ncnr/iufX793uWQrGdmFGBjpmstdQeFRHKx
+  2Nn5f73+f61E7iLCxDnrjvQBaubtNypAxyRzg0q263DMsJIzzyc1mwyDeSD82e9XIGUIrSyBNw+X
+  2+tAD3tSpcFvufrVZbdL2XbnDdjnGKnhs2nkYtcIEJ6461HMiJIApBVe5HWgB8mmtpzDzSrrkZYU
+  65mRGYoBgirEkCStiJlC7c5IqjLNsYhtu0d6AKkshbAZcAdc81Gdwb5SD6cVZjYy5WXBVu/pWppn
+  h63urfdLdxR47MDk0AYjnhehxntVq11OVANuTj8q2/8AhBZ7mwkm00CYKQBtHXrWe+kTWS7J4zE+
+  OQ1ACQX/ANrkC3DD0wODV280KQwM0jxheueKdZWcCrvkjYYHUHvRe6jFLapHtLKeDjg0AVrDQ5xd
+  xuhIUEMHx8pH1roZtH+2W+dPIbHDMOcms+81YNoqWltlFKhQD1HNP0e5udHsHFkcyMRkDoaALUPh
+  aa1n8yUgqRgjPOO/eq+reDkvHzoQYIB85JzzW5HBLqWmCSWQJM3UEdB3/Sk0S3uNPmIkBlgJyXAw
+  o/Ci4EHh3QYfDsfm3mHklGGLdFqS91HSYpvMw0jjkhTx/KqXjLUg8hihYiMn746H6Vg+QYxuV9vH
+  1oA3xrem38TNe28rqp+VUyD+gpbTU7O6ylvEYoEBPzjDAjp2HeuUk1aeyfNqMH+8BTrvVhqEAMuP
+  O7n1oA3X1Q3U0klp5S7OGHFZt7rj4DwxlTJ6riqMTiDZsHTn6/WpbfU5EP8AxMVMqdFIOMfWgCZb
+  lpEO/GDgn9K6bwZpktjcC7lUsAMYPvj/AArBi0lrpc2sqbZsHbjkV20SvDp8UUZBcDp60AY+ueIZ
+  dIu3Frh0lbD+YNxAPXBPSqLrpuunyNPBSSM7mZyQpJ/KtWQ2uqvNDcjypQjAFjnJx0rhNYhntbvy
+  7jcucgIe9AEUMOy5ImYgg4xViVVa4UFSoToc9a6DxZoEdqv2rTsHzDlx/dFcujFpG27vlPGe9AEi
+  anPpV359o7b143jqo/yP0rWs/FSavF9l1JltlB3tOerd+axl3XGfMXC9896iu7UbtyYIxg0AdTc2
+  Vrqe3+zZxIF4Uj+I1S1Hwpexu0kts8aL7Vg2t9JZ8REjJ+UD+Guh0TxjeaW3/EwAuFAxh260AY8y
+  ujfLkBOCOuabHcqgCxYAbrz0rsbSysfHdzks1rO33Y0AwTWd4h+D2r6M5mmt0ER5D85P1oAxLfWZ
+  LSYrbnAb5eKnudVnyELFkHOcCqUmjzRzBWyD9K6W38JtLo6TtkLzmgDHtryGZiZUDZqDU1Vl3wp8
+  g+9jsf8AOKmGnw2cpE8jFR1I7VdGjRXMQa0kdoSPmHrQBn6bYnWz5NydjgZVgORWeztBK8ZBJQld
+  x6nFdZ4ZtoNI1QPI7O+OB7VX8faO9rdC7ESrC4BJHqaAOcgUTtuORiraW0M9yiXLAIeoPc+1RWar
+  u6Haxq7e6ekEZkBGzGVz1ptgVprUw3ku3iJDgDPUYFEzAwZRN2CDgUw3JEkezD7+xolvytwn2pVV
+  RkADv060gLVlMk4aLIDHp7+1Vbu1+yzgThiHOOelElyIZl8v5CDkVtxWkGtaYs0bMblCcr/KgDCe
+  3LzsN20L2HepUQJnHI9KsX+gT29pHKCd79qWw0u4aPcwU4796AL+meIr2G1aDSbiWHOMhR1qxZXz
+  xXBl1n/iYBBlg/FR6VZW1nciS9mdJADgYGO1Q3pIOOu5hz60AO1vxLDqluP7Pt47eJSQ2KzvtiSg
+  eWuPpU89gsfzH5cc+1ZaSpbXRZT8tAGjjz237gNuPwrc0O48uUPOM4GBXORXC3HmJD1bB/QVZivZ
+  fLwp+71oA6fVfEiwXC+UBGjfKTj14qZbi7gtJWjkY2zx5C9s4rnbCRdZiaOUkFQTke3P9KbYa1c6
+  XcBARLEWxhzwBU2AotqzH5Ls5YdFPOKmiu1KgxfvCOqHrXTL4EXxLbl9MO6bGRkYzXPal4TuNLu2
+  ju/3csfUD9KoDO19yChhO3OcqO1VoZEUbHVckZL9x3q09s8a5uDkZxUDWX2i4OzgHvQBLCwkwyEF
+  c4z6VNDZm7utkROCfwqCzAhuGRhhV/WtR5okjjkQ7ST2oAlSRtMdUjHzR1p2OuOI2Ly4kHQViS3K
+  iYBMsW5zSNF9klEjPnPSgC1dzm4uVKSMZd4JP41oeJPD8+r6ZHLbwmW5H3yCMqvr/Os6xu/tDfvU
+  CqSOfWuj0yf7OxLO2CAG9x6UAZs6vcIqSiVw3GQMisR7RVvpFkGFU46e1dN4c1hYmCXm0quDIO9c
+  54quVl16drdDHGzZX6UAV5bTzWIi4Ws6/DQEoQSpI5q9BfywxkS7WU9OOlMa3F8hG7bj5sn86AKc
+  ErggKVA96lFwLcYHX3NQPAHnYD5e26pAnluA/JoAu6JevFqsEqs4YN0HQV39p8aL+CJVnWKWOP5c
+  OAf6VwCzrbxAIMMefpT48zEFD9RQB6hZ+PNE8YqsfiJFt5GOC0abcH6ioPF+i2/hiGK50xmuLOQ4
+  AjO9s/T8a8wlzLIdxKkHIwcc1s6R43vdJi2xurxsdriQbto9RnpQBal1C1urtzcIVjfqu3FRMNM8
+  zbpplViehyAKnuU0/X4N+ixtFdR/67e2fN+g4xzWPcWzWFyDL8gP3Qw+9+NAGhqulSWzpJHt/wBn
+  Bzj2NejeHLG28f8Ahox6/HsmA2DHBGO9eTrrksUTKSOD0Par+n/EnVdMRVsZYgpHIK9u9KwEvjn4
+  eTeF9UY2Jie3HI+bJFc6b6eMkt909j2rsrTxpYa7bGHWYpXlc8Ord/yrOu/B8gEjQul3Ao6RjLL9
+  cGhaAcu0skr7mK8HtTjEAcMMk881Zm0l7JXxg7uQBywqqzysygDBPr1qgHSWqzANL6UunXjWBOxW
+  KsaZcggbu4HSlindrf5ANxNIDqblPteiWrESNC2fujJ7Vd0bRY7KLfZswWYZYSdT2/pWJ4Q8ST21
+  1b2krIYj8pBFdd4k024ht0nsdpjA4AHNAHO6npkSs2SwPase6ieJcSYdenB+atGbWykgF9G2cHvi
+  qGqMxiWW0GFyCSRnFAFeSN4yGiLE9we1QXYEhzMo+bnAqaC9YzbpSGY8CoL/ACwDQ80AV1mxdJwQ
+  q9h1qd71WHU/QdqgDO0gJAyevFE4WI8dW60AafhzUHt5v3ZAzxVzXNFku/38Odg9KwbK4ELA4z+N
+  ddourgQKJsMv92gCr4Y8Qy6VGUmkdLcDjn5/8a6vS5tM8SWTG3kkaZeP3xIyfxrmPEuk/ZXF9akG
+  CY/LHj7tZy38tvcxSwnYw7DpQB0viLwrIigwhcHqAeKxDpbmcgJtKjOfStXRPHgjlEeuAzZ6bf4e
+  lajX+navE4gZIyQcFmxQBxd5ZPG+9iuDxmqitHGR5oO09M+tdDqmjNsDl90YPBHSsJ4N7uH7dOOt
+  MByxj+EkE/d5qwYGkUNu+VetUgxVz6gVNAryx7Y84J5PpSAeZWjG8A/Lg1sabqn2hF8wnniqPkK6
+  qk/z/TilaEWo/cgqKANPSbRba8zM6MXGDzVPxHYPPOzOOVPy471R03XmSRXlQEHv6VstqaakgJKh
+  h0X1oA5jBjYrP8uTkA9TQ0qoxLHqPyrQ1+z6TMu104x65/8A1ViSsVc5GdwoAseWbkDyQWC01QVv
+  S+5WGcbe9OguTFZqIjhxnPHWnWTCO6LyKjPnpQBDfs4n3sMc8Y7VPBKWT922498U7X0RCjRnJmAL
+  KP4aq2rtA/ycBu5HXFAGkYg0GT8rY5J5qIw5jyMORxU28zwAou5jxj1pnktAzCUlT1xQBHFP/Z8w
+  dpNsg6ccj8a6jQPFNjqdqbfxJbvPM/yxTE/LF9c1zsNsJ1U3EYIP8VPe1iicCORsnnHTBoAtat4Z
+  mS92Wn79WBK7aw0ia3uXW4jdChxkjvW/Z+KLjTZFd4hKwyAc44qy+nwazpxEOPNdvMdx1UdTQBzb
+  AbSNyqGPf+lWvDPiW58IXDtZzOIpRiVVON4qS/0ePcG04/aYV4Z8YwaoPGJrgq2AqnAPY0AdVdww
+  eJLX7XoxSKfbnyRwzn61zGooyMzsreYpwQTyn+P/ANap9NvX0S4DQtzu7dhW/rel2viWzWfRiPtC
+  L88a/wAfuaAOQEvyDepIOOamtbFJZWKzrH7Gpk02QRBLgYYHkDtSTaf5LBgM7u1AEVxbS2aiSNfm
+  xw3St7RfiTLFZi2vUe4VRt44xWJDczTzoLoFgvO096bMomlkaJfI5ztFAG7Jqdlrcm2WNYHA+82C
+  KidbiCAoVLWzfKoHOawo1dyGO4bQcc9frWppOvSwQLDcDzQSOvbmgCjcWBQsqDYwOTmo44BdAZfG
+  OeuK1NYdZLjzCdu8dAKzpLYQt+6OKAK88ciXREQ3AY5/Ckmt3dlMoznPSrMU2zJxgD2zSSRmX5kY
+  gdiO9AFWO3KSDgqMjrXQ6fYuUAjG3HO7rWRawNeSDLYKnHPeunVG0bR4ruTnc20g96AHxn7ZbNA7
+  qzgcVzup2s2mzOl0CAT8jYzvrb1TxpZ3tgr6fBFFL/EUqpp+pJqpxeqJAPulucfSgDDfcjgxAqSP
+  mB60xXXlZFBPXpV2+tms5W2oTnpk1nht0uZCAfTFAG9oOvCJBb6jueJj8qj+Grer6XFCqvHMvHTA
+  zmuajlMUmWHznoKvQ6tLDEPtKeZnsT0oAkaBVLGX7x54qOG6NvkEEA/rV2dYLi08y3fMhH3e4rMR
+  mkDLOMkHg9KALcN7vXI4Iq9ZyG5jw7An1rFuWMWMAopxTzqMkIxZAuOpINAD7ZAcg9F6VqaXdRFg
+  pX5h92sPzRbfKQdvr61c0+4MjDyxsYHkkUAdA2lvdQ+ZcDIPGOuawNY0wWNywjwVbocdK2E1ubTF
+  +T5gw5yM1Lc2kOqaX5kXMxG4nPT8KAOSUSKu5VGM03aZmRo22k9Tird26Fgp+6hwcVAZfNmCnBVu
+  mKAJp7N71FDcuOI8d6pJlLlt+d44PoK0dTZLKCI2HmCZQCd33c+1R6iqXKpJBu34+bPQGmBNpzND
+  bgH7zHjPapLiXMhEvzMRwarQXG+ILcfMP7w7VZjdHj+QgMOmaQCRF7AsVBZO2am2G5t2kIAJ9O1V
+  2vzM21l+UU9Cjj5M8eh4NAAIXjUeRl8/pUa6k1hGFtWyG6n+lWYX25Y8dsUs9t5tkVkK7Tz7+tAE
+  9l4hAj8q/RUf+Db0P1qZ/DUWrTO0paK9cfLGg+Qn61zc0SeYc53DgVr+HNfk0u623LgwSDaxHLY9
+  QaYFa80a60G58vU1VmbqF5AFWdC1k6PqaTW6qyEbSD+FdRJd2s8IikZJbO46MTmRB7nr2/WsrxD4
+  QjtohLo+9kHXPb0pAd6uh6Lrekm6hkkQSRgNtQfK/p+dc1f/AAsuGUnSWSVScgynbisHQfGFxpki
+  RKw8tRyD0z/nNWPFHji/1lFihkCxKMAocUAaNt8NNSt3bzYrYsnT5xTLvwZYQTIuqzlLh/vqigqP
+  xrk/7QuIwRHcXG4jnMpP9ary3kzhvtUkrSH7p3E0AdXqPgvT1vI47K4kfcCcYAx0/wAar2ngu2uW
+  ZIJX3pnjHFc3DqUikfPIGHU5PFb2ka3PDe7dPZGGzGW7/wCc0AX7LRLSzcxb3eXrhhxVG78JeVcA
+  bvvcVfEgudqaoyrOrbiV9Pwpmo311pMnmWmySH3w1AGRrXh6TRfLMq8yfcHGPxqxZ6fpmnmNddml
+  jlk5+RQRx/8ArqO51ptT3vMwWU9iOF/CsOZHnkIkYu3YnmgDo7qPTtPszcWTu5LcAr1ycVl6p4hk
+  1BRbsCEXkCqEGqz20wEWGEZGAeRxVy+vRqV2JpUVJiACQMAUAZ0+mvaNuuz88hwAOmaktbt7C4Ub
+  c8jvW5rGkp/YUEsRM0nLSf7PFYogSWEF/lJ6CgDWcjXyuMhwOAO9Y09hLbSyKy9+pqzpM9xo90Jr
+  co2OMMM5ropr2PxBYGK7VVXBbIXG4jnrQByUI8xSADs6HPWpPLIjGxssvr3pxQmcqx+VGwFHenJI
+  gOF5oAW0jZB5nQnnH6Usnzjrg0rW2/8AeISD1x2pWR5VySNo60AQBX2EzHIXpSQJ5kjOOFpLgrtI
+  iLFvWi2Y3CFYuoNAEt4myTBBQ46Gq6OyHKjGTzSyyyXUm+/cnHc0+PY42RtuDcDigDS03UzdQlHG
+  WHFSw3/2CX99lo+hA64NUorOeyG9FJA68VJFaLqNu0hkIlXkgelAF3VtEjvNMF1pKOctyPTFc/bw
+  tGVeMfMRzW54f119M8yJ2IjlGzk9B/k1p6f4fsmi2xXsUmeP88U7gYV5Et3aQlWCsox+NR2eUnWG
+  7bdvrZ1TRY7FXjuQsatzHJ7VkyeXbxnz38xl6NmkBFfiXR3MDKQjHI9xUMV0ijMnNdBZWbeJbUcC
+  SZU+U454rFu/DF7byNJcW0qxqeeOtAE0EcbI+4nax49qnKNY7CCG46Vjw3DRHO1gtaNrqPnBRKu1
+  R0Y80AXYDHPAzlPmzzTWG2Evn8KafMMWIsFfamKxcAyjAHbNAFSeRJpOBg0xrXykVjyp6VLqFv5b
+  AqwTI6dal02ZZ5VjuMNGentQBJZxXFtFuUZDcitDSPFrwOYrkFkfj6Vl30l7p87RpKRDn92eoIqG
+  31gRxk3qMzqRnmgC/wCJtIa2uzLYfMjgEj2rNs70woyIMjPLHtW7Y3y38gkUnGBke1R6p4dS/mNx
+  obeZgfvIVH3Pf3oAz7W3EmGzgrSSRqszF13+4/hqOOLdGSrk5HO0d6WCUxYaUMYhw4HegCM6TLcy
+  Ztkd0wckd6jtZZbPiI+aqnlem2tTStXNvcbYZyiSA4QcdMf41Y8Taf8A2dZieGMR7sAkc7s8H+dA
+  GVJqTT3AKtjIxtrStNVy/kyLuUj1rAlhG4NtKqOc/wB+l+2SpP8AcKMn3s07gdJdeHPtLRS2zpCr
+  csD171laro72bGSFWZRwzHpQdUe8hTDEMg5xU0N7Pcx7GVpIf4lzSAwlk2yAoevUDpWpa2hvYeTg
+  0mo2UM8w8lPs4HUDvRpsFz9oYW6NKB07U0BbjvptGhkgJDRMu01VLRyyIYQSgA3HstVdVMiSlZyx
+  bPKiksbyS1hdWUmKQ5K0gJpt8UgAw69iKn0/UyJdrdOmKIPIvW/cyLEqj7p4zUEUIEr+blHXJBx1
+  oAk1O28q6VoSFVhk1GbZQ25TzUlvcfakIucKAcAnqaWK1cyFkQlB70AJvJdNq5I4+tBcbCnCjv71
+  LIVcAowVhxj0qO2t9zkXHKt0bsKAIpbPIHlKWUjk06wgaNiqIBzViF/kKKwBHA9aguI5oX3REk9j
+  TQErWypGPOGc/pTLTy47gMFyob5fetB7EmcG3G6N8hSTjNWRpgsws/y7ouWB70gKd5dGSRcfKnIP
+  HFXrHSYL61e4kfyVVcYA61lC7OrxurAKxbIHtUtxfC2sTDA/A49KAEazRmkEw+TqG9as+H7YSTeX
+  bvu7ccYrIt7qRdobPLc59K6jw9pf2KUXcJBVjuI/z9aALF88MsJh1AiRoPl54Iqt5GmXUG3ABx1x
+  0/WneMbGfTryO8VB5d2N6qfTJHP5VBoNtFqUb/b28uU/d2d6AJLPV4dGtP8AQyokHGKgu/Fwu9wl
+  PXgj0pmpaSmnOxmYEdu5rOht2knZ4FX3oAimiju3AtlAznrVWSAW7OC2HQ/d7VdNjLaMjurbSeMC
+  s+4WS41BjyEB5zQBcgnk2ARnJbqKZcydmZt3fFVxB+9DRkjHfNWLh/KKGTp/6FQBGLg3C5PzFeBT
+  LeT5yEzlB0p1zb7wGtzt9RTNhWVQOHPWgDc0iUajbPbTgM5GE9aydTtPKk8sKcDrk9adZX5+0FLc
+  FZM/K1dPpmgReJLR2nOyZDhQT1z60AYWgXYtrvy5cFXBXA9+OtGpLceH9YIsZ3BwGI4+YHsaNR09
+  9C1ERTFTMjBgE6YyO9S+IoDqHlag5++RGPfGKALelpb+IbtA+Ldk+ZkXofxqHxFpn2Vpv7OXdGOW
+  56Vk3GpCBQB8pB429a0bHXN8kX2gKY1ILju1AGakfmFfJXLN0/z+VdZYQG503yda5xyPp/8AqqXw
+  2LKJJvsqbjIdwDL936Viarq8u9nhA8sNg88/TFAGrdeFbeWBHscSL/AM9DWRqnhObyS7KUYdfetH
+  wkx1Gdnm3rECAB6Vu674psYbIRxeZuHBJHWgDzZw2nybQMluDVnT9T2PsJK56Ve1OS1vJ/OhOfXj
+  pWVdWctu/mJhgTxQBeYrOS0xAxTojJHKHspCQ3GPSqaXCTuqpnf+lTQIJ5XRXwy0AaN7YxzWzT3I
+  /fSHp6VnS2LI8Yt13kj5ucAU17me4hYbvkHXJ5qvJfDMYDNlevqeaAJTAVJGBuHPFSWuoMN32iNW
+  UgjOelVo5vNUvg8HGKVollOIG4HNAGhb6dHewhrVy8gPK4qaFTZZRssT1GKzLWd7C5zDlS1a9rq5
+  vU2uFAIznuaAK93po2GSIEjqefu1C8QZApc+uBxWnbQpeyCG1OB1cnjmi5sUuTlxgpTQFBAYCWEQ
+  bjrmmsHvDypH0qYqYGPlk56DPSnWFuz3BN2MCkB0niGK10bw/ExCyMxwhVskH8K5O98SPfWixqPm
+  AxkjBNEkkz2iQSzgqn3U54rPm4RkY4YEfhQBd0gPBMGnwc8fSpvElpFBIGU5Y4Ix0qjcanIkKBG5
+  7VGzPdIHvF3P9aAHpGtymc4Ira0fU5YYUG7KA5P0rAEgjOFjfHtVqzndD8ilFkGKAPTri4h1fRrW
+  DVAojmjwjdwPY/XNcJK6aTfubdjhDgc9a19PnbUYLW2upsRJ8o61S8WeH1sryKJ2AeRSUb1oApTX
+  TXpaQMWJGcdal8PSf6UTcj5WOKz5YW0zgTKZG44Bq4THLpSqj7LhWJdsdfSgDo9e16OGFba0ji3p
+  wZCBzXOoYZp2N2u0Mecd6Zp12cIbkfIBzTbwRG53W4wp5oAbeWVmgY2ZYeuTVC4SWFAzjdGO5qws
+  HmK28jaTVi1vhaR+XfRGeJhtVR69jz6dfwpgZEcrPcAp92pl2IzMxLuRwamfSJZCXtnRhnLgcFR6
+  VWc7J9mNpbtikAW9w0MheQj5ea3NG1Y2sPmWhCvjuf5Vk7UadY48RseW960rDS11C3b7EMzL3oAt
+  6hpn9pZu4GzGq7djH5g2PzpPDsMV/Y3Fveg/uVZl+vNJYRy2KhXfcB972q5aRw310/2eZLbcuCWH
+  X8qaA4yTeT845B4qaEqjZlVtzflV+80qY31z/Z8T3ENqMs8ZAAGcd6zoZMncEwH6H0pAdDpusLZQ
+  7Rjc3ApkFoZJHmY4iAPXpms8R7oh/Gc5HtXQaALbUtGMN6ApPHrzQA/TvEdsdOWD92rRk8gcmud8
+  QXkl1cZzlfapr3QP7NujGjfKTlSKzr2Jmdgx/wBX096AIkn8ucBQQjdat/bWMLZKOOnOOKzdjL0P
+  BoiXe2Cu7vQBpxC0KAyK2488Hiql3LskbaDtbpjrV+3tlubYC2TExGBVe+tJNOAF4PmHNAFO0meG
+  R1bI9jU0iK23zcbsdagWYO+xOH7mrkMWYcNgkUAQwKGA4JC5pzyFmPlEADt61asYIgSJWA3dOKv6
+  zosFpdxPaBGVlG445BwKAMwuWADAbqs6eI/3hl++Pu1cj8NFyrRncAdxb0psElpY37NMhljD4YKe
+  poAsWmm/aIjKknlsvUnoalhtHLcbiueucA1Uu9UMs8wt4SsOfkUnkCrOmXcotj9rkV0HSLnmgDoD
+  4JSXSzPNNFJhdwCkZX9a5+K9gD+XPgDdjNTpez6ZZywwPskcZbk/KK5qZ2llPmvvYnrQATr8zE5D
+  N1zxRbou7951anhZNYuUVFw7dvSp59IltXdZ1IZKAGvpLNGfLAfufaqDCSKUEkgdMkVd07VWs7oG
+  XLL0x60+7ePUjyCpByMUAV3bBGxsk1ZikV4gAMkHOKpzW5SUmN849qjjnlil3KODxj0oA6KykW7t
+  yJW8pk4BFdxrGhwax4TS5JWWaEBEY9QDn/CvNrPUfJmBcZDHLV0s2vsfDMwt2ZYy4z7cGgDHv9NK
+  yjfD+8bgYFUNRtTps4S6HlkjIBPU/wCcVeN86xKZmJlyMc5p/ifU5L/RYVmto9wJUyZ5oAy01Dfb
+  qZV2xnoKbfX6NEv2ZcHHWmPLFJYQx2ZLTL1U1EIJA+2bAJ6Y5oAIboyDb0PU1c8xLkBJLna4Hy44
+  5x06VAbZbdcyZ3elNBXeCRjnOaAG2808N5syYmJ7fx+5q7tW5QCZQso/iqsULT7rXLr6k4xVi0dX
+  +9kmgBlxpbI7SxqZAoGWz0p+i3txZ3AezJAHXjrWlZ26mFyzEnPC+vStzTLO3vZ1M8Yjwp6Hr0oA
+  5/xFqyrIggQKrLlsdc96xpQZ5wySbu2DVnVYQ9/MJCSitxVOQFW4G1aAOm+H3iGPSbie1upBDBqC
+  CKRugwOfwrI8VWsenazNHZtvs0fEb/3h6j171Elg02N65x6Gt200i18VwwwXcjQ3Fou2NQMiTvye
+  3WgDn4riKEhkfKf3h6+9aFlGLeyS8eT5DIMoDnv3FXZ9I0iwhJFxJLMpwY2ACg1TvvISzMs77S5w
+  EUcUAW9dH9qW6y6ZKBgcgdawoNOu7iWMmNiWOMDtT4Jxb5e1bKuMEHsfWpNM1ZrG4WWFmct0BHSg
+  CprWivp0u193mMeR6VHa2jmQbVH0zV3WNRkv5mkn5YnjFRJGBMjRMScdKANvR7OO1u4pS+SGGV68
+  d61/GnhSHUYReQyqsZXiPI64rK0S5hRNzfePXvWr5w1KIwwucAccUAefW1q8kqiT+WK0RpdzFFuE
+  bFT0bHBqxrFj/Z87LjDZ/Km2ctw7Kgk3KO3SgDPQPuHmqNynv2rRs7hrhjDIcDqD6VPeafDfWbbC
+  UnUjav8AeHfn8qsaL4bl2pLcYWJT85PYdzQBq6dfjRtKX7QnmC4JQH07f1rIl0SztbsSrcoQnJQH
+  qaseJ7mBVT7PIXtDwrYwQ3esOO4RrxvLZmjI+90P5UAXrm881T9lHOeAOareXPH+8BKOB19Kb9rF
+  pcq0ILDPc8mp7m+S6k3fdKj7vWgB8Gtj7Oq3AZ3fCs7DmorqxQTbl+oAqJJlu4gJMKwIxT3kNq+H
+  G5/7o7D1zTA7Pwpd6NBrk5vQwMv3Pl+7UnjAwwXX7tFe3l5UjBbHvXP3GnCOxhuo2IL1G+qPcFYX
+  cknoT/n2pbgVZtGFxZvNbH5VOBk+vt+FZ8lrPakrcqyHGcEYzWidWS3lCxAlVPUdDWxf6pa6nLH/
+  AGlH99QoI4wTwKbA45pHEirjk1asbxYZCsoDYH1rV17wyumSKVbeGG4Y6gVk/wBn7UdgCpPc0gLw
+  aEwtLKMDtWhoNykVwHdd8JGCjDIrDkSW1g2zOhVhkVLo+puSVlKlccYoA6Dxf4PbSLRb21wto7DG
+  W7ntj61mpKdXtxaOQvlfMCSBuJrqLfWIfEvhg2muKzQoN4CnBJHT9cVyU5hEjNbB0CHABPNAGTPa
+  fZriQONjqcZ6flUtqqB1SRmMr/dJzWlDaLrEUh1Qbnx+628ZNZE1s9nfctxEccjpQBO9tLcy7Zjw
+  vfNQ31q9oee3A75qe2Yyzby5OKiutRMsjKQDg4FG4EVvEyfM5xnsD1q5bbzKHBAB9KrCJN4YMd3p
+  V+wt8szRZUCnYDXsWSGPz7jGI+SMVVuvErXKEWuRk9QMYqXVyLXTUyRmRcmsSC4EAO8D2pAXxbma
+  IMR8w7+tVdRtkUAT9ew71as7wsF2nFGsKodDOMzHo/YU0rgULe7j098qW545Gaki1FIbwzeYyzfw
+  EdvyqkyGSfaw+bvRcQLayqyEnAyaQHR6gi6/pXnBER0IGFHzN15rnmlXyTGRuQHByeQau2GrS20G
+  9OhO3H1//VWhf6RprXbXmnrMtuYsOjNk78DkfiDQBi2rpHIVQjb1otHPnBZAMAdRVUQiW6Bgyis2
+  Buq29q2nXJjn/eDsycUAOLCG8yg9zkcVCzeVIZY+cenekN0LqYRSHAHA9aLMCOTy5BlTyPegCxa6
+  ltkL2+ORzxjFWbTXpLSV3Y84+XFVJvLilKjgVFMpAyBxQBq6prEF7bQSzA+ZJ97jpVRGjDbUJAB+
+  U+tUywlJUdE6VteHLK3kuoDqQZ0zyAcYFAG3feVo+io90u2d13R/LyR35rm77VZNSmzC5SEj5hnH
+  14/Otu+hv/FN3gTWywW4KRqQM4/OsUeFZp5miaVAc9R0oAaXWa0EUWCIjuA9PeqEMbCYM3G77oAr
+  bi8Gz2YDmeLc3ygev61X1CxnnuTE8TvPb9fKXigDMuIJFlBdtzHnAPSrEF0IwDCm5hw2VNRzxTWt
+  0BeKVMnTIxj8KZ/ahtgY49uT7UAX7VH1K63oERVOTxiuu0ex0nS7L7chJkm+R1kwwyPQZrh4JJDw
+  zbVbk4/OrNpefLsnyyg5UUAf/9k=
+
+END:VCARD
diff --git a/vendor/sabre/vobject/tests/bootstrap.php b/vendor/sabre/vobject/tests/bootstrap.php
new file mode 100644
index 0000000000000000000000000000000000000000..a01f8f96b6a301390249d5e951d03909944cfbc8
--- /dev/null
+++ b/vendor/sabre/vobject/tests/bootstrap.php
@@ -0,0 +1,25 @@
+<?php
+
+date_default_timezone_set('UTC');
+
+$try = array(
+    __DIR__ . '/../vendor/autoload.php',
+    __DIR__ . '/../../../autoload.php',
+);
+
+foreach($try as $path) {
+    if (file_exists($path)) {
+        $autoLoader = include $path;
+        break;
+    }
+}
+
+$autoLoader->addPsr4('Sabre\\VObject\\',__DIR__ . '/VObject');
+
+if (!defined('SABRE_TEMPDIR')) {
+  define('SABRE_TEMPDIR', __DIR__ . '/temp/');
+}
+
+if (!file_exists(SABRE_TEMPDIR)) {
+  mkdir(SABRE_TEMPDIR);
+}
diff --git a/vendor/sabre/vobject/tests/phpcs/ruleset.xml b/vendor/sabre/vobject/tests/phpcs/ruleset.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ec2c4c84b1d8eb48b79d234a37004e32ba7b62e0
--- /dev/null
+++ b/vendor/sabre/vobject/tests/phpcs/ruleset.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0"?>
+<ruleset name="sabre.php">
+    <description>sabre.io codesniffer ruleset</description>
+
+     <!-- Include the whole PSR-1 standard -->
+     <rule ref="PSR1" />
+
+     <!-- All PHP files MUST use the Unix LF (linefeed) line ending. -->
+     <rule ref="Generic.Files.LineEndings">
+      <properties>
+       <property name="eolChar" value="\n"/>
+      </properties>
+     </rule>
+
+     <!-- The closing ?> tag MUST be omitted from files containing only PHP. -->
+     <rule ref="Zend.Files.ClosingTag"/>
+
+     <!-- There MUST NOT be trailing whitespace at the end of non-blank lines. -->
+     <rule ref="Squiz.WhiteSpace.SuperfluousWhitespace">
+      <properties>
+       <property name="ignoreBlankLines" value="true"/>
+       </properties>
+   </rule>
+
+   <!-- There MUST NOT be more than one statement per line. -->
+   <rule ref="Generic.Formatting.DisallowMultipleStatements"/>
+
+   <rule ref="Generic.WhiteSpace.ScopeIndent">
+      <properties>
+       <property name="ignoreIndentationTokens" type="array" value="T_COMMENT,T_DOC_COMMENT"/>
+      </properties>
+   </rule>
+   <rule ref="Generic.WhiteSpace.DisallowTabIndent"/>
+
+   <!-- PHP keywords MUST be in lower case. -->
+   <rule ref="Generic.PHP.LowerCaseKeyword"/>
+
+   <!-- The PHP constants true, false, and null MUST be in lower case. -->
+   <rule ref="Generic.PHP.LowerCaseConstant"/>
+
+   <!-- <rule ref="Squiz.Scope.MethodScope"/> -->
+   <rule ref="Squiz.WhiteSpace.ScopeKeywordSpacing"/>
+
+   <!-- In the argument list, there MUST NOT be a space before each comma, and there MUST be one space after each comma. -->
+   <!--
+   <rule ref="Squiz.Functions.FunctionDeclarationArgumentSpacing">
+    <properties>
+     <property name="equalsSpacing" value="1"/>
+    </properties>
+   </rule>
+   <rule ref="Squiz.Functions.FunctionDeclarationArgumentSpacing.SpacingAfterHint">
+    <severity>0</severity>
+   </rule>
+    -->
+   <rule ref="PEAR.WhiteSpace.ScopeClosingBrace"/>
+
+</ruleset>
diff --git a/vendor/sabre/vobject/tests/phpunit.xml b/vendor/sabre/vobject/tests/phpunit.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2288151df31fc47216b7a4826517784bb1a3561c
--- /dev/null
+++ b/vendor/sabre/vobject/tests/phpunit.xml
@@ -0,0 +1,21 @@
+<phpunit
+  colors="true"
+  bootstrap="bootstrap.php"
+  convertErrorsToExceptions="true"
+  convertNoticesToExceptions="true"
+  convertWarningsToExceptions="true"
+  strict="true"
+  >
+  <testsuite name="Sabre\VObject">
+    <directory>VObject/</directory>
+  </testsuite>
+
+  <filter>
+    <whitelist addUncoveredFilesFromWhitelist="true">
+        <directory suffix=".php">../lib/</directory>
+        <exclude>
+            <file>../lib/Sabre/VObject/includes.php</file>
+        </exclude>
+   </whitelist>
+  </filter>
+</phpunit>
diff --git a/vendor/sebastian/finder-facade/composer.json b/vendor/sebastian/finder-facade/composer.json
index 645bc26c44a936865b1522e184d5a88f06cef181..ba282a5e34cc1e0d25792246df3af4fb4efefce0 100644
--- a/vendor/sebastian/finder-facade/composer.json
+++ b/vendor/sebastian/finder-facade/composer.json
@@ -15,7 +15,7 @@
     },
     "require": {
         "theseer/fdomdocument": "~1.3",
-        "symfony/finder": "~2.3|~3.0"
+        "symfony/finder": "~2.3|~3.0|~4.0"
     },
     "autoload": {
         "classmap": [
diff --git a/vendor/symfony/config/ConfigCacheFactory.php b/vendor/symfony/config/ConfigCacheFactory.php
index 396536e2d8ed8eddbe1102d315f955723c6eb14b..06dbe6c2947edbe8a9e650310286c79c15ad69e5 100644
--- a/vendor/symfony/config/ConfigCacheFactory.php
+++ b/vendor/symfony/config/ConfigCacheFactory.php
@@ -22,9 +22,6 @@ namespace Symfony\Component\Config;
  */
 class ConfigCacheFactory implements ConfigCacheFactoryInterface
 {
-    /**
-     * @var bool Debug flag passed to the ConfigCache
-     */
     private $debug;
 
     /**
diff --git a/vendor/symfony/config/Definition/ArrayNode.php b/vendor/symfony/config/Definition/ArrayNode.php
index 8320f4aac315e2644a23cf9f406f1e9619872038..c742f5e5d5b9483f800e32b22cd2e329f6b9c503 100644
--- a/vendor/symfony/config/Definition/ArrayNode.php
+++ b/vendor/symfony/config/Definition/ArrayNode.php
@@ -82,7 +82,7 @@ class ArrayNode extends BaseNode implements PrototypeNodeInterface
     /**
      * Sets the xml remappings that should be performed.
      *
-     * @param array $remappings an array of the form array(array(string, string))
+     * @param array $remappings An array of the form array(array(string, string))
      */
     public function setXmlRemappings(array $remappings)
     {
@@ -198,8 +198,6 @@ class ArrayNode extends BaseNode implements PrototypeNodeInterface
     /**
      * Adds a child node.
      *
-     * @param NodeInterface $node The child node to add
-     *
      * @throws \InvalidArgumentException when the child node has no name
      * @throws \InvalidArgumentException when the child node's name is not unique
      */
diff --git a/vendor/symfony/config/Definition/BaseNode.php b/vendor/symfony/config/Definition/BaseNode.php
index dbf36335b69e38ff46b0ebb242ccc06d0f004272..2e346d79072ed35cedcbe619a2d51d678e50d432 100644
--- a/vendor/symfony/config/Definition/BaseNode.php
+++ b/vendor/symfony/config/Definition/BaseNode.php
@@ -33,12 +33,10 @@ abstract class BaseNode implements NodeInterface
     protected $attributes = array();
 
     /**
-     * Constructor.
-     *
      * @param string        $name   The name of the node
      * @param NodeInterface $parent The parent of this node
      *
-     * @throws \InvalidArgumentException if the name contains a period.
+     * @throws \InvalidArgumentException if the name contains a period
      */
     public function __construct($name, NodeInterface $parent = null)
     {
diff --git a/vendor/symfony/config/Definition/Builder/ArrayNodeDefinition.php b/vendor/symfony/config/Definition/Builder/ArrayNodeDefinition.php
index a1fc1fab0ef78fbd866f2ad2f00a942c805f740b..ed0295c01bbb29abc2ccfa9356a8c3b6d2a83203 100644
--- a/vendor/symfony/config/Definition/Builder/ArrayNodeDefinition.php
+++ b/vendor/symfony/config/Definition/Builder/ArrayNodeDefinition.php
@@ -49,8 +49,6 @@ class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinition
 
     /**
      * Sets a custom children builder.
-     *
-     * @param NodeBuilder $builder A custom NodeBuilder
      */
     public function setBuilder(NodeBuilder $builder)
     {
@@ -70,7 +68,7 @@ class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinition
     /**
      * Sets a prototype for child nodes.
      *
-     * @param string $type the type of node
+     * @param string $type The type of node
      *
      * @return NodeDefinition
      */
@@ -98,10 +96,10 @@ class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinition
     /**
      * Adds children with a default value when none are defined.
      *
-     * @param int|string|array|null $children The number of children|The child name|The children names to be added
-     *
      * This method is applicable to prototype nodes only.
      *
+     * @param int|string|array|null $children The number of children|The child name|The children names to be added
+     *
      * @return $this
      */
     public function addDefaultChildrenIfNoneSet($children = null)
@@ -322,8 +320,6 @@ class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinition
      *         ->append($this->getBarNodeDefinition())
      *     ;
      *
-     * @param NodeDefinition $node A NodeDefinition instance
-     *
      * @return $this
      */
     public function append(NodeDefinition $node)
@@ -420,8 +416,6 @@ class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinition
     /**
      * Validate the configuration of a concrete node.
      *
-     * @param ArrayNode $node The related node
-     *
      * @throws InvalidDefinitionException
      */
     protected function validateConcreteNode(ArrayNode $node)
@@ -456,8 +450,6 @@ class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinition
     /**
      * Validate the configuration of a prototype node.
      *
-     * @param PrototypedArrayNode $node The related node
-     *
      * @throws InvalidDefinitionException
      */
     protected function validatePrototypeNode(PrototypedArrayNode $node)
diff --git a/vendor/symfony/config/Definition/Builder/EnumNodeDefinition.php b/vendor/symfony/config/Definition/Builder/EnumNodeDefinition.php
index 56047ad5dec2cc249afc0b78860b6bc88e218ec2..817906f5076295ea9a9e660bd31630f5a387459f 100644
--- a/vendor/symfony/config/Definition/Builder/EnumNodeDefinition.php
+++ b/vendor/symfony/config/Definition/Builder/EnumNodeDefinition.php
@@ -23,8 +23,6 @@ class EnumNodeDefinition extends ScalarNodeDefinition
     private $values;
 
     /**
-     * @param array $values
-     *
      * @return $this
      */
     public function values(array $values)
diff --git a/vendor/symfony/config/Definition/Builder/ExprBuilder.php b/vendor/symfony/config/Definition/Builder/ExprBuilder.php
index 10112a813df7a0df9bd07422d998fbd67392d3fe..004042817afa5733cf016d606c291b7edd30206f 100644
--- a/vendor/symfony/config/Definition/Builder/ExprBuilder.php
+++ b/vendor/symfony/config/Definition/Builder/ExprBuilder.php
@@ -25,11 +25,6 @@ class ExprBuilder
     public $ifPart;
     public $thenPart;
 
-    /**
-     * Constructor.
-     *
-     * @param NodeDefinition $node The related node
-     */
     public function __construct(NodeDefinition $node)
     {
         $this->node = $node;
@@ -38,8 +33,6 @@ class ExprBuilder
     /**
      * Marks the expression as being always used.
      *
-     * @param \Closure $then
-     *
      * @return $this
      */
     public function always(\Closure $then = null)
@@ -58,8 +51,6 @@ class ExprBuilder
      *
      * The default one tests if the value is true.
      *
-     * @param \Closure $closure
-     *
      * @return $this
      */
     public function ifTrue(\Closure $closure = null)
@@ -112,8 +103,6 @@ class ExprBuilder
     /**
      * Tests if the value is in an array.
      *
-     * @param array $array
-     *
      * @return $this
      */
     public function ifInArray(array $array)
@@ -126,8 +115,6 @@ class ExprBuilder
     /**
      * Tests if the value is not in an array.
      *
-     * @param array $array
-     *
      * @return $this
      */
     public function ifNotInArray(array $array)
@@ -140,8 +127,6 @@ class ExprBuilder
     /**
      * Sets the closure to run if the test pass.
      *
-     * @param \Closure $closure
-     *
      * @return $this
      */
     public function then(\Closure $closure)
diff --git a/vendor/symfony/config/Definition/Builder/MergeBuilder.php b/vendor/symfony/config/Definition/Builder/MergeBuilder.php
index 1d24953df5742736fdb956cab6c7477cff3e8555..105e2d64709b11342c113f732bb0ab6655e2ec16 100644
--- a/vendor/symfony/config/Definition/Builder/MergeBuilder.php
+++ b/vendor/symfony/config/Definition/Builder/MergeBuilder.php
@@ -22,11 +22,6 @@ class MergeBuilder
     public $allowFalse = false;
     public $allowOverwrite = true;
 
-    /**
-     * Constructor.
-     *
-     * @param NodeDefinition $node The related node
-     */
     public function __construct(NodeDefinition $node)
     {
         $this->node = $node;
diff --git a/vendor/symfony/config/Definition/Builder/NodeBuilder.php b/vendor/symfony/config/Definition/Builder/NodeBuilder.php
index e780777a1e8375a0793953d6144d685aa3136861..152a497b143393a0ee8354f62223c1e6e47b6f17 100644
--- a/vendor/symfony/config/Definition/Builder/NodeBuilder.php
+++ b/vendor/symfony/config/Definition/Builder/NodeBuilder.php
@@ -21,9 +21,6 @@ class NodeBuilder implements NodeParentInterface
     protected $parent;
     protected $nodeMapping;
 
-    /**
-     * Constructor.
-     */
     public function __construct()
     {
         $this->nodeMapping = array(
@@ -40,8 +37,6 @@ class NodeBuilder implements NodeParentInterface
     /**
      * Set the parent node.
      *
-     * @param ParentNodeDefinitionInterface $parent The parent node
-     *
      * @return $this
      */
     public function setParent(ParentNodeDefinitionInterface $parent = null)
@@ -66,7 +61,7 @@ class NodeBuilder implements NodeParentInterface
     /**
      * Creates a child scalar node.
      *
-     * @param string $name the name of the node
+     * @param string $name The name of the node
      *
      * @return ScalarNodeDefinition The child node
      */
@@ -90,7 +85,7 @@ class NodeBuilder implements NodeParentInterface
     /**
      * Creates a child integer node.
      *
-     * @param string $name the name of the node
+     * @param string $name The name of the node
      *
      * @return IntegerNodeDefinition The child node
      */
@@ -102,7 +97,7 @@ class NodeBuilder implements NodeParentInterface
     /**
      * Creates a child float node.
      *
-     * @param string $name the name of the node
+     * @param string $name The name of the node
      *
      * @return FloatNodeDefinition The child node
      */
@@ -180,8 +175,6 @@ class NodeBuilder implements NodeParentInterface
      *         ->end()
      *     ;
      *
-     * @param NodeDefinition $node
-     *
      * @return $this
      */
     public function append(NodeDefinition $node)
diff --git a/vendor/symfony/config/Definition/Builder/NodeDefinition.php b/vendor/symfony/config/Definition/Builder/NodeDefinition.php
index 1b712a3150bc3dee1f53b2276059b753816f2ba7..3c2610b5d11574507b4da0c6b3a5f9062c72698c 100644
--- a/vendor/symfony/config/Definition/Builder/NodeDefinition.php
+++ b/vendor/symfony/config/Definition/Builder/NodeDefinition.php
@@ -32,16 +32,10 @@ abstract class NodeDefinition implements NodeParentInterface
     protected $nullEquivalent;
     protected $trueEquivalent = true;
     protected $falseEquivalent = false;
-
-    /**
-     * @var NodeParentInterface|null
-     */
     protected $parent;
     protected $attributes = array();
 
     /**
-     * Constructor.
-     *
      * @param string                   $name   The name of the node
      * @param NodeParentInterface|null $parent The parent
      */
@@ -54,8 +48,6 @@ abstract class NodeDefinition implements NodeParentInterface
     /**
      * Sets the parent node.
      *
-     * @param NodeParentInterface $parent The parent
-     *
      * @return $this
      */
     public function setParent(NodeParentInterface $parent)
diff --git a/vendor/symfony/config/Definition/Builder/NormalizationBuilder.php b/vendor/symfony/config/Definition/Builder/NormalizationBuilder.php
index ae642a2d49a2caf2be399bc8ab702a6dea30a64f..35e30487a60ebd21106ecb15c04ade3aa5ff700d 100644
--- a/vendor/symfony/config/Definition/Builder/NormalizationBuilder.php
+++ b/vendor/symfony/config/Definition/Builder/NormalizationBuilder.php
@@ -22,11 +22,6 @@ class NormalizationBuilder
     public $before = array();
     public $remappings = array();
 
-    /**
-     * Constructor.
-     *
-     * @param NodeDefinition $node The related node
-     */
     public function __construct(NodeDefinition $node)
     {
         $this->node = $node;
@@ -50,8 +45,6 @@ class NormalizationBuilder
     /**
      * Registers a closure to run before the normalization or an expression builder to build it if null is provided.
      *
-     * @param \Closure $closure
-     *
      * @return ExprBuilder|$this
      */
     public function before(\Closure $closure = null)
diff --git a/vendor/symfony/config/Definition/Builder/ValidationBuilder.php b/vendor/symfony/config/Definition/Builder/ValidationBuilder.php
index 12aa59a4fd61cc15ded1ece25742f50bd32934d9..bb2b9eb33924b62cbd4269efba97fdb43429676d 100644
--- a/vendor/symfony/config/Definition/Builder/ValidationBuilder.php
+++ b/vendor/symfony/config/Definition/Builder/ValidationBuilder.php
@@ -21,11 +21,6 @@ class ValidationBuilder
     protected $node;
     public $rules = array();
 
-    /**
-     * Constructor.
-     *
-     * @param NodeDefinition $node The related node
-     */
     public function __construct(NodeDefinition $node)
     {
         $this->node = $node;
@@ -34,8 +29,6 @@ class ValidationBuilder
     /**
      * Registers a closure to run as normalization or an expression builder to build it if null is provided.
      *
-     * @param \Closure $closure
-     *
      * @return ExprBuilder|$this
      */
     public function rule(\Closure $closure = null)
diff --git a/vendor/symfony/config/Definition/Dumper/YamlReferenceDumper.php b/vendor/symfony/config/Definition/Dumper/YamlReferenceDumper.php
index 31c3f8e0161fc26737633856847ecbbac1be7fc0..01e158217b1600e6ced0e79a9a0f8652d7fefedf 100644
--- a/vendor/symfony/config/Definition/Dumper/YamlReferenceDumper.php
+++ b/vendor/symfony/config/Definition/Dumper/YamlReferenceDumper.php
@@ -122,7 +122,7 @@ class YamlReferenceDumper
             $comments[] = 'Example: '.$example;
         }
 
-        $default = (string) $default != '' ? ' '.$default : '';
+        $default = '' != (string) $default ? ' '.$default : '';
         $comments = count($comments) ? '# '.implode(', ', $comments) : '';
 
         $text = rtrim(sprintf('%-21s%s %s', $node->getName().':', $default, $comments), ' ');
diff --git a/vendor/symfony/config/Definition/PrototypedArrayNode.php b/vendor/symfony/config/Definition/PrototypedArrayNode.php
index 1c3c2188326bef3ebd0e10479b8bb51a86ef01a8..08f335a015f308994836e648a35a3f0fdcde4047 100644
--- a/vendor/symfony/config/Definition/PrototypedArrayNode.php
+++ b/vendor/symfony/config/Definition/PrototypedArrayNode.php
@@ -150,8 +150,6 @@ class PrototypedArrayNode extends ArrayNode
 
     /**
      * Sets the node prototype.
-     *
-     * @param PrototypeNodeInterface $node
      */
     public function setPrototype(PrototypeNodeInterface $node)
     {
@@ -171,8 +169,6 @@ class PrototypedArrayNode extends ArrayNode
     /**
      * Disable adding concrete children for prototyped nodes.
      *
-     * @param NodeInterface $node The child node to add
-     *
      * @throws Exception
      */
     public function addChild(NodeInterface $node)
diff --git a/vendor/symfony/config/FileLocator.php b/vendor/symfony/config/FileLocator.php
index 4816724c8190eb9028b4b9daf525b96d752803a2..71fcf4023a685a44cd0f9ebc18acd0970dad3282 100644
--- a/vendor/symfony/config/FileLocator.php
+++ b/vendor/symfony/config/FileLocator.php
@@ -21,8 +21,6 @@ class FileLocator implements FileLocatorInterface
     protected $paths;
 
     /**
-     * Constructor.
-     *
      * @param string|array $paths A path or an array of paths where to look for resources
      */
     public function __construct($paths = array())
@@ -81,10 +79,10 @@ class FileLocator implements FileLocatorInterface
      */
     private function isAbsolutePath($file)
     {
-        if ($file[0] === '/' || $file[0] === '\\'
+        if ('/' === $file[0] || '\\' === $file[0]
             || (strlen($file) > 3 && ctype_alpha($file[0])
-                && $file[1] === ':'
-                && ($file[2] === '\\' || $file[2] === '/')
+                && ':' === $file[1]
+                && ('\\' === $file[2] || '/' === $file[2])
             )
             || null !== parse_url($file, PHP_URL_SCHEME)
         ) {
diff --git a/vendor/symfony/config/Loader/DelegatingLoader.php b/vendor/symfony/config/Loader/DelegatingLoader.php
index 3097878bf0bf295d973d77a49517f2d92ba8a5c2..237009d45e6d169063f8d5b7ffcccdb5eb5b8b6b 100644
--- a/vendor/symfony/config/Loader/DelegatingLoader.php
+++ b/vendor/symfony/config/Loader/DelegatingLoader.php
@@ -23,11 +23,6 @@ use Symfony\Component\Config\Exception\FileLoaderLoadException;
  */
 class DelegatingLoader extends Loader
 {
-    /**
-     * Constructor.
-     *
-     * @param LoaderResolverInterface $resolver A LoaderResolverInterface instance
-     */
     public function __construct(LoaderResolverInterface $resolver)
     {
         $this->resolver = $resolver;
diff --git a/vendor/symfony/config/Loader/FileLoader.php b/vendor/symfony/config/Loader/FileLoader.php
index 2b19b52584bdd000a4d099cc0c19539b613e7a94..b058e485d302c1048c5993186f53c20d3659a1c7 100644
--- a/vendor/symfony/config/Loader/FileLoader.php
+++ b/vendor/symfony/config/Loader/FileLoader.php
@@ -22,23 +22,12 @@ use Symfony\Component\Config\Exception\FileLoaderImportCircularReferenceExceptio
  */
 abstract class FileLoader extends Loader
 {
-    /**
-     * @var array
-     */
     protected static $loading = array();
 
-    /**
-     * @var FileLocatorInterface
-     */
     protected $locator;
 
     private $currentDir;
 
-    /**
-     * Constructor.
-     *
-     * @param FileLocatorInterface $locator A FileLocatorInterface instance
-     */
     public function __construct(FileLocatorInterface $locator)
     {
         $this->locator = $locator;
diff --git a/vendor/symfony/config/Loader/LoaderInterface.php b/vendor/symfony/config/Loader/LoaderInterface.php
index dd0a85a6b08c71e876b78872182ca0ee82dcb002..dfca9dd27bf0dfe7c0af2edbd3d90d13d1d86167 100644
--- a/vendor/symfony/config/Loader/LoaderInterface.php
+++ b/vendor/symfony/config/Loader/LoaderInterface.php
@@ -47,8 +47,6 @@ interface LoaderInterface
 
     /**
      * Sets the loader resolver.
-     *
-     * @param LoaderResolverInterface $resolver A LoaderResolverInterface instance
      */
     public function setResolver(LoaderResolverInterface $resolver);
 }
diff --git a/vendor/symfony/config/Loader/LoaderResolver.php b/vendor/symfony/config/Loader/LoaderResolver.php
index dc6846df8d617e914ecec74aa24c54a38f51435b..9299bc000f5f45a5ca52ac6e4a15b0f4e06d0797 100644
--- a/vendor/symfony/config/Loader/LoaderResolver.php
+++ b/vendor/symfony/config/Loader/LoaderResolver.php
@@ -27,8 +27,6 @@ class LoaderResolver implements LoaderResolverInterface
     private $loaders = array();
 
     /**
-     * Constructor.
-     *
      * @param LoaderInterface[] $loaders An array of loaders
      */
     public function __construct(array $loaders = array())
@@ -52,11 +50,6 @@ class LoaderResolver implements LoaderResolverInterface
         return false;
     }
 
-    /**
-     * Adds a loader.
-     *
-     * @param LoaderInterface $loader A LoaderInterface instance
-     */
     public function addLoader(LoaderInterface $loader)
     {
         $this->loaders[] = $loader;
diff --git a/vendor/symfony/config/Resource/DirectoryResource.php b/vendor/symfony/config/Resource/DirectoryResource.php
index ebc930c090742ec309c0ee6549e57b77ade76100..b65d40ae4400ed735c11096e4c385569e49c7959 100644
--- a/vendor/symfony/config/Resource/DirectoryResource.php
+++ b/vendor/symfony/config/Resource/DirectoryResource.php
@@ -22,8 +22,6 @@ class DirectoryResource implements SelfCheckingResourceInterface, \Serializable
     private $pattern;
 
     /**
-     * Constructor.
-     *
      * @param string      $resource The file path to the resource
      * @param string|null $pattern  A pattern to restrict monitored files
      */
diff --git a/vendor/symfony/config/Resource/FileExistenceResource.php b/vendor/symfony/config/Resource/FileExistenceResource.php
index ba1584638186b82f593b114a90c8e950b85cfbb1..0e87aabb52a8163373e4af62f84ba87f45663aee 100644
--- a/vendor/symfony/config/Resource/FileExistenceResource.php
+++ b/vendor/symfony/config/Resource/FileExistenceResource.php
@@ -26,8 +26,6 @@ class FileExistenceResource implements SelfCheckingResourceInterface, \Serializa
     private $exists;
 
     /**
-     * Constructor.
-     *
      * @param string $resource The file path to the resource
      */
     public function __construct($resource)
diff --git a/vendor/symfony/config/Resource/FileResource.php b/vendor/symfony/config/Resource/FileResource.php
index 00b2957ca5191ecb635ae47842703620a768048d..11770106e9b23c212a5e1f5df4d8564896455080 100644
--- a/vendor/symfony/config/Resource/FileResource.php
+++ b/vendor/symfony/config/Resource/FileResource.php
@@ -26,8 +26,6 @@ class FileResource implements SelfCheckingResourceInterface, \Serializable
     private $resource;
 
     /**
-     * Constructor.
-     *
      * @param string $resource The file path to the resource
      */
     public function __construct($resource)
diff --git a/vendor/symfony/config/ResourceCheckerConfigCache.php b/vendor/symfony/config/ResourceCheckerConfigCache.php
index 0e3a411b07552e45fe33306abe6e37d504627bc3..52ae833d441821b5117a4d57b04fea8d2be0eb0f 100644
--- a/vendor/symfony/config/ResourceCheckerConfigCache.php
+++ b/vendor/symfony/config/ResourceCheckerConfigCache.php
@@ -150,6 +150,10 @@ class ResourceCheckerConfigCache implements ConfigCacheInterface
                 // discard chmod failure (some filesystem may not support it)
             }
         }
+
+        if (\function_exists('opcache_invalidate') && ini_get('opcache.enable')) {
+            @opcache_invalidate($this->file, true);
+        }
     }
 
     /**
diff --git a/vendor/symfony/config/Util/XmlUtils.php b/vendor/symfony/config/Util/XmlUtils.php
index 25d9b0a0abe5d6ff2906b5f6ac5562433b9964a6..c7c3157180221988a1845c19a22c1a54edc60cfd 100644
--- a/vendor/symfony/config/Util/XmlUtils.php
+++ b/vendor/symfony/config/Util/XmlUtils.php
@@ -37,9 +37,14 @@ class XmlUtils
      * @return \DOMDocument
      *
      * @throws \InvalidArgumentException When loading of XML file returns error
+     * @throws \RuntimeException         When DOM extension is missing
      */
     public static function loadFile($file, $schemaOrCallable = null)
     {
+        if (!extension_loaded('dom')) {
+            throw new \RuntimeException('Extension DOM is required.');
+        }
+
         $content = @file_get_contents($file);
         if ('' === trim($content)) {
             throw new \InvalidArgumentException(sprintf('File %s does not contain valid XML, it is empty.', $file));
@@ -63,7 +68,7 @@ class XmlUtils
         libxml_disable_entity_loader($disableEntities);
 
         foreach ($dom->childNodes as $child) {
-            if ($child->nodeType === XML_DOCUMENT_TYPE_NODE) {
+            if (XML_DOCUMENT_TYPE_NODE === $child->nodeType) {
                 throw new \InvalidArgumentException('Document types are not allowed.');
             }
         }
@@ -104,7 +109,7 @@ class XmlUtils
     }
 
     /**
-     * Converts a \DomElement object to a PHP array.
+     * Converts a \DOMElement object to a PHP array.
      *
      * The following rules applies during the conversion:
      *
@@ -118,7 +123,7 @@ class XmlUtils
      *
      *  * The nested-tags are converted to keys (<foo><foo>bar</foo></foo>)
      *
-     * @param \DomElement $element     A \DomElement instance
+     * @param \DOMElement $element     A \DOMElement instance
      * @param bool        $checkPrefix Check prefix in an element or an attribute name
      *
      * @return array A PHP array
diff --git a/vendor/symfony/console/Application.php b/vendor/symfony/console/Application.php
index f764020c3335f8867d50571f71686952ca3e482c..c942b32c366afc6f80077b2a60f9215f5669a10c 100644
--- a/vendor/symfony/console/Application.php
+++ b/vendor/symfony/console/Application.php
@@ -75,10 +75,9 @@ class Application
     private $dispatcher;
     private $terminalDimensions;
     private $defaultCommand;
+    private $initialized;
 
     /**
-     * Constructor.
-     *
      * @param string $name    The name of the application
      * @param string $version The version of the application
      */
@@ -87,12 +86,6 @@ class Application
         $this->name = $name;
         $this->version = $version;
         $this->defaultCommand = 'list';
-        $this->helperSet = $this->getDefaultHelperSet();
-        $this->definition = $this->getDefaultInputDefinition();
-
-        foreach ($this->getDefaultCommands() as $command) {
-            $this->add($command);
-        }
     }
 
     public function setDispatcher(EventDispatcherInterface $dispatcher)
@@ -103,9 +96,6 @@ class Application
     /**
      * Runs the current application.
      *
-     * @param InputInterface  $input  An Input instance
-     * @param OutputInterface $output An Output instance
-     *
      * @return int 0 if everything went fine, or an error code
      *
      * @throws \Exception When running fails. Bypass this when {@link setCatchExceptions()}.
@@ -125,15 +115,13 @@ class Application
         try {
             $e = null;
             $exitCode = $this->doRun($input, $output);
-        } catch (\Exception $x) {
-            $e = $x;
-        } catch (\Throwable $x) {
-            $e = new FatalThrowableError($x);
+        } catch (\Exception $e) {
+        } catch (\Throwable $e) {
         }
 
         if (null !== $e) {
-            if (!$this->catchExceptions || !$x instanceof \Exception) {
-                throw $x;
+            if (!$this->catchExceptions || !$e instanceof \Exception) {
+                throw $e;
             }
 
             if ($output instanceof ConsoleOutputInterface) {
@@ -167,9 +155,6 @@ class Application
     /**
      * Runs the current application.
      *
-     * @param InputInterface  $input  An Input instance
-     * @param OutputInterface $output An Output instance
-     *
      * @return int 0 if everything went fine, or an error code
      */
     public function doRun(InputInterface $input, OutputInterface $output)
@@ -192,7 +177,13 @@ class Application
 
         if (!$name) {
             $name = $this->defaultCommand;
-            $input = new ArrayInput(array('command' => $this->defaultCommand));
+            $definition = $this->getDefinition();
+            $definition->setArguments(array_merge(
+                $definition->getArguments(),
+                array(
+                    'command' => new InputArgument('command', InputArgument::OPTIONAL, $definition->getArgument('command')->getDescription(), $name),
+                )
+            ));
         }
 
         $this->runningCommand = null;
@@ -206,11 +197,6 @@ class Application
         return $exitCode;
     }
 
-    /**
-     * Set a helper set to be used with the command.
-     *
-     * @param HelperSet $helperSet The helper set
-     */
     public function setHelperSet(HelperSet $helperSet)
     {
         $this->helperSet = $helperSet;
@@ -223,14 +209,13 @@ class Application
      */
     public function getHelperSet()
     {
+        if (!$this->helperSet) {
+            $this->helperSet = $this->getDefaultHelperSet();
+        }
+
         return $this->helperSet;
     }
 
-    /**
-     * Set an input definition to be used with this application.
-     *
-     * @param InputDefinition $definition The input definition
-     */
     public function setDefinition(InputDefinition $definition)
     {
         $this->definition = $definition;
@@ -243,6 +228,10 @@ class Application
      */
     public function getDefinition()
     {
+        if (!$this->definition) {
+            $this->definition = $this->getDefaultInputDefinition();
+        }
+
         return $this->definition;
     }
 
@@ -366,12 +355,12 @@ class Application
      * If a command with the same name already exists, it will be overridden.
      * If the command is not enabled it will not be added.
      *
-     * @param Command $command A Command object
-     *
      * @return Command|null The registered command if enabled or null
      */
     public function add(Command $command)
     {
+        $this->init();
+
         $command->setApplication($this);
 
         if (!$command->isEnabled()) {
@@ -404,6 +393,8 @@ class Application
      */
     public function get($name)
     {
+        $this->init();
+
         if (!isset($this->commands[$name])) {
             throw new CommandNotFoundException(sprintf('The command "%s" does not exist.', $name));
         }
@@ -431,6 +422,8 @@ class Application
      */
     public function has($name)
     {
+        $this->init();
+
         return isset($this->commands[$name]);
     }
 
@@ -508,6 +501,8 @@ class Application
      */
     public function find($name)
     {
+        $this->init();
+
         $allCommands = array_keys($this->commands);
         $expr = preg_replace_callback('{([^:]+|)}', function ($matches) { return preg_quote($matches[1]).'[^:]*'; }, $name);
         $commands = preg_grep('{^'.$expr.'}', $allCommands);
@@ -563,6 +558,8 @@ class Application
      */
     public function all($namespace = null)
     {
+        $this->init();
+
         if (null === $namespace) {
             return $this->commands;
         }
@@ -646,9 +643,6 @@ class Application
 
     /**
      * Renders a caught exception.
-     *
-     * @param \Exception      $e      An exception instance
-     * @param OutputInterface $output An OutputInterface instance
      */
     public function renderException($e, $output)
     {
@@ -665,7 +659,7 @@ class Application
                 $width = 1 << 31;
             }
             $lines = array();
-            foreach (preg_split('/\r?\n/', $e->getMessage()) as $line) {
+            foreach (preg_split('/\r?\n/', trim($e->getMessage())) as $line) {
                 foreach ($this->splitStringByWidth($line, $width - 4) as $line) {
                     // pre-format lines to get the right string length
                     $lineLength = Helper::strlen($line) + 4;
@@ -693,8 +687,8 @@ class Application
                 $trace = $e->getTrace();
                 array_unshift($trace, array(
                     'function' => '',
-                    'file' => $e->getFile() !== null ? $e->getFile() : 'n/a',
-                    'line' => $e->getLine() !== null ? $e->getLine() : 'n/a',
+                    'file' => null !== $e->getFile() ? $e->getFile() : 'n/a',
+                    'line' => null !== $e->getLine() ? $e->getLine() : 'n/a',
                     'args' => array(),
                 ));
 
@@ -797,9 +791,6 @@ class Application
 
     /**
      * Configures the input and output instances based on the user arguments and options.
-     *
-     * @param InputInterface  $input  An InputInterface instance
-     * @param OutputInterface $output An OutputInterface instance
      */
     protected function configureIO(InputInterface $input, OutputInterface $output)
     {
@@ -822,9 +813,9 @@ class Application
             $output->setVerbosity(OutputInterface::VERBOSITY_QUIET);
             $input->setInteractive(false);
         } else {
-            if ($input->hasParameterOption('-vvv') || $input->hasParameterOption('--verbose=3') || $input->getParameterOption('--verbose') === 3) {
+            if ($input->hasParameterOption('-vvv') || $input->hasParameterOption('--verbose=3') || 3 === $input->getParameterOption('--verbose')) {
                 $output->setVerbosity(OutputInterface::VERBOSITY_DEBUG);
-            } elseif ($input->hasParameterOption('-vv') || $input->hasParameterOption('--verbose=2') || $input->getParameterOption('--verbose') === 2) {
+            } elseif ($input->hasParameterOption('-vv') || $input->hasParameterOption('--verbose=2') || 2 === $input->getParameterOption('--verbose')) {
                 $output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE);
             } elseif ($input->hasParameterOption('-v') || $input->hasParameterOption('--verbose=1') || $input->hasParameterOption('--verbose') || $input->getParameterOption('--verbose')) {
                 $output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE);
@@ -838,10 +829,6 @@ class Application
      * If an event dispatcher has been attached to the application,
      * events are also dispatched during the life-cycle of the command.
      *
-     * @param Command         $command A Command instance
-     * @param InputInterface  $input   An Input instance
-     * @param OutputInterface $output  An Output instance
-     *
      * @return int 0 if everything went fine, or an error code
      */
     protected function doRunCommand(Command $command, InputInterface $input, OutputInterface $output)
@@ -902,8 +889,6 @@ class Application
     /**
      * Gets the name of the command based on input.
      *
-     * @param InputInterface $input The input interface
-     *
      * @return string The command name
      */
     protected function getCommandName(InputInterface $input)
@@ -1120,9 +1105,8 @@ class Application
             $lines[] = str_pad($line, $width);
             $line = $char;
         }
-        if ('' !== $line) {
-            $lines[] = count($lines) ? str_pad($line, $width) : $line;
-        }
+
+        $lines[] = count($lines) ? str_pad($line, $width) : $line;
 
         mb_convert_variables($encoding, 'utf8', $lines);
 
@@ -1152,4 +1136,16 @@ class Application
 
         return $namespaces;
     }
+
+    private function init()
+    {
+        if ($this->initialized) {
+            return;
+        }
+        $this->initialized = true;
+
+        foreach ($this->getDefaultCommands() as $command) {
+            $this->add($command);
+        }
+    }
 }
diff --git a/vendor/symfony/console/Command/Command.php b/vendor/symfony/console/Command/Command.php
index 67297fc044a46760b2ccb66fc58c4338cb14762c..13175909577a7fc7a4cab007a20b82e12c078b5c 100644
--- a/vendor/symfony/console/Command/Command.php
+++ b/vendor/symfony/console/Command/Command.php
@@ -48,8 +48,6 @@ class Command
     private $helperSet;
 
     /**
-     * Constructor.
-     *
      * @param string|null $name The name of the command; passing null means it must be set in configure()
      *
      * @throws LogicException When the command name is empty
@@ -79,11 +77,6 @@ class Command
         $this->ignoreValidationErrors = true;
     }
 
-    /**
-     * Sets the application instance for this command.
-     *
-     * @param Application $application An Application instance
-     */
     public function setApplication(Application $application = null)
     {
         $this->application = $application;
@@ -94,11 +87,6 @@ class Command
         }
     }
 
-    /**
-     * Sets the helper set.
-     *
-     * @param HelperSet $helperSet A HelperSet instance
-     */
     public function setHelperSet(HelperSet $helperSet)
     {
         $this->helperSet = $helperSet;
@@ -152,9 +140,6 @@ class Command
      * execute() method, you set the code to execute by passing
      * a Closure to the setCode() method.
      *
-     * @param InputInterface  $input  An InputInterface instance
-     * @param OutputInterface $output An OutputInterface instance
-     *
      * @return null|int null or 0 if everything went fine, or an error code
      *
      * @throws LogicException When this abstract method is not implemented
@@ -172,9 +157,6 @@ class Command
      * This method is executed before the InputDefinition is validated.
      * This means that this is the only place where the command can
      * interactively ask for values of missing required arguments.
-     *
-     * @param InputInterface  $input  An InputInterface instance
-     * @param OutputInterface $output An OutputInterface instance
      */
     protected function interact(InputInterface $input, OutputInterface $output)
     {
@@ -185,9 +167,6 @@ class Command
      *
      * This is mainly useful when a lot of commands extends one main command
      * where some things need to be initialized based on the input arguments and options.
-     *
-     * @param InputInterface  $input  An InputInterface instance
-     * @param OutputInterface $output An OutputInterface instance
      */
     protected function initialize(InputInterface $input, OutputInterface $output)
     {
@@ -200,9 +179,6 @@ class Command
      * setCode() method or by overriding the execute() method
      * in a sub-class.
      *
-     * @param InputInterface  $input  An InputInterface instance
-     * @param OutputInterface $output An OutputInterface instance
-     *
      * @return int The command exit code
      *
      * @throws \Exception When binding input fails. Bypass this by calling {@link ignoreValidationErrors()}.
diff --git a/vendor/symfony/console/Command/HelpCommand.php b/vendor/symfony/console/Command/HelpCommand.php
index c0e7b3884390289035881ca080f5f088b153413e..27e23e1af7f9f752cef2d70b4ec413de732e0c3a 100644
--- a/vendor/symfony/console/Command/HelpCommand.php
+++ b/vendor/symfony/console/Command/HelpCommand.php
@@ -57,11 +57,6 @@ EOF
         ;
     }
 
-    /**
-     * Sets the command.
-     *
-     * @param Command $command The command to set
-     */
     public function setCommand(Command $command)
     {
         $this->command = $command;
diff --git a/vendor/symfony/console/ConsoleEvents.php b/vendor/symfony/console/ConsoleEvents.php
index 1ed41b7daa9c0c9c4be1b8a41cf93ca0ebbc6e52..6dae6ce756f6c4ace8a1a00745bf4bb04754b5c0 100644
--- a/vendor/symfony/console/ConsoleEvents.php
+++ b/vendor/symfony/console/ConsoleEvents.php
@@ -27,8 +27,6 @@ final class ConsoleEvents
      * instance.
      *
      * @Event
-     *
-     * @var string
      */
     const COMMAND = 'console.command';
 
@@ -40,8 +38,6 @@ final class ConsoleEvents
      * instance.
      *
      * @Event
-     *
-     * @var string
      */
     const TERMINATE = 'console.terminate';
 
@@ -54,8 +50,6 @@ final class ConsoleEvents
      * instance.
      *
      * @Event
-     *
-     * @var string
      */
     const EXCEPTION = 'console.exception';
 }
diff --git a/vendor/symfony/console/Descriptor/ApplicationDescription.php b/vendor/symfony/console/Descriptor/ApplicationDescription.php
index 89961b9cae7da57b4e890108d4f9a4e40834f4ad..7d18fe1320ddd8cfdf621c947c33e1ab16a24916 100644
--- a/vendor/symfony/console/Descriptor/ApplicationDescription.php
+++ b/vendor/symfony/console/Descriptor/ApplicationDescription.php
@@ -24,14 +24,7 @@ class ApplicationDescription
 {
     const GLOBAL_NAMESPACE = '_global';
 
-    /**
-     * @var Application
-     */
     private $application;
-
-    /**
-     * @var null|string
-     */
     private $namespace;
 
     /**
@@ -49,12 +42,6 @@ class ApplicationDescription
      */
     private $aliases;
 
-    /**
-     * Constructor.
-     *
-     * @param Application $application
-     * @param string|null $namespace
-     */
     public function __construct(Application $application, $namespace = null)
     {
         $this->application = $application;
@@ -130,8 +117,6 @@ class ApplicationDescription
     }
 
     /**
-     * @param array $commands
-     *
      * @return array
      */
     private function sortCommands(array $commands)
diff --git a/vendor/symfony/console/Descriptor/Descriptor.php b/vendor/symfony/console/Descriptor/Descriptor.php
index 43a7a0a1fec0eb939fd137d5b05991ac7755d2b0..f5bc59e0c94fb754172bc9f296b2b561d8e1f4a8 100644
--- a/vendor/symfony/console/Descriptor/Descriptor.php
+++ b/vendor/symfony/console/Descriptor/Descriptor.php
@@ -73,9 +73,6 @@ abstract class Descriptor implements DescriptorInterface
     /**
      * Describes an InputArgument instance.
      *
-     * @param InputArgument $argument
-     * @param array         $options
-     *
      * @return string|mixed
      */
     abstract protected function describeInputArgument(InputArgument $argument, array $options = array());
@@ -83,9 +80,6 @@ abstract class Descriptor implements DescriptorInterface
     /**
      * Describes an InputOption instance.
      *
-     * @param InputOption $option
-     * @param array       $options
-     *
      * @return string|mixed
      */
     abstract protected function describeInputOption(InputOption $option, array $options = array());
@@ -93,9 +87,6 @@ abstract class Descriptor implements DescriptorInterface
     /**
      * Describes an InputDefinition instance.
      *
-     * @param InputDefinition $definition
-     * @param array           $options
-     *
      * @return string|mixed
      */
     abstract protected function describeInputDefinition(InputDefinition $definition, array $options = array());
@@ -103,9 +94,6 @@ abstract class Descriptor implements DescriptorInterface
     /**
      * Describes a Command instance.
      *
-     * @param Command $command
-     * @param array   $options
-     *
      * @return string|mixed
      */
     abstract protected function describeCommand(Command $command, array $options = array());
@@ -113,9 +101,6 @@ abstract class Descriptor implements DescriptorInterface
     /**
      * Describes an Application instance.
      *
-     * @param Application $application
-     * @param array       $options
-     *
      * @return string|mixed
      */
     abstract protected function describeApplication(Application $application, array $options = array());
diff --git a/vendor/symfony/console/Descriptor/JsonDescriptor.php b/vendor/symfony/console/Descriptor/JsonDescriptor.php
index 942fdc96226ac0fc65adf18819aff06cfe3eccd8..51c4d2ef0e619c14bf2c98a1b21ab1abee91b6aa 100644
--- a/vendor/symfony/console/Descriptor/JsonDescriptor.php
+++ b/vendor/symfony/console/Descriptor/JsonDescriptor.php
@@ -81,9 +81,6 @@ class JsonDescriptor extends Descriptor
     /**
      * Writes data as json.
      *
-     * @param array $data
-     * @param array $options
-     *
      * @return array|string
      */
     private function writeData(array $data, array $options)
@@ -92,8 +89,6 @@ class JsonDescriptor extends Descriptor
     }
 
     /**
-     * @param InputArgument $argument
-     *
      * @return array
      */
     private function getInputArgumentData(InputArgument $argument)
@@ -108,8 +103,6 @@ class JsonDescriptor extends Descriptor
     }
 
     /**
-     * @param InputOption $option
-     *
      * @return array
      */
     private function getInputOptionData(InputOption $option)
@@ -126,8 +119,6 @@ class JsonDescriptor extends Descriptor
     }
 
     /**
-     * @param InputDefinition $definition
-     *
      * @return array
      */
     private function getInputDefinitionData(InputDefinition $definition)
@@ -146,8 +137,6 @@ class JsonDescriptor extends Descriptor
     }
 
     /**
-     * @param Command $command
-     *
      * @return array
      */
     private function getCommandData(Command $command)
diff --git a/vendor/symfony/console/Descriptor/TextDescriptor.php b/vendor/symfony/console/Descriptor/TextDescriptor.php
index 5b82b3deefa8e7a4f964a70a324b36a3ba0476e9..1d6432428c205b5741cc28815f77c39ca4b05393 100644
--- a/vendor/symfony/console/Descriptor/TextDescriptor.php
+++ b/vendor/symfony/console/Descriptor/TextDescriptor.php
@@ -143,7 +143,7 @@ class TextDescriptor extends Descriptor
         $this->writeText('<comment>Usage:</comment>', $options);
         foreach (array_merge(array($command->getSynopsis(true)), $command->getAliases(), $command->getUsages()) as $usage) {
             $this->writeText("\n");
-            $this->writeText('  '.$usage, $options);
+            $this->writeText('  '.OutputFormatter::escape($usage), $options);
         }
         $this->writeText("\n");
 
@@ -282,7 +282,7 @@ class TextDescriptor extends Descriptor
      *
      * @return int
      */
-    private function calculateTotalWidthForOptions($options)
+    private function calculateTotalWidthForOptions(array $options)
     {
         $totalWidth = 0;
         foreach ($options as $option) {
diff --git a/vendor/symfony/console/Descriptor/XmlDescriptor.php b/vendor/symfony/console/Descriptor/XmlDescriptor.php
index b5676beb3766fcff81419c6ef36e9e7d6c99dcfe..177a054cc18d1774e8618beec82a56c105ec0dc0 100644
--- a/vendor/symfony/console/Descriptor/XmlDescriptor.php
+++ b/vendor/symfony/console/Descriptor/XmlDescriptor.php
@@ -27,8 +27,6 @@ use Symfony\Component\Console\Input\InputOption;
 class XmlDescriptor extends Descriptor
 {
     /**
-     * @param InputDefinition $definition
-     *
      * @return \DOMDocument
      */
     public function getInputDefinitionDocument(InputDefinition $definition)
@@ -50,8 +48,6 @@ class XmlDescriptor extends Descriptor
     }
 
     /**
-     * @param Command $command
-     *
      * @return \DOMDocument
      */
     public function getCommandDocument(Command $command)
@@ -94,9 +90,9 @@ class XmlDescriptor extends Descriptor
         $dom = new \DOMDocument('1.0', 'UTF-8');
         $dom->appendChild($rootXml = $dom->createElement('symfony'));
 
-        if ($application->getName() !== 'UNKNOWN') {
+        if ('UNKNOWN' !== $application->getName()) {
             $rootXml->setAttribute('name', $application->getName());
-            if ($application->getVersion() !== 'UNKNOWN') {
+            if ('UNKNOWN' !== $application->getVersion()) {
                 $rootXml->setAttribute('version', $application->getVersion());
             }
         }
@@ -172,9 +168,6 @@ class XmlDescriptor extends Descriptor
 
     /**
      * Appends document children to parent node.
-     *
-     * @param \DOMNode $parentNode
-     * @param \DOMNode $importedParent
      */
     private function appendDocument(\DOMNode $parentNode, \DOMNode $importedParent)
     {
@@ -186,8 +179,6 @@ class XmlDescriptor extends Descriptor
     /**
      * Writes DOM document.
      *
-     * @param \DOMDocument $dom
-     *
      * @return \DOMDocument|string
      */
     private function writeDocument(\DOMDocument $dom)
@@ -197,8 +188,6 @@ class XmlDescriptor extends Descriptor
     }
 
     /**
-     * @param InputArgument $argument
-     *
      * @return \DOMDocument
      */
     private function getInputArgumentDocument(InputArgument $argument)
@@ -223,8 +212,6 @@ class XmlDescriptor extends Descriptor
     }
 
     /**
-     * @param InputOption $option
-     *
      * @return \DOMDocument
      */
     private function getInputOptionDocument(InputOption $option)
diff --git a/vendor/symfony/console/Event/ConsoleCommandEvent.php b/vendor/symfony/console/Event/ConsoleCommandEvent.php
index 92adf1ef96ceb4d1fcd6ae1fdcf6152716b56747..2f517c1db373ff4ee78276b74555f3562cd4b092 100644
--- a/vendor/symfony/console/Event/ConsoleCommandEvent.php
+++ b/vendor/symfony/console/Event/ConsoleCommandEvent.php
@@ -25,8 +25,6 @@ class ConsoleCommandEvent extends ConsoleEvent
 
     /**
      * Indicates if the command should be run or skipped.
-     *
-     * @var bool
      */
     private $commandShouldRun = true;
 
diff --git a/vendor/symfony/console/Formatter/OutputFormatter.php b/vendor/symfony/console/Formatter/OutputFormatter.php
index dd67ed267cb1f48bdfe9e98589c99bfb5bd2f2c9..e6e7d63b52b15fba0313196fa07357aca228b8e5 100644
--- a/vendor/symfony/console/Formatter/OutputFormatter.php
+++ b/vendor/symfony/console/Formatter/OutputFormatter.php
@@ -52,7 +52,8 @@ class OutputFormatter implements OutputFormatterInterface
         if ('\\' === substr($text, -1)) {
             $len = strlen($text);
             $text = rtrim($text, '\\');
-            $text .= str_repeat('<<', $len - strlen($text));
+            $text = str_replace("\0", '', $text);
+            $text .= str_repeat("\0", $len - strlen($text));
         }
 
         return $text;
@@ -167,8 +168,8 @@ class OutputFormatter implements OutputFormatterInterface
 
         $output .= $this->applyCurrentStyle(substr($message, $offset));
 
-        if (false !== strpos($output, '<<')) {
-            return strtr($output, array('\\<' => '<', '<<' => '\\'));
+        if (false !== strpos($output, "\0")) {
+            return strtr($output, array("\0" => '\\', '\\<' => '<'));
         }
 
         return str_replace('\\<', '<', $output);
diff --git a/vendor/symfony/console/Formatter/OutputFormatterStyle.php b/vendor/symfony/console/Formatter/OutputFormatterStyle.php
index c7c6b4a019198acac92193f458d0dd1eb8a9a6e0..7ada54f4c11b93bcd09a4eb2825e370b53a4a8d0 100644
--- a/vendor/symfony/console/Formatter/OutputFormatterStyle.php
+++ b/vendor/symfony/console/Formatter/OutputFormatterStyle.php
@@ -172,9 +172,7 @@ class OutputFormatterStyle implements OutputFormatterStyleInterface
     }
 
     /**
-     * Sets multiple style options at once.
-     *
-     * @param array $options
+     * {@inheritdoc}
      */
     public function setOptions(array $options)
     {
diff --git a/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php b/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php
index c36fda80708d09cb59f72cf5214ad34aa2c912da..4c7dc4134d7237556e68597f25029520c09fceec 100644
--- a/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php
+++ b/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php
@@ -48,8 +48,6 @@ interface OutputFormatterStyleInterface
 
     /**
      * Sets multiple style options at once.
-     *
-     * @param array $options
      */
     public function setOptions(array $options);
 
diff --git a/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php b/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php
index 0a531d297474b8d4eb53636f22bfeb9a0ae4670b..bf0beb709ed1ce772b7d793483887cbb807b6260 100644
--- a/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php
+++ b/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php
@@ -23,16 +23,8 @@ class OutputFormatterStyleStack
      */
     private $styles;
 
-    /**
-     * @var OutputFormatterStyleInterface
-     */
     private $emptyStyle;
 
-    /**
-     * Constructor.
-     *
-     * @param OutputFormatterStyleInterface|null $emptyStyle
-     */
     public function __construct(OutputFormatterStyleInterface $emptyStyle = null)
     {
         $this->emptyStyle = $emptyStyle ?: new OutputFormatterStyle();
@@ -49,8 +41,6 @@ class OutputFormatterStyleStack
 
     /**
      * Pushes a style in the stack.
-     *
-     * @param OutputFormatterStyleInterface $style
      */
     public function push(OutputFormatterStyleInterface $style)
     {
@@ -60,8 +50,6 @@ class OutputFormatterStyleStack
     /**
      * Pops a style from the stack.
      *
-     * @param OutputFormatterStyleInterface|null $style
-     *
      * @return OutputFormatterStyleInterface
      *
      * @throws InvalidArgumentException When style tags incorrectly nested
@@ -102,8 +90,6 @@ class OutputFormatterStyleStack
     }
 
     /**
-     * @param OutputFormatterStyleInterface $emptyStyle
-     *
      * @return $this
      */
     public function setEmptyStyle(OutputFormatterStyleInterface $emptyStyle)
diff --git a/vendor/symfony/console/Helper/DescriptorHelper.php b/vendor/symfony/console/Helper/DescriptorHelper.php
index 300e6455b4300fd418531cf108c6830e48a37030..6f5c81834ccd552b530e34ce3a7b9eae0c0306a7 100644
--- a/vendor/symfony/console/Helper/DescriptorHelper.php
+++ b/vendor/symfony/console/Helper/DescriptorHelper.php
@@ -31,9 +31,6 @@ class DescriptorHelper extends Helper
      */
     private $descriptors = array();
 
-    /**
-     * Constructor.
-     */
     public function __construct()
     {
         $this
diff --git a/vendor/symfony/console/Helper/DialogHelper.php b/vendor/symfony/console/Helper/DialogHelper.php
index 9ce9f6616884e9a88a4ad80cc813d029fdbf2104..f9f8170aa4066fa23ec32a9e10b0743fc5b48245 100644
--- a/vendor/symfony/console/Helper/DialogHelper.php
+++ b/vendor/symfony/console/Helper/DialogHelper.php
@@ -161,7 +161,7 @@ class DialogHelper extends InputAwareHelper
                         $output->write("\033[1D");
                     }
 
-                    if ($i === 0) {
+                    if (0 === $i) {
                         $ofs = -1;
                         $matches = $autocomplete;
                         $numMatches = count($matches);
@@ -326,7 +326,7 @@ class DialogHelper extends InputAwareHelper
 
         if (false !== $shell = $this->getShell()) {
             $output->write($question);
-            $readCmd = $shell === 'csh' ? 'set mypassword = $<' : 'read -r mypassword';
+            $readCmd = 'csh' === $shell ? 'set mypassword = $<' : 'read -r mypassword';
             $command = sprintf("/usr/bin/env %s -c 'stty -echo; %s; stty echo; echo \$mypassword'", $shell, $readCmd);
             $value = rtrim(shell_exec($command));
             $output->writeln('');
@@ -464,7 +464,7 @@ class DialogHelper extends InputAwareHelper
 
         exec('stty 2>&1', $output, $exitcode);
 
-        return self::$stty = $exitcode === 0;
+        return self::$stty = 0 === $exitcode;
     }
 
     /**
diff --git a/vendor/symfony/console/Helper/Helper.php b/vendor/symfony/console/Helper/Helper.php
index 4fb176527a1d23fe02b0a70baa75d9615075d7a7..2d52a0a6139a980bfb5b9aa02b061b93b7361278 100644
--- a/vendor/symfony/console/Helper/Helper.php
+++ b/vendor/symfony/console/Helper/Helper.php
@@ -23,9 +23,7 @@ abstract class Helper implements HelperInterface
     protected $helperSet = null;
 
     /**
-     * Sets the helper set associated with this helper.
-     *
-     * @param HelperSet $helperSet A HelperSet instance
+     * {@inheritdoc}
      */
     public function setHelperSet(HelperSet $helperSet = null)
     {
@@ -33,9 +31,7 @@ abstract class Helper implements HelperInterface
     }
 
     /**
-     * Gets the helper set associated with this helper.
-     *
-     * @return HelperSet|null
+     * {@inheritdoc}
      */
     public function getHelperSet()
     {
diff --git a/vendor/symfony/console/Helper/HelperInterface.php b/vendor/symfony/console/Helper/HelperInterface.php
index 5a923e0a88cb9edce3f7e4d3b9c36c5782a01e89..1ce823587e4a7538e85479b1d3acd164d96e8748 100644
--- a/vendor/symfony/console/Helper/HelperInterface.php
+++ b/vendor/symfony/console/Helper/HelperInterface.php
@@ -20,8 +20,6 @@ interface HelperInterface
 {
     /**
      * Sets the helper set associated with this helper.
-     *
-     * @param HelperSet $helperSet A HelperSet instance
      */
     public function setHelperSet(HelperSet $helperSet = null);
 
diff --git a/vendor/symfony/console/Helper/HelperSet.php b/vendor/symfony/console/Helper/HelperSet.php
index 896326ee3eca28570a5cb0f8d3c636625f895e0c..681d20d796e3faf076635de3eb4ba70095744610 100644
--- a/vendor/symfony/console/Helper/HelperSet.php
+++ b/vendor/symfony/console/Helper/HelperSet.php
@@ -28,8 +28,6 @@ class HelperSet implements \IteratorAggregate
     private $command;
 
     /**
-     * Constructor.
-     *
      * @param Helper[] $helpers An array of helper
      */
     public function __construct(array $helpers = array())
@@ -93,11 +91,6 @@ class HelperSet implements \IteratorAggregate
         return $this->helpers[$name];
     }
 
-    /**
-     * Sets the command associated with this helper set.
-     *
-     * @param Command $command A Command instance
-     */
     public function setCommand(Command $command = null)
     {
         $this->command = $command;
diff --git a/vendor/symfony/console/Helper/ProgressBar.php b/vendor/symfony/console/Helper/ProgressBar.php
index 89ca85d2f1071a4aed61029375bd84bb4d8f3a51..0a9b02185790189b508cba34381ffc42d2895d5d 100644
--- a/vendor/symfony/console/Helper/ProgressBar.php
+++ b/vendor/symfony/console/Helper/ProgressBar.php
@@ -23,7 +23,6 @@ use Symfony\Component\Console\Exception\LogicException;
  */
 class ProgressBar
 {
-    // options
     private $barWidth = 28;
     private $barChar;
     private $emptyBarChar = '-';
@@ -31,10 +30,6 @@ class ProgressBar
     private $format;
     private $internalFormat;
     private $redrawFreq = 1;
-
-    /**
-     * @var OutputInterface
-     */
     private $output;
     private $step = 0;
     private $max;
@@ -50,8 +45,6 @@ class ProgressBar
     private static $formats;
 
     /**
-     * Constructor.
-     *
      * @param OutputInterface $output An OutputInterface instance
      * @param int             $max    Maximum steps (0 if unknown)
      */
diff --git a/vendor/symfony/console/Helper/ProgressHelper.php b/vendor/symfony/console/Helper/ProgressHelper.php
index eaac2df125007a2cdc5b3ca13166a3659550bb42..ce5a040e5dfa4a97b9b2b38d246615912be981a8 100644
--- a/vendor/symfony/console/Helper/ProgressHelper.php
+++ b/vendor/symfony/console/Helper/ProgressHelper.php
@@ -424,7 +424,7 @@ class ProgressHelper extends Helper
         $text = '';
         foreach ($this->timeFormats as $format) {
             if ($secs < $format[0]) {
-                if (count($format) == 2) {
+                if (2 == count($format)) {
                     $text = $format[1];
                     break;
                 } else {
diff --git a/vendor/symfony/console/Helper/QuestionHelper.php b/vendor/symfony/console/Helper/QuestionHelper.php
index a1e770ab2b2a3ad9bfaf09222561ad682c1a409e..757aa8aefbcd16cfc14608e126f3185d3f717bc2 100644
--- a/vendor/symfony/console/Helper/QuestionHelper.php
+++ b/vendor/symfony/console/Helper/QuestionHelper.php
@@ -13,10 +13,11 @@ namespace Symfony\Component\Console\Helper;
 
 use Symfony\Component\Console\Exception\InvalidArgumentException;
 use Symfony\Component\Console\Exception\RuntimeException;
+use Symfony\Component\Console\Formatter\OutputFormatter;
+use Symfony\Component\Console\Formatter\OutputFormatterStyle;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Output\ConsoleOutputInterface;
 use Symfony\Component\Console\Output\OutputInterface;
-use Symfony\Component\Console\Formatter\OutputFormatterStyle;
 use Symfony\Component\Console\Question\Question;
 use Symfony\Component\Console\Question\ChoiceQuestion;
 
@@ -34,10 +35,6 @@ class QuestionHelper extends Helper
     /**
      * Asks a question to the user.
      *
-     * @param InputInterface  $input    An InputInterface instance
-     * @param OutputInterface $output   An OutputInterface instance
-     * @param Question        $question The question to ask
-     *
      * @return mixed The user answer
      *
      * @throws RuntimeException If there is no data to read in the input stream
@@ -106,9 +103,6 @@ class QuestionHelper extends Helper
      *
      * This method is public for PHP 5.3 compatibility, it should be private.
      *
-     * @param OutputInterface $output
-     * @param Question        $question
-     *
      * @return bool|mixed|null|string
      *
      * @throws RuntimeException In case the fallback is deactivated and the response cannot be hidden
@@ -140,7 +134,7 @@ class QuestionHelper extends Helper
                 $ret = trim($ret);
             }
         } else {
-            $ret = trim($this->autocomplete($output, $question, $inputStream));
+            $ret = trim($this->autocomplete($output, $question, $inputStream, is_array($autocomplete) ? $autocomplete : iterator_to_array($autocomplete, false)));
         }
 
         $ret = strlen($ret) > 0 ? $ret : $question->getDefault();
@@ -154,9 +148,6 @@ class QuestionHelper extends Helper
 
     /**
      * Outputs the question prompt.
-     *
-     * @param OutputInterface $output
-     * @param Question        $question
      */
     protected function writePrompt(OutputInterface $output, Question $question)
     {
@@ -181,9 +172,6 @@ class QuestionHelper extends Helper
 
     /**
      * Outputs an error message.
-     *
-     * @param OutputInterface $output
-     * @param \Exception      $error
      */
     protected function writeError(OutputInterface $output, \Exception $error)
     {
@@ -202,12 +190,12 @@ class QuestionHelper extends Helper
      * @param OutputInterface $output
      * @param Question        $question
      * @param resource        $inputStream
+     * @param array           $autocomplete
      *
      * @return string
      */
-    private function autocomplete(OutputInterface $output, Question $question, $inputStream)
+    private function autocomplete(OutputInterface $output, Question $question, $inputStream, array $autocomplete)
     {
-        $autocomplete = $question->getAutocompleterValues();
         $ret = '';
 
         $i = 0;
@@ -235,7 +223,7 @@ class QuestionHelper extends Helper
                     $output->write("\033[1D");
                 }
 
-                if ($i === 0) {
+                if (0 === $i) {
                     $ofs = -1;
                     $matches = $autocomplete;
                     $numMatches = count($matches);
@@ -303,7 +291,7 @@ class QuestionHelper extends Helper
                 // Save cursor position
                 $output->write("\0337");
                 // Write highlighted text
-                $output->write('<hl>'.substr($matches[$ofs], $i).'</hl>');
+                $output->write('<hl>'.OutputFormatter::escapeTrailingBackslash(substr($matches[$ofs], $i)).'</hl>');
                 // Restore cursor position
                 $output->write("\0338");
             }
@@ -365,7 +353,7 @@ class QuestionHelper extends Helper
         }
 
         if (false !== $shell = $this->getShell()) {
-            $readCmd = $shell === 'csh' ? 'set mypassword = $<' : 'read -r mypassword';
+            $readCmd = 'csh' === $shell ? 'set mypassword = $<' : 'read -r mypassword';
             $command = sprintf("/usr/bin/env %s -c 'stty -echo; %s; stty echo; echo \$mypassword'", $shell, $readCmd);
             $value = rtrim(shell_exec($command));
             $output->writeln('');
@@ -447,6 +435,6 @@ class QuestionHelper extends Helper
 
         exec('stty 2>&1', $output, $exitcode);
 
-        return self::$stty = $exitcode === 0;
+        return self::$stty = 0 === $exitcode;
     }
 }
diff --git a/vendor/symfony/console/Helper/Table.php b/vendor/symfony/console/Helper/Table.php
index e5fc36f63dc3a7a42fec5dcb6ff8f9f03dcd9d26..411b56080edbe0dc1ff45334b4c6b0e18232ff57 100644
--- a/vendor/symfony/console/Helper/Table.php
+++ b/vendor/symfony/console/Helper/Table.php
@@ -26,29 +26,23 @@ class Table
 {
     /**
      * Table headers.
-     *
-     * @var array
      */
     private $headers = array();
 
     /**
      * Table rows.
-     *
-     * @var array
      */
     private $rows = array();
 
     /**
      * Column widths cache.
-     *
-     * @var array
      */
     private $columnWidths = array();
 
     /**
      * Number of columns cache.
      *
-     * @var array
+     * @var int
      */
     private $numberOfColumns;
 
@@ -420,7 +414,7 @@ class Table
      *
      * @return array
      */
-    private function fillNextRows($rows, $line)
+    private function fillNextRows(array $rows, $line)
     {
         $unmergedRows = array();
         foreach ($rows[$line] as $column => $cell) {
@@ -471,8 +465,6 @@ class Table
     /**
      * fill cells for a row that contains colspan > 1.
      *
-     * @param array $row
-     *
      * @return array
      */
     private function fillCells($row)
@@ -497,7 +489,7 @@ class Table
      *
      * @return array
      */
-    private function copyRow($rows, $line)
+    private function copyRow(array $rows, $line)
     {
         $row = $rows[$line];
         foreach ($row as $cellKey => $cellValue) {
@@ -513,8 +505,6 @@ class Table
     /**
      * Gets number of columns by row.
      *
-     * @param array $row
-     *
      * @return int
      */
     private function getNumberOfColumns(array $row)
@@ -530,11 +520,9 @@ class Table
     /**
      * Gets list of columns for the given row.
      *
-     * @param array $row
-     *
      * @return array
      */
-    private function getRowColumns($row)
+    private function getRowColumns(array $row)
     {
         $columns = range(0, $this->numberOfColumns - 1);
         foreach ($row as $cellKey => $cell) {
diff --git a/vendor/symfony/console/Helper/TableCell.php b/vendor/symfony/console/Helper/TableCell.php
index a3064fc0981f6277ba792ba3090dfa98a107b56e..6fc7d3b913b6299177a5a53311ba2050200e2f83 100644
--- a/vendor/symfony/console/Helper/TableCell.php
+++ b/vendor/symfony/console/Helper/TableCell.php
@@ -18,14 +18,7 @@ use Symfony\Component\Console\Exception\InvalidArgumentException;
  */
 class TableCell
 {
-    /**
-     * @var string
-     */
     private $value;
-
-    /**
-     * @var array
-     */
     private $options = array(
         'rowspan' => 1,
         'colspan' => 1,
diff --git a/vendor/symfony/console/Helper/TableHelper.php b/vendor/symfony/console/Helper/TableHelper.php
index 1f50d2c19980e1f3a0f35419accf85eb5a10bda3..91afbb133f0dbb47fd60be37951d74d42a27bbc8 100644
--- a/vendor/symfony/console/Helper/TableHelper.php
+++ b/vendor/symfony/console/Helper/TableHelper.php
@@ -30,9 +30,6 @@ class TableHelper extends Helper
     const LAYOUT_BORDERLESS = 1;
     const LAYOUT_COMPACT = 2;
 
-    /**
-     * @var Table
-     */
     private $table;
 
     public function __construct($triggerDeprecationError = true)
@@ -247,8 +244,6 @@ class TableHelper extends Helper
      * | 9971-5-0210-0 | A Tale of Two Cities  | Charles Dickens  |
      * | 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien |
      * +---------------+-----------------------+------------------+
-     *
-     * @param OutputInterface $output
      */
     public function render(OutputInterface $output)
     {
diff --git a/vendor/symfony/console/Helper/TableSeparator.php b/vendor/symfony/console/Helper/TableSeparator.php
index 8cc73e69a25f4e14e3e8bdebab0295301189339f..c7b8dc9c22339bedf839087cab8d6b1a5fd9d1dc 100644
--- a/vendor/symfony/console/Helper/TableSeparator.php
+++ b/vendor/symfony/console/Helper/TableSeparator.php
@@ -18,9 +18,6 @@ namespace Symfony\Component\Console\Helper;
  */
 class TableSeparator extends TableCell
 {
-    /**
-     * @param array $options
-     */
     public function __construct(array $options = array())
     {
         parent::__construct('', $options);
diff --git a/vendor/symfony/console/Input/ArgvInput.php b/vendor/symfony/console/Input/ArgvInput.php
index f6e40cfc68ec099251d32b336e2741f53189905f..ee0bd2c128aa6e50e414a0b5665b404a0389a5dd 100644
--- a/vendor/symfony/console/Input/ArgvInput.php
+++ b/vendor/symfony/console/Input/ArgvInput.php
@@ -44,8 +44,6 @@ class ArgvInput extends Input
     private $parsed;
 
     /**
-     * Constructor.
-     *
      * @param array|null           $argv       An array of parameters from the CLI (in the argv format)
      * @param InputDefinition|null $definition A InputDefinition instance
      */
@@ -330,7 +328,7 @@ class ArgvInput extends Input
                 return $match[1].$self->escapeToken($match[2]);
             }
 
-            if ($token && $token[0] !== '-') {
+            if ($token && '-' !== $token[0]) {
                 return $self->escapeToken($token);
             }
 
diff --git a/vendor/symfony/console/Input/ArrayInput.php b/vendor/symfony/console/Input/ArrayInput.php
index af4c204bba30a163940bfbf46333e3932d614a2b..c4c12c83fbde270a8a19d868ff5cd391a14c3575 100644
--- a/vendor/symfony/console/Input/ArrayInput.php
+++ b/vendor/symfony/console/Input/ArrayInput.php
@@ -27,12 +27,6 @@ class ArrayInput extends Input
 {
     private $parameters;
 
-    /**
-     * Constructor.
-     *
-     * @param array                $parameters An array of parameters
-     * @param InputDefinition|null $definition A InputDefinition instance
-     */
     public function __construct(array $parameters, InputDefinition $definition = null)
     {
         $this->parameters = $parameters;
@@ -104,9 +98,15 @@ class ArrayInput extends Input
         $params = array();
         foreach ($this->parameters as $param => $val) {
             if ($param && '-' === $param[0]) {
-                $params[] = $param.('' != $val ? '='.$this->escapeToken($val) : '');
+                if (is_array($val)) {
+                    foreach ($val as $v) {
+                        $params[] = $param.('' != $v ? '='.$this->escapeToken($v) : '');
+                    }
+                } else {
+                    $params[] = $param.('' != $val ? '='.$this->escapeToken($val) : '');
+                }
             } else {
-                $params[] = $this->escapeToken($val);
+                $params[] = is_array($val) ? array_map(array($this, 'escapeToken'), $val) : $this->escapeToken($val);
             }
         }
 
diff --git a/vendor/symfony/console/Input/Input.php b/vendor/symfony/console/Input/Input.php
index 817292ed73086fe711776a44025ff7308e1fa96c..82aab1fac9925a7d775acf82b7f6b6219583f489 100644
--- a/vendor/symfony/console/Input/Input.php
+++ b/vendor/symfony/console/Input/Input.php
@@ -27,19 +27,11 @@ use Symfony\Component\Console\Exception\RuntimeException;
  */
 abstract class Input implements InputInterface
 {
-    /**
-     * @var InputDefinition
-     */
     protected $definition;
     protected $options = array();
     protected $arguments = array();
     protected $interactive = true;
 
-    /**
-     * Constructor.
-     *
-     * @param InputDefinition|null $definition A InputDefinition instance
-     */
     public function __construct(InputDefinition $definition = null)
     {
         if (null === $definition) {
diff --git a/vendor/symfony/console/Input/InputArgument.php b/vendor/symfony/console/Input/InputArgument.php
index 048ee4ff6b5344ca91d67935190c0d2589a11baf..a969d2c5adc0ad6fd83c823589a863e5ef5103b6 100644
--- a/vendor/symfony/console/Input/InputArgument.php
+++ b/vendor/symfony/console/Input/InputArgument.php
@@ -31,8 +31,6 @@ class InputArgument
     private $description;
 
     /**
-     * Constructor.
-     *
      * @param string $name        The argument name
      * @param int    $mode        The argument mode: self::REQUIRED or self::OPTIONAL
      * @param string $description A description text
diff --git a/vendor/symfony/console/Input/InputDefinition.php b/vendor/symfony/console/Input/InputDefinition.php
index 52f324d7e65571d1a830a5d4b9eec4027f10c653..7dadf2be29bb546c6a56b2c891d9ba134a2ea3b0 100644
--- a/vendor/symfony/console/Input/InputDefinition.php
+++ b/vendor/symfony/console/Input/InputDefinition.php
@@ -39,8 +39,6 @@ class InputDefinition
     private $shortcuts;
 
     /**
-     * Constructor.
-     *
      * @param array $definition An array of InputArgument and InputOption instance
      */
     public function __construct(array $definition = array())
@@ -50,8 +48,6 @@ class InputDefinition
 
     /**
      * Sets the definition of the input.
-     *
-     * @param array $definition The definition array
      */
     public function setDefinition(array $definition)
     {
@@ -98,10 +94,6 @@ class InputDefinition
     }
 
     /**
-     * Adds an InputArgument object.
-     *
-     * @param InputArgument $argument An InputArgument object
-     *
      * @throws LogicException When incorrect argument is given
      */
     public function addArgument(InputArgument $argument)
@@ -235,10 +227,6 @@ class InputDefinition
     }
 
     /**
-     * Adds an InputOption object.
-     *
-     * @param InputOption $option An InputOption object
-     *
      * @throws LogicException When option given already exist
      */
     public function addOption(InputOption $option)
@@ -321,7 +309,7 @@ class InputDefinition
     /**
      * Gets an InputOption by shortcut.
      *
-     * @param string $shortcut the Shortcut name
+     * @param string $shortcut The Shortcut name
      *
      * @return InputOption An InputOption object
      */
diff --git a/vendor/symfony/console/Input/InputInterface.php b/vendor/symfony/console/Input/InputInterface.php
index 4501260970a50c371184ea25c761d169cab812cf..6044e92fee5f7600a8855645b5e5ea7bc10b0c8d 100644
--- a/vendor/symfony/console/Input/InputInterface.php
+++ b/vendor/symfony/console/Input/InputInterface.php
@@ -55,8 +55,6 @@ interface InputInterface
 
     /**
      * Binds the current Input instance with the given arguments and options.
-     *
-     * @param InputDefinition $definition A InputDefinition instance
      */
     public function bind(InputDefinition $definition);
 
diff --git a/vendor/symfony/console/Input/InputOption.php b/vendor/symfony/console/Input/InputOption.php
index f08c5f26c104a493c263a358253ce5b6ef13f602..3af8077c94b81d62fe1a823c2bbc5b17a509e8fc 100644
--- a/vendor/symfony/console/Input/InputOption.php
+++ b/vendor/symfony/console/Input/InputOption.php
@@ -33,8 +33,6 @@ class InputOption
     private $description;
 
     /**
-     * Constructor.
-     *
      * @param string       $name        The option name
      * @param string|array $shortcut    The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts
      * @param int          $mode        The option mode: One of the VALUE_* constants
@@ -195,8 +193,6 @@ class InputOption
     /**
      * Checks whether the given option equals this one.
      *
-     * @param InputOption $option option to compare
-     *
      * @return bool
      */
     public function equals(InputOption $option)
diff --git a/vendor/symfony/console/Input/StringInput.php b/vendor/symfony/console/Input/StringInput.php
index a40ddba31dec8bbe5e2002e4e922b138c32bd754..08608f25e5296230f1a0bae6ea22d6d19f6ec8f4 100644
--- a/vendor/symfony/console/Input/StringInput.php
+++ b/vendor/symfony/console/Input/StringInput.php
@@ -28,8 +28,6 @@ class StringInput extends ArgvInput
     const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\')';
 
     /**
-     * Constructor.
-     *
      * @param string          $input      An array of parameters from the CLI (in the argv format)
      * @param InputDefinition $definition A InputDefinition instance
      *
diff --git a/vendor/symfony/console/Logger/ConsoleLogger.php b/vendor/symfony/console/Logger/ConsoleLogger.php
index 987e96a6587e5aecaa2fcddccd2533fae843b9cd..d1aba10ac0d4629ee0f964b2ca124741def31433 100644
--- a/vendor/symfony/console/Logger/ConsoleLogger.php
+++ b/vendor/symfony/console/Logger/ConsoleLogger.php
@@ -29,13 +29,7 @@ class ConsoleLogger extends AbstractLogger
     const INFO = 'info';
     const ERROR = 'error';
 
-    /**
-     * @var OutputInterface
-     */
     private $output;
-    /**
-     * @var array
-     */
     private $verbosityLevelMap = array(
         LogLevel::EMERGENCY => OutputInterface::VERBOSITY_NORMAL,
         LogLevel::ALERT => OutputInterface::VERBOSITY_NORMAL,
@@ -46,9 +40,6 @@ class ConsoleLogger extends AbstractLogger
         LogLevel::INFO => OutputInterface::VERBOSITY_VERY_VERBOSE,
         LogLevel::DEBUG => OutputInterface::VERBOSITY_DEBUG,
     );
-    /**
-     * @var array
-     */
     private $formatLevelMap = array(
         LogLevel::EMERGENCY => self::ERROR,
         LogLevel::ALERT => self::ERROR,
@@ -60,11 +51,6 @@ class ConsoleLogger extends AbstractLogger
         LogLevel::DEBUG => self::INFO,
     );
 
-    /**
-     * @param OutputInterface $output
-     * @param array           $verbosityLevelMap
-     * @param array           $formatLevelMap
-     */
     public function __construct(OutputInterface $output, array $verbosityLevelMap = array(), array $formatLevelMap = array())
     {
         $this->output = $output;
@@ -82,7 +68,7 @@ class ConsoleLogger extends AbstractLogger
         }
 
         // Write to the error output if necessary and available
-        if ($this->formatLevelMap[$level] === self::ERROR && $this->output instanceof ConsoleOutputInterface) {
+        if (self::ERROR === $this->formatLevelMap[$level] && $this->output instanceof ConsoleOutputInterface) {
             $output = $this->output->getErrorOutput();
         } else {
             $output = $this->output;
diff --git a/vendor/symfony/console/Output/BufferedOutput.php b/vendor/symfony/console/Output/BufferedOutput.php
index 205b02f5fd5d118d509f10c20a3104d57d6786f4..8afc8931ed49cb9096164f4214ce00e74cd28f67 100644
--- a/vendor/symfony/console/Output/BufferedOutput.php
+++ b/vendor/symfony/console/Output/BufferedOutput.php
@@ -16,9 +16,6 @@ namespace Symfony\Component\Console\Output;
  */
 class BufferedOutput extends Output
 {
-    /**
-     * @var string
-     */
     private $buffer = '';
 
     /**
diff --git a/vendor/symfony/console/Output/ConsoleOutput.php b/vendor/symfony/console/Output/ConsoleOutput.php
index f666c793e2265c6a4260480c00d4dcf3f2a032c5..84efb981306f2ae0cdd4976a66fb383d70a2aa34 100644
--- a/vendor/symfony/console/Output/ConsoleOutput.php
+++ b/vendor/symfony/console/Output/ConsoleOutput.php
@@ -28,14 +28,9 @@ use Symfony\Component\Console\Formatter\OutputFormatterInterface;
  */
 class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface
 {
-    /**
-     * @var StreamOutput
-     */
     private $stderr;
 
     /**
-     * Constructor.
-     *
      * @param int                           $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface)
      * @param bool|null                     $decorated Whether to decorate messages (null for auto-guessing)
      * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter)
diff --git a/vendor/symfony/console/Output/ConsoleOutputInterface.php b/vendor/symfony/console/Output/ConsoleOutputInterface.php
index 5eb4fc7acde2bc1b57be73227b4ccde707a36ab5..b44ea7e058de64bd082f7ad163f625db95ee2526 100644
--- a/vendor/symfony/console/Output/ConsoleOutputInterface.php
+++ b/vendor/symfony/console/Output/ConsoleOutputInterface.php
@@ -26,10 +26,5 @@ interface ConsoleOutputInterface extends OutputInterface
      */
     public function getErrorOutput();
 
-    /**
-     * Sets the OutputInterface used for errors.
-     *
-     * @param OutputInterface $error
-     */
     public function setErrorOutput(OutputInterface $error);
 }
diff --git a/vendor/symfony/console/Output/Output.php b/vendor/symfony/console/Output/Output.php
index c12015cc8fee097022ffe2f273f8a1a50fd1685c..371735e142c802bdd4d119cfbd7333bf306322da 100644
--- a/vendor/symfony/console/Output/Output.php
+++ b/vendor/symfony/console/Output/Output.php
@@ -33,8 +33,6 @@ abstract class Output implements OutputInterface
     private $formatter;
 
     /**
-     * Constructor.
-     *
      * @param int                           $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface)
      * @param bool                          $decorated Whether to decorate messages
      * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter)
diff --git a/vendor/symfony/console/Output/OutputInterface.php b/vendor/symfony/console/Output/OutputInterface.php
index 9a8290bddd4d612fc57b4d60471e6dbc10ff3fb2..dc6d08ad36a9c14958310392a51d52f0d1195463 100644
--- a/vendor/symfony/console/Output/OutputInterface.php
+++ b/vendor/symfony/console/Output/OutputInterface.php
@@ -75,11 +75,6 @@ interface OutputInterface
      */
     public function isDecorated();
 
-    /**
-     * Sets output formatter.
-     *
-     * @param OutputFormatterInterface $formatter
-     */
     public function setFormatter(OutputFormatterInterface $formatter);
 
     /**
diff --git a/vendor/symfony/console/Output/StreamOutput.php b/vendor/symfony/console/Output/StreamOutput.php
index 22b29aa1731837f923e66cb72f64f0d946624408..51cad9b176a08d25e14380e91e1e69b608a238ec 100644
--- a/vendor/symfony/console/Output/StreamOutput.php
+++ b/vendor/symfony/console/Output/StreamOutput.php
@@ -33,8 +33,6 @@ class StreamOutput extends Output
     private $stream;
 
     /**
-     * Constructor.
-     *
      * @param resource                      $stream    A stream resource
      * @param int                           $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface)
      * @param bool|null                     $decorated Whether to decorate messages (null for auto-guessing)
diff --git a/vendor/symfony/console/Question/ChoiceQuestion.php b/vendor/symfony/console/Question/ChoiceQuestion.php
index 5815e2b04cb49457f34110c1cc422c5f72a2744c..46cc72a368ee7df89437ff75c2121a3fab30b960 100644
--- a/vendor/symfony/console/Question/ChoiceQuestion.php
+++ b/vendor/symfony/console/Question/ChoiceQuestion.php
@@ -26,8 +26,6 @@ class ChoiceQuestion extends Question
     private $errorMessage = 'Value "%s" is invalid';
 
     /**
-     * Constructor.
-     *
      * @param string $question The question to ask to the user
      * @param array  $choices  The list of available choices
      * @param mixed  $default  The default answer to return
diff --git a/vendor/symfony/console/Question/ConfirmationQuestion.php b/vendor/symfony/console/Question/ConfirmationQuestion.php
index 29d98879f0c560ee98e7d20ef86af644cb55be61..40f54b4e9b8d89d4ff59d05f3e7c01ab4fe6c41b 100644
--- a/vendor/symfony/console/Question/ConfirmationQuestion.php
+++ b/vendor/symfony/console/Question/ConfirmationQuestion.php
@@ -21,8 +21,6 @@ class ConfirmationQuestion extends Question
     private $trueAnswerRegex;
 
     /**
-     * Constructor.
-     *
      * @param string $question        The question to ask to the user
      * @param bool   $default         The default answer to return, true or false
      * @param string $trueAnswerRegex A regex to match the "yes" answer
diff --git a/vendor/symfony/console/Question/Question.php b/vendor/symfony/console/Question/Question.php
index a618e7aa3ee53227217b2630a982d0fc0313785b..b0f1e50939beba31b8031f134a48dfab2991c615 100644
--- a/vendor/symfony/console/Question/Question.php
+++ b/vendor/symfony/console/Question/Question.php
@@ -31,8 +31,6 @@ class Question
     private $normalizer;
 
     /**
-     * Constructor.
-     *
      * @param string $question The question to ask to the user
      * @param mixed  $default  The default answer to return if the user enters nothing
      */
@@ -142,10 +140,8 @@ class Question
             $values = $this->isAssoc($values) ? array_merge(array_keys($values), array_values($values)) : array_values($values);
         }
 
-        if (null !== $values && !is_array($values)) {
-            if (!$values instanceof \Traversable || !$values instanceof \Countable) {
-                throw new InvalidArgumentException('Autocompleter values can be either an array, `null` or an object implementing both `Countable` and `Traversable` interfaces.');
-            }
+        if (null !== $values && !is_array($values) && !$values instanceof \Traversable) {
+            throw new InvalidArgumentException('Autocompleter values can be either an array, `null` or a `Traversable` object.');
         }
 
         if ($this->hidden) {
@@ -190,7 +186,7 @@ class Question
      *
      * @return $this
      *
-     * @throws InvalidArgumentException In case the number of attempts is invalid.
+     * @throws InvalidArgumentException in case the number of attempts is invalid
      */
     public function setMaxAttempts($attempts)
     {
diff --git a/vendor/symfony/console/Shell.php b/vendor/symfony/console/Shell.php
index dacdf223a1809e53b76d18cbece1f622e5ac872d..72df22f2742ee9144587ae67a5cd829717bd6b64 100644
--- a/vendor/symfony/console/Shell.php
+++ b/vendor/symfony/console/Shell.php
@@ -37,12 +37,8 @@ class Shell
     private $processIsolation = false;
 
     /**
-     * Constructor.
-     *
      * If there is no readline support for the current PHP executable
      * a \RuntimeException exception is thrown.
-     *
-     * @param Application $application An application instance
      */
     public function __construct(Application $application)
     {
diff --git a/vendor/symfony/console/Style/OutputStyle.php b/vendor/symfony/console/Style/OutputStyle.php
index 8371bb533551e20407ee17876b37a13e7c4a92c0..f3bf2912c9563760321415037b68ffc0d89bb02a 100644
--- a/vendor/symfony/console/Style/OutputStyle.php
+++ b/vendor/symfony/console/Style/OutputStyle.php
@@ -24,9 +24,6 @@ abstract class OutputStyle implements OutputInterface, StyleInterface
 {
     private $output;
 
-    /**
-     * @param OutputInterface $output
-     */
     public function __construct(OutputInterface $output)
     {
         $this->output = $output;
diff --git a/vendor/symfony/console/Style/StyleInterface.php b/vendor/symfony/console/Style/StyleInterface.php
index 2448547f855aacfc26e2c5fd78468d91346640a2..a9205e5a706239936d933fe26342381515d92670 100644
--- a/vendor/symfony/console/Style/StyleInterface.php
+++ b/vendor/symfony/console/Style/StyleInterface.php
@@ -34,8 +34,6 @@ interface StyleInterface
 
     /**
      * Formats a list.
-     *
-     * @param array $elements
      */
     public function listing(array $elements);
 
@@ -83,9 +81,6 @@ interface StyleInterface
 
     /**
      * Formats a table.
-     *
-     * @param array $headers
-     * @param array $rows
      */
     public function table(array $headers, array $rows);
 
diff --git a/vendor/symfony/console/Style/SymfonyStyle.php b/vendor/symfony/console/Style/SymfonyStyle.php
index 9ae6513ceb031270da14dea782785a08477194b6..d2d09067501a982457ff84c8365fd5b30494beb3 100644
--- a/vendor/symfony/console/Style/SymfonyStyle.php
+++ b/vendor/symfony/console/Style/SymfonyStyle.php
@@ -40,10 +40,6 @@ class SymfonyStyle extends OutputStyle
     private $lineLength;
     private $bufferedOutput;
 
-    /**
-     * @param InputInterface  $input
-     * @param OutputInterface $output
-     */
     public function __construct(InputInterface $input, OutputInterface $output)
     {
         $this->input = $input;
@@ -285,8 +281,6 @@ class SymfonyStyle extends OutputStyle
     }
 
     /**
-     * @param Question $question
-     *
      * @return string
      */
     public function askQuestion(Question $question)
diff --git a/vendor/symfony/console/Tester/ApplicationTester.php b/vendor/symfony/console/Tester/ApplicationTester.php
index 90efbab2182a89a8868a0dce0405c73f3a21510c..dc121645e23ed0653c3929ca3a3285774773a344 100644
--- a/vendor/symfony/console/Tester/ApplicationTester.php
+++ b/vendor/symfony/console/Tester/ApplicationTester.php
@@ -34,11 +34,6 @@ class ApplicationTester
     private $output;
     private $statusCode;
 
-    /**
-     * Constructor.
-     *
-     * @param Application $application An Application instance to test
-     */
     public function __construct(Application $application)
     {
         $this->application = $application;
diff --git a/vendor/symfony/console/Tester/CommandTester.php b/vendor/symfony/console/Tester/CommandTester.php
index 609f46a654da9b48680ad2f1008b2fb53ade3067..a194949041939a9e66cbba1b69aa50f006cfa831 100644
--- a/vendor/symfony/console/Tester/CommandTester.php
+++ b/vendor/symfony/console/Tester/CommandTester.php
@@ -29,11 +29,6 @@ class CommandTester
     private $output;
     private $statusCode;
 
-    /**
-     * Constructor.
-     *
-     * @param Command $command A Command instance to test
-     */
     public function __construct(Command $command)
     {
         $this->command = $command;
diff --git a/vendor/symfony/console/Tests/ApplicationTest.php b/vendor/symfony/console/Tests/ApplicationTest.php
index d8e1e7137c7ac05ad9a892b5b7c3f153a8beb39c..d4dcc2dc20acc19a3c081e2aa79f6c9e60a2934d 100644
--- a/vendor/symfony/console/Tests/ApplicationTest.php
+++ b/vendor/symfony/console/Tests/ApplicationTest.php
@@ -39,6 +39,7 @@ class ApplicationTest extends TestCase
     {
         self::$fixturesPath = realpath(__DIR__.'/Fixtures/');
         require_once self::$fixturesPath.'/FooCommand.php';
+        require_once self::$fixturesPath.'/FooOptCommand.php';
         require_once self::$fixturesPath.'/Foo1Command.php';
         require_once self::$fixturesPath.'/Foo2Command.php';
         require_once self::$fixturesPath.'/Foo3Command.php';
@@ -611,6 +612,22 @@ class ApplicationTest extends TestCase
         $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception_escapeslines.txt', $tester->getDisplay(true), '->renderException() escapes lines containing formatting');
     }
 
+    public function testRenderExceptionLineBreaks()
+    {
+        $application = $this->getMockBuilder('Symfony\Component\Console\Application')->setMethods(array('getTerminalWidth'))->getMock();
+        $application->setAutoExit(false);
+        $application->expects($this->any())
+            ->method('getTerminalWidth')
+            ->will($this->returnValue(120));
+        $application->register('foo')->setCode(function () {
+            throw new \InvalidArgumentException("\n\nline 1 with extra spaces        \nline 2\n\nline 4\n");
+        });
+        $tester = new ApplicationTester($application);
+
+        $tester->run(array('command' => 'foo'), array('decorated' => false));
+        $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception_linebreaks.txt', $tester->getDisplay(true), '->renderException() keep multiple line breaks');
+    }
+
     public function testRun()
     {
         $application = new Application();
@@ -1177,16 +1194,31 @@ class ApplicationTest extends TestCase
         $application->setDefaultCommand($command->getName());
 
         $tester = new ApplicationTester($application);
-        $tester->run(array());
-        $this->assertEquals('interact called'.PHP_EOL.'called'.PHP_EOL, $tester->getDisplay(), 'Application runs the default set command if different from \'list\' command');
+        $tester->run(array(), array('interactive' => false));
+        $this->assertEquals('called'.PHP_EOL, $tester->getDisplay(), 'Application runs the default set command if different from \'list\' command');
 
         $application = new CustomDefaultCommandApplication();
         $application->setAutoExit(false);
 
         $tester = new ApplicationTester($application);
-        $tester->run(array());
+        $tester->run(array(), array('interactive' => false));
+
+        $this->assertEquals('called'.PHP_EOL, $tester->getDisplay(), 'Application runs the default set command if different from \'list\' command');
+    }
+
+    public function testSetRunCustomDefaultCommandWithOption()
+    {
+        $command = new \FooOptCommand();
+
+        $application = new Application();
+        $application->setAutoExit(false);
+        $application->add($command);
+        $application->setDefaultCommand($command->getName());
+
+        $tester = new ApplicationTester($application);
+        $tester->run(array('--fooopt' => 'opt'), array('interactive' => false));
 
-        $this->assertEquals('interact called'.PHP_EOL.'called'.PHP_EOL, $tester->getDisplay(), 'Application runs the default set command if different from \'list\' command');
+        $this->assertEquals('called'.PHP_EOL.'opt'.PHP_EOL, $tester->getDisplay(), 'Application runs the default set command if different from \'list\' command');
     }
 
     /**
diff --git a/vendor/symfony/console/Tests/Fixtures/FooOptCommand.php b/vendor/symfony/console/Tests/Fixtures/FooOptCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..9043aa483c20ff8b3bde3c6e0b74ac78111b6d7f
--- /dev/null
+++ b/vendor/symfony/console/Tests/Fixtures/FooOptCommand.php
@@ -0,0 +1,36 @@
+<?php
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class FooOptCommand extends Command
+{
+    public $input;
+    public $output;
+
+    protected function configure()
+    {
+        $this
+            ->setName('foo:bar')
+            ->setDescription('The foo:bar command')
+            ->setAliases(array('afoobar'))
+            ->addOption('fooopt', 'fo', InputOption::VALUE_OPTIONAL, 'fooopt description')
+        ;
+    }
+
+    protected function interact(InputInterface $input, OutputInterface $output)
+    {
+        $output->writeln('interact called');
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $this->input = $input;
+        $this->output = $output;
+
+        $output->writeln('called');
+        $output->writeln($this->input->getOption('fooopt'));
+    }
+}
diff --git a/vendor/symfony/console/Tests/Fixtures/application_renderexception_linebreaks.txt b/vendor/symfony/console/Tests/Fixtures/application_renderexception_linebreaks.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e9a9518b4aeadab4455189b56fa7c236032c5699
--- /dev/null
+++ b/vendor/symfony/console/Tests/Fixtures/application_renderexception_linebreaks.txt
@@ -0,0 +1,11 @@
+
+                                    
+  [InvalidArgumentException]        
+  line 1 with extra spaces          
+  line 2                            
+                                    
+  line 4                            
+                                    
+
+foo
+
diff --git a/vendor/symfony/console/Tests/Fixtures/application_run2.txt b/vendor/symfony/console/Tests/Fixtures/application_run2.txt
index 9a42503c6b05e4f75dd1214b1192c4e0d1d54ed7..06ad09ad1e8d1fba7f99daaa0919981fffedea44 100644
--- a/vendor/symfony/console/Tests/Fixtures/application_run2.txt
+++ b/vendor/symfony/console/Tests/Fixtures/application_run2.txt
@@ -2,7 +2,7 @@ Usage:
   help [options] [--] [<command_name>]
 
 Arguments:
-  command               The command to execute
+  command               The command to execute [default: "list"]
   command_name          The command name [default: "help"]
 
 Options:
diff --git a/vendor/symfony/console/Tests/Fixtures/command_2.txt b/vendor/symfony/console/Tests/Fixtures/command_2.txt
index cad9cb45f2c8b0671cd16e3bb1bc47b26c68befc..2864c7bdc33ec0233d0faccca011c478c6061743 100644
--- a/vendor/symfony/console/Tests/Fixtures/command_2.txt
+++ b/vendor/symfony/console/Tests/Fixtures/command_2.txt
@@ -1,7 +1,7 @@
 <comment>Usage:</comment>
-  descriptor:command2 [options] [--] <argument_name>
-  descriptor:command2 -o|--option_name <argument_name>
-  descriptor:command2 <argument_name>
+  descriptor:command2 [options] [--] \<argument_name>
+  descriptor:command2 -o|--option_name \<argument_name>
+  descriptor:command2 \<argument_name>
 
 <comment>Arguments:</comment>
   <info>argument_name</info>      
diff --git a/vendor/symfony/console/Tests/Fixtures/command_mbstring.txt b/vendor/symfony/console/Tests/Fixtures/command_mbstring.txt
index 969a0652420b2b5471e58762d8b3787cab441c7f..cde457dcab86368def143ae39ecd3402fcabcdfe 100644
--- a/vendor/symfony/console/Tests/Fixtures/command_mbstring.txt
+++ b/vendor/symfony/console/Tests/Fixtures/command_mbstring.txt
@@ -1,7 +1,7 @@
 <comment>Usage:</comment>
-  descriptor:åèä [options] [--] <argument_åèä>
-  descriptor:åèä -o|--option_name <argument_name>
-  descriptor:åèä <argument_name>
+  descriptor:åèä [options] [--] \<argument_åèä>
+  descriptor:åèä -o|--option_name \<argument_name>
+  descriptor:åèä \<argument_name>
 
 <comment>Arguments:</comment>
   <info>argument_åèä</info>   
diff --git a/vendor/symfony/console/Tests/Formatter/OutputFormatterTest.php b/vendor/symfony/console/Tests/Formatter/OutputFormatterTest.php
index 866c31a4437545632e6a05fe2adf1b23079fc40e..00e5231d80498e398737d88529fa95e9b96c4b6e 100644
--- a/vendor/symfony/console/Tests/Formatter/OutputFormatterTest.php
+++ b/vendor/symfony/console/Tests/Formatter/OutputFormatterTest.php
@@ -28,6 +28,9 @@ class OutputFormatterTest extends TestCase
         $formatter = new OutputFormatter(true);
 
         $this->assertEquals('foo<bar', $formatter->format('foo\\<bar'));
+        $this->assertEquals('foo << bar', $formatter->format('foo << bar'));
+        $this->assertEquals('foo << bar \\', $formatter->format('foo << bar \\'));
+        $this->assertEquals("foo << \033[32mbar \\ baz\033[39m \\", $formatter->format('foo << <info>bar \\ baz</info> \\'));
         $this->assertEquals('<info>some info</info>', $formatter->format('\\<info>some info\\</info>'));
         $this->assertEquals('\\<info>some info\\</info>', OutputFormatter::escape('<info>some info</info>'));
 
diff --git a/vendor/symfony/console/Tests/Helper/LegacyDialogHelperTest.php b/vendor/symfony/console/Tests/Helper/LegacyDialogHelperTest.php
index 95da978e8fdf2337e188eb1d3759d878bad3a49e..d5b203a87d001cd7e0410326c8d5910022eaa9b2 100644
--- a/vendor/symfony/console/Tests/Helper/LegacyDialogHelperTest.php
+++ b/vendor/symfony/console/Tests/Helper/LegacyDialogHelperTest.php
@@ -254,6 +254,6 @@ class LegacyDialogHelperTest extends TestCase
     {
         exec('stty 2>&1', $output, $exitcode);
 
-        return $exitcode === 0;
+        return 0 === $exitcode;
     }
 }
diff --git a/vendor/symfony/console/Tests/Helper/LegacyProgressHelperTest.php b/vendor/symfony/console/Tests/Helper/LegacyProgressHelperTest.php
index b0bc83cfdb218f6e0d5f55b5602ee45c6a330543..561380879af16b4dfe3a8ec3d66927eb6efd5300 100644
--- a/vendor/symfony/console/Tests/Helper/LegacyProgressHelperTest.php
+++ b/vendor/symfony/console/Tests/Helper/LegacyProgressHelperTest.php
@@ -214,7 +214,7 @@ class LegacyProgressHelperTest extends TestCase
     {
         $expectedout = $expected;
 
-        if ($this->lastMessagesLength !== null) {
+        if (null !== $this->lastMessagesLength) {
             $expectedout = str_pad($expected, $this->lastMessagesLength, "\x20", STR_PAD_RIGHT);
         }
 
diff --git a/vendor/symfony/console/Tests/Helper/QuestionHelperTest.php b/vendor/symfony/console/Tests/Helper/QuestionHelperTest.php
index 7d450252301be48bc78beff0384e347da257df54..3538cbc0b7ac198e8abd3f0de138d5a793e7a180 100644
--- a/vendor/symfony/console/Tests/Helper/QuestionHelperTest.php
+++ b/vendor/symfony/console/Tests/Helper/QuestionHelperTest.php
@@ -156,6 +156,46 @@ class QuestionHelperTest extends TestCase
         $this->assertEquals('AsseticBundle', $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
     }
 
+    public function testAutocompleteWithTrailingBackslash()
+    {
+        if (!$this->hasSttyAvailable()) {
+            $this->markTestSkipped('`stty` is required to test autocomplete functionality');
+        }
+
+        $inputStream = $this->getInputStream('E');
+
+        $dialog = new QuestionHelper();
+        $dialog->setInputStream($inputStream);
+        $helperSet = new HelperSet(array(new FormatterHelper()));
+        $dialog->setHelperSet($helperSet);
+
+        $question = new Question('');
+        $expectedCompletion = 'ExampleNamespace\\';
+        $question->setAutocompleterValues(array($expectedCompletion));
+
+        $output = $this->createOutputInterface();
+        $dialog->ask($this->createInputInterfaceMock(), $output, $question);
+
+        $outputStream = $output->getStream();
+        rewind($outputStream);
+        $actualOutput = stream_get_contents($outputStream);
+
+        // Shell control (esc) sequences are not so important: we only care that
+        // <hl> tag is interpreted correctly and replaced
+        $irrelevantEscSequences = array(
+            "\0337" => '', // Save cursor position
+            "\0338" => '', // Restore cursor position
+            "\033[K" => '', // Clear line from cursor till the end
+        );
+
+        $importantActualOutput = strtr($actualOutput, $irrelevantEscSequences);
+
+        // Remove colors (e.g. "\033[30m", "\033[31;41m")
+        $importantActualOutput = preg_replace('/\033\[\d+(;\d+)?m/', '', $importantActualOutput);
+
+        $this->assertEquals($expectedCompletion, $importantActualOutput);
+    }
+
     public function testAskHiddenResponse()
     {
         if ('\\' === DIRECTORY_SEPARATOR) {
@@ -474,6 +514,40 @@ class QuestionHelperTest extends TestCase
         new ChoiceQuestion('Question', array(), 'irrelevant');
     }
 
+    public function testTraversableAutocomplete()
+    {
+        if (!$this->hasSttyAvailable()) {
+            $this->markTestSkipped('`stty` is required to test autocomplete functionality');
+        }
+
+        // Acm<NEWLINE>
+        // Ac<BACKSPACE><BACKSPACE>s<TAB>Test<NEWLINE>
+        // <NEWLINE>
+        // <UP ARROW><UP ARROW><NEWLINE>
+        // <UP ARROW><UP ARROW><UP ARROW><UP ARROW><UP ARROW><TAB>Test<NEWLINE>
+        // <DOWN ARROW><NEWLINE>
+        // S<BACKSPACE><BACKSPACE><DOWN ARROW><DOWN ARROW><NEWLINE>
+        // F00<BACKSPACE><BACKSPACE>oo<TAB><NEWLINE>
+        $inputStream = $this->getInputStream("Acm\nAc\177\177s\tTest\n\n\033[A\033[A\n\033[A\033[A\033[A\033[A\033[A\tTest\n\033[B\nS\177\177\033[B\033[B\nF00\177\177oo\t\n");
+
+        $dialog = new QuestionHelper();
+        $dialog->setInputStream($inputStream);
+        $helperSet = new HelperSet(array(new FormatterHelper()));
+        $dialog->setHelperSet($helperSet);
+
+        $question = new Question('Please select a bundle', 'FrameworkBundle');
+        $question->setAutocompleterValues(new AutocompleteValues(array('irrelevant' => 'AcmeDemoBundle', 'AsseticBundle', 'SecurityBundle', 'FooBundle')));
+
+        $this->assertEquals('AcmeDemoBundle', $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
+        $this->assertEquals('AsseticBundleTest', $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
+        $this->assertEquals('FrameworkBundle', $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
+        $this->assertEquals('SecurityBundle', $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
+        $this->assertEquals('FooBundleTest', $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
+        $this->assertEquals('AcmeDemoBundle', $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
+        $this->assertEquals('AsseticBundle', $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
+        $this->assertEquals('FooBundle', $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
+    }
+
     protected function getInputStream($input)
     {
         $stream = fopen('php://memory', 'r+', false);
@@ -502,6 +576,21 @@ class QuestionHelperTest extends TestCase
     {
         exec('stty 2>&1', $output, $exitcode);
 
-        return $exitcode === 0;
+        return 0 === $exitcode;
+    }
+}
+
+class AutocompleteValues implements \IteratorAggregate
+{
+    private $values;
+
+    public function __construct(array $values)
+    {
+        $this->values = $values;
+    }
+
+    public function getIterator()
+    {
+        return new \ArrayIterator($this->values);
     }
 }
diff --git a/vendor/symfony/console/Tests/Input/ArrayInputTest.php b/vendor/symfony/console/Tests/Input/ArrayInputTest.php
index 06e65f7398bdcbfc686c88779bd4546681624609..608020a5caa55de1fc18fbc8146d520370ee1dde 100644
--- a/vendor/symfony/console/Tests/Input/ArrayInputTest.php
+++ b/vendor/symfony/console/Tests/Input/ArrayInputTest.php
@@ -140,5 +140,8 @@ class ArrayInputTest extends TestCase
     {
         $input = new ArrayInput(array('-f' => null, '-b' => 'bar', '--foo' => 'b a z', '--lala' => null, 'test' => 'Foo', 'test2' => "A\nB'C"));
         $this->assertEquals('-f -b=bar --foo='.escapeshellarg('b a z').' --lala Foo '.escapeshellarg("A\nB'C"), (string) $input);
+
+        $input = new ArrayInput(array('-b' => array('bval_1', 'bval_2'), '--f' => array('fval_1', 'fval_2')));
+        $this->assertSame('-b=bval_1 -b=bval_2 --f=fval_1 --f=fval_2', (string) $input);
     }
 }
diff --git a/vendor/symfony/css-selector/Node/AttributeNode.php b/vendor/symfony/css-selector/Node/AttributeNode.php
index af872b79e9f2d25286a40a4f84ccab16d3c245d8..1caccb6bfeefb62ad7fc11f86dae845e89e36aa2 100644
--- a/vendor/symfony/css-selector/Node/AttributeNode.php
+++ b/vendor/symfony/css-selector/Node/AttributeNode.php
@@ -23,29 +23,10 @@ namespace Symfony\Component\CssSelector\Node;
  */
 class AttributeNode extends AbstractNode
 {
-    /**
-     * @var NodeInterface
-     */
     private $selector;
-
-    /**
-     * @var string
-     */
     private $namespace;
-
-    /**
-     * @var string
-     */
     private $attribute;
-
-    /**
-     * @var string
-     */
     private $operator;
-
-    /**
-     * @var string
-     */
     private $value;
 
     /**
diff --git a/vendor/symfony/css-selector/Node/ClassNode.php b/vendor/symfony/css-selector/Node/ClassNode.php
index f965e7773e89a534037407088d865984c7bc2cab..69462e8e7109112d70d706bcc384bd4a5a54a7c6 100644
--- a/vendor/symfony/css-selector/Node/ClassNode.php
+++ b/vendor/symfony/css-selector/Node/ClassNode.php
@@ -23,14 +23,7 @@ namespace Symfony\Component\CssSelector\Node;
  */
 class ClassNode extends AbstractNode
 {
-    /**
-     * @var NodeInterface
-     */
     private $selector;
-
-    /**
-     * @var string
-     */
     private $name;
 
     /**
diff --git a/vendor/symfony/css-selector/Node/CombinedSelectorNode.php b/vendor/symfony/css-selector/Node/CombinedSelectorNode.php
index 39f659977779c5ac817d9d6442fbfadb13c3b3e3..2aa583aaf69283e7384992e6c205140ba8b991f9 100644
--- a/vendor/symfony/css-selector/Node/CombinedSelectorNode.php
+++ b/vendor/symfony/css-selector/Node/CombinedSelectorNode.php
@@ -23,19 +23,8 @@ namespace Symfony\Component\CssSelector\Node;
  */
 class CombinedSelectorNode extends AbstractNode
 {
-    /**
-     * @var NodeInterface
-     */
     private $selector;
-
-    /**
-     * @var string
-     */
     private $combinator;
-
-    /**
-     * @var NodeInterface
-     */
     private $subSelector;
 
     /**
diff --git a/vendor/symfony/css-selector/Node/ElementNode.php b/vendor/symfony/css-selector/Node/ElementNode.php
index 06e343e969c117b2360c0b46936967d7287d5531..bcdce7a7a5207a1f52ddafadb2762e3f5eff4c86 100644
--- a/vendor/symfony/css-selector/Node/ElementNode.php
+++ b/vendor/symfony/css-selector/Node/ElementNode.php
@@ -23,14 +23,7 @@ namespace Symfony\Component\CssSelector\Node;
  */
 class ElementNode extends AbstractNode
 {
-    /**
-     * @var string|null
-     */
     private $namespace;
-
-    /**
-     * @var string|null
-     */
     private $element;
 
     /**
diff --git a/vendor/symfony/css-selector/Node/FunctionNode.php b/vendor/symfony/css-selector/Node/FunctionNode.php
index 612f348c5e419ceb1ff024e012f830c40310fa0a..50268255ce525cd72584f399cd4c489d685ed6d7 100644
--- a/vendor/symfony/css-selector/Node/FunctionNode.php
+++ b/vendor/symfony/css-selector/Node/FunctionNode.php
@@ -25,19 +25,8 @@ use Symfony\Component\CssSelector\Parser\Token;
  */
 class FunctionNode extends AbstractNode
 {
-    /**
-     * @var NodeInterface
-     */
     private $selector;
-
-    /**
-     * @var string
-     */
     private $name;
-
-    /**
-     * @var Token[]
-     */
     private $arguments;
 
     /**
diff --git a/vendor/symfony/css-selector/Node/HashNode.php b/vendor/symfony/css-selector/Node/HashNode.php
index 20db46516280610384a6091e3f73caa1429eb58b..ebf9a9872a7d1b92b0c1325689821790860b5ca6 100644
--- a/vendor/symfony/css-selector/Node/HashNode.php
+++ b/vendor/symfony/css-selector/Node/HashNode.php
@@ -23,14 +23,7 @@ namespace Symfony\Component\CssSelector\Node;
  */
 class HashNode extends AbstractNode
 {
-    /**
-     * @var NodeInterface
-     */
     private $selector;
-
-    /**
-     * @var string
-     */
     private $id;
 
     /**
diff --git a/vendor/symfony/css-selector/Node/NegationNode.php b/vendor/symfony/css-selector/Node/NegationNode.php
index 4b5aa2260d005d6249b9b3ee598172510a336bd8..bf97caeb58683d87c949f050c05331d6396d15d6 100644
--- a/vendor/symfony/css-selector/Node/NegationNode.php
+++ b/vendor/symfony/css-selector/Node/NegationNode.php
@@ -23,20 +23,9 @@ namespace Symfony\Component\CssSelector\Node;
  */
 class NegationNode extends AbstractNode
 {
-    /**
-     * @var NodeInterface
-     */
     private $selector;
-
-    /**
-     * @var NodeInterface
-     */
     private $subSelector;
 
-    /**
-     * @param NodeInterface $selector
-     * @param NodeInterface $subSelector
-     */
     public function __construct(NodeInterface $selector, NodeInterface $subSelector)
     {
         $this->selector = $selector;
diff --git a/vendor/symfony/css-selector/Node/PseudoNode.php b/vendor/symfony/css-selector/Node/PseudoNode.php
index c23ddd5912a6685cbf0b12d96d9ee0a9382709b7..3842c695e852bb81f48b5e628fe6a4a2721aad2c 100644
--- a/vendor/symfony/css-selector/Node/PseudoNode.php
+++ b/vendor/symfony/css-selector/Node/PseudoNode.php
@@ -23,14 +23,7 @@ namespace Symfony\Component\CssSelector\Node;
  */
 class PseudoNode extends AbstractNode
 {
-    /**
-     * @var NodeInterface
-     */
     private $selector;
-
-    /**
-     * @var string
-     */
     private $identifier;
 
     /**
diff --git a/vendor/symfony/css-selector/Node/SelectorNode.php b/vendor/symfony/css-selector/Node/SelectorNode.php
index 729e0911b3c76d6e331af21272ec240b5f8d3917..5ef2be62a41b4f37f7316f015b41bd64d6ebe3b6 100644
--- a/vendor/symfony/css-selector/Node/SelectorNode.php
+++ b/vendor/symfony/css-selector/Node/SelectorNode.php
@@ -23,14 +23,7 @@ namespace Symfony\Component\CssSelector\Node;
  */
 class SelectorNode extends AbstractNode
 {
-    /**
-     * @var NodeInterface
-     */
     private $tree;
-
-    /**
-     * @var null|string
-     */
     private $pseudoElement;
 
     /**
diff --git a/vendor/symfony/css-selector/Node/Specificity.php b/vendor/symfony/css-selector/Node/Specificity.php
index d09eaca77ef456a2f96139980bae59233b9199d9..6aa70d781cae2582cdb1f6a93eae030a44780371 100644
--- a/vendor/symfony/css-selector/Node/Specificity.php
+++ b/vendor/symfony/css-selector/Node/Specificity.php
@@ -29,24 +29,11 @@ class Specificity
     const B_FACTOR = 10;
     const C_FACTOR = 1;
 
-    /**
-     * @var int
-     */
     private $a;
-
-    /**
-     * @var int
-     */
     private $b;
-
-    /**
-     * @var int
-     */
     private $c;
 
     /**
-     * Constructor.
-     *
      * @param int $a
      * @param int $b
      * @param int $c
@@ -59,8 +46,6 @@ class Specificity
     }
 
     /**
-     * @param Specificity $specificity
-     *
      * @return self
      */
     public function plus(Specificity $specificity)
@@ -82,8 +67,6 @@ class Specificity
      * Returns -1 if the object specificity is lower than the argument,
      * 0 if they are equal, and 1 if the argument is lower.
      *
-     * @param Specificity $specificity
-     *
      * @return int
      */
     public function compareTo(Specificity $specificity)
diff --git a/vendor/symfony/css-selector/Parser/Handler/HandlerInterface.php b/vendor/symfony/css-selector/Parser/Handler/HandlerInterface.php
index a1297c80c089b8572346b3259b64b980b45d3944..de931f6797080f7470b877d3edb525e090ba6ecf 100644
--- a/vendor/symfony/css-selector/Parser/Handler/HandlerInterface.php
+++ b/vendor/symfony/css-selector/Parser/Handler/HandlerInterface.php
@@ -27,9 +27,6 @@ use Symfony\Component\CssSelector\Parser\TokenStream;
 interface HandlerInterface
 {
     /**
-     * @param Reader      $reader
-     * @param TokenStream $stream
-     *
      * @return bool
      */
     public function handle(Reader $reader, TokenStream $stream);
diff --git a/vendor/symfony/css-selector/Parser/Handler/HashHandler.php b/vendor/symfony/css-selector/Parser/Handler/HashHandler.php
index f74bda51262ac8e78f1b3ad673c2b438e10ff00d..5f7f4d23be70efbf31b04101261a20234896baec 100644
--- a/vendor/symfony/css-selector/Parser/Handler/HashHandler.php
+++ b/vendor/symfony/css-selector/Parser/Handler/HashHandler.php
@@ -29,20 +29,9 @@ use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerPatterns;
  */
 class HashHandler implements HandlerInterface
 {
-    /**
-     * @var TokenizerPatterns
-     */
     private $patterns;
-
-    /**
-     * @var TokenizerEscaping
-     */
     private $escaping;
 
-    /**
-     * @param TokenizerPatterns $patterns
-     * @param TokenizerEscaping $escaping
-     */
     public function __construct(TokenizerPatterns $patterns, TokenizerEscaping $escaping)
     {
         $this->patterns = $patterns;
diff --git a/vendor/symfony/css-selector/Parser/Handler/IdentifierHandler.php b/vendor/symfony/css-selector/Parser/Handler/IdentifierHandler.php
index 358c7c14ad28adedb7dddde1476e8a396885b6f1..aa6804ed477d622d023b6441a2f86dfe96fa4428 100644
--- a/vendor/symfony/css-selector/Parser/Handler/IdentifierHandler.php
+++ b/vendor/symfony/css-selector/Parser/Handler/IdentifierHandler.php
@@ -29,20 +29,9 @@ use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerPatterns;
  */
 class IdentifierHandler implements HandlerInterface
 {
-    /**
-     * @var TokenizerPatterns
-     */
     private $patterns;
-
-    /**
-     * @var TokenizerEscaping
-     */
     private $escaping;
 
-    /**
-     * @param TokenizerPatterns $patterns
-     * @param TokenizerEscaping $escaping
-     */
     public function __construct(TokenizerPatterns $patterns, TokenizerEscaping $escaping)
     {
         $this->patterns = $patterns;
diff --git a/vendor/symfony/css-selector/Parser/Handler/NumberHandler.php b/vendor/symfony/css-selector/Parser/Handler/NumberHandler.php
index 4ea5c484b26fb5cbd3202579282d998fe246df7a..7e561d1dc302d7058cd18a150af77d2cef991892 100644
--- a/vendor/symfony/css-selector/Parser/Handler/NumberHandler.php
+++ b/vendor/symfony/css-selector/Parser/Handler/NumberHandler.php
@@ -28,14 +28,8 @@ use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerPatterns;
  */
 class NumberHandler implements HandlerInterface
 {
-    /**
-     * @var TokenizerPatterns
-     */
     private $patterns;
 
-    /**
-     * @param TokenizerPatterns $patterns
-     */
     public function __construct(TokenizerPatterns $patterns)
     {
         $this->patterns = $patterns;
diff --git a/vendor/symfony/css-selector/Parser/Handler/StringHandler.php b/vendor/symfony/css-selector/Parser/Handler/StringHandler.php
index 420529601609d0d1da608175f31bb25242472d03..f842e1ce20eafbf202d8bf0419664835c45f3253 100644
--- a/vendor/symfony/css-selector/Parser/Handler/StringHandler.php
+++ b/vendor/symfony/css-selector/Parser/Handler/StringHandler.php
@@ -31,20 +31,9 @@ use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerPatterns;
  */
 class StringHandler implements HandlerInterface
 {
-    /**
-     * @var TokenizerPatterns
-     */
     private $patterns;
-
-    /**
-     * @var TokenizerEscaping
-     */
     private $escaping;
 
-    /**
-     * @param TokenizerPatterns $patterns
-     * @param TokenizerEscaping $escaping
-     */
     public function __construct(TokenizerPatterns $patterns, TokenizerEscaping $escaping)
     {
         $this->patterns = $patterns;
diff --git a/vendor/symfony/css-selector/Parser/Parser.php b/vendor/symfony/css-selector/Parser/Parser.php
index 3c5b2dd264b5060b544f0772e9d84af81a765fd1..195e107159d9836b9c60237f5fd59cdedb079f73 100644
--- a/vendor/symfony/css-selector/Parser/Parser.php
+++ b/vendor/symfony/css-selector/Parser/Parser.php
@@ -27,16 +27,8 @@ use Symfony\Component\CssSelector\Parser\Tokenizer\Tokenizer;
  */
 class Parser implements ParserInterface
 {
-    /**
-     * @var Tokenizer
-     */
     private $tokenizer;
 
-    /**
-     * Constructor.
-     *
-     * @param null|Tokenizer $tokenizer
-     */
     public function __construct(Tokenizer $tokenizer = null)
     {
         $this->tokenizer = $tokenizer ?: new Tokenizer();
@@ -105,8 +97,6 @@ class Parser implements ParserInterface
     /**
      * Parses selector nodes.
      *
-     * @param TokenStream $stream
-     *
      * @return array
      */
     private function parseSelectorList(TokenStream $stream)
@@ -131,8 +121,6 @@ class Parser implements ParserInterface
     /**
      * Parses next selector or combined node.
      *
-     * @param TokenStream $stream
-     *
      * @return Node\SelectorNode
      *
      * @throws SyntaxErrorException
@@ -294,8 +282,6 @@ class Parser implements ParserInterface
     /**
      * Parses next element node.
      *
-     * @param TokenStream $stream
-     *
      * @return Node\ElementNode
      */
     private function parseElementNode(TokenStream $stream)
@@ -327,9 +313,6 @@ class Parser implements ParserInterface
     /**
      * Parses next attribute node.
      *
-     * @param Node\NodeInterface $selector
-     * @param TokenStream        $stream
-     *
      * @return Node\AttributeNode
      *
      * @throws SyntaxErrorException
diff --git a/vendor/symfony/css-selector/Parser/Reader.php b/vendor/symfony/css-selector/Parser/Reader.php
index 546730b8f5c67f5400dff80b3c86ef8050a60e6e..5a1be30cd957abd4f6b676bc2e971d157d342b2b 100644
--- a/vendor/symfony/css-selector/Parser/Reader.php
+++ b/vendor/symfony/css-selector/Parser/Reader.php
@@ -23,19 +23,8 @@ namespace Symfony\Component\CssSelector\Parser;
  */
 class Reader
 {
-    /**
-     * @var string
-     */
     private $source;
-
-    /**
-     * @var int
-     */
     private $length;
-
-    /**
-     * @var int
-     */
     private $position = 0;
 
     /**
diff --git a/vendor/symfony/css-selector/Parser/Shortcut/EmptyStringParser.php b/vendor/symfony/css-selector/Parser/Shortcut/EmptyStringParser.php
index 016cf0a848207d107c5fee3082fa8991eb8b19b5..16d374af30ccc8b5c2d8396239eb8a6cea068602 100644
--- a/vendor/symfony/css-selector/Parser/Shortcut/EmptyStringParser.php
+++ b/vendor/symfony/css-selector/Parser/Shortcut/EmptyStringParser.php
@@ -37,7 +37,7 @@ class EmptyStringParser implements ParserInterface
     public function parse($source)
     {
         // Matches an empty string
-        if ($source == '') {
+        if ('' == $source) {
             return array(new SelectorNode(new ElementNode(null, '*')));
         }
 
diff --git a/vendor/symfony/css-selector/Parser/Token.php b/vendor/symfony/css-selector/Parser/Token.php
index 68fac59b03a32bb4f70b0ce17515fdaaa42f3418..9baaa6dd8d1658e7470d709bd9487d476c7b828b 100644
--- a/vendor/symfony/css-selector/Parser/Token.php
+++ b/vendor/symfony/css-selector/Parser/Token.php
@@ -31,19 +31,8 @@ class Token
     const TYPE_NUMBER = 'number';
     const TYPE_STRING = 'string';
 
-    /**
-     * @var int
-     */
     private $type;
-
-    /**
-     * @var string
-     */
     private $value;
-
-    /**
-     * @var int
-     */
     private $position;
 
     /**
@@ -91,8 +80,6 @@ class Token
     }
 
     /**
-     * @param array $values
-     *
      * @return bool
      */
     public function isDelimiter(array $values = array())
diff --git a/vendor/symfony/css-selector/Parser/TokenStream.php b/vendor/symfony/css-selector/Parser/TokenStream.php
index aeba0f86c06eee31f26ce7f088256dc0623a5c78..7ebc0cf1942504cacee0aee96615fca5f2337c55 100644
--- a/vendor/symfony/css-selector/Parser/TokenStream.php
+++ b/vendor/symfony/css-selector/Parser/TokenStream.php
@@ -59,8 +59,6 @@ class TokenStream
     /**
      * Pushes a token.
      *
-     * @param Token $token
-     *
      * @return $this
      */
     public function push(Token $token)
diff --git a/vendor/symfony/css-selector/Parser/Tokenizer/Tokenizer.php b/vendor/symfony/css-selector/Parser/Tokenizer/Tokenizer.php
index aa9fc5077341a329fd54b33742343e8c5a41fa6d..e32b4d20ce9f880d7b348b09406d221df51aece5 100644
--- a/vendor/symfony/css-selector/Parser/Tokenizer/Tokenizer.php
+++ b/vendor/symfony/css-selector/Parser/Tokenizer/Tokenizer.php
@@ -33,9 +33,6 @@ class Tokenizer
      */
     private $handlers;
 
-    /**
-     * Constructor.
-     */
     public function __construct()
     {
         $patterns = new TokenizerPatterns();
@@ -54,8 +51,6 @@ class Tokenizer
     /**
      * Tokenize selector source code.
      *
-     * @param Reader $reader
-     *
      * @return TokenStream
      */
     public function tokenize(Reader $reader)
diff --git a/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerEscaping.php b/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerEscaping.php
index af4c31e5b09b82261d8a07d592c19822c75583f5..c6f289aa11439355c66ba431a4f0265330c2810c 100644
--- a/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerEscaping.php
+++ b/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerEscaping.php
@@ -23,14 +23,8 @@ namespace Symfony\Component\CssSelector\Parser\Tokenizer;
  */
 class TokenizerEscaping
 {
-    /**
-     * @var TokenizerPatterns
-     */
     private $patterns;
 
-    /**
-     * @param TokenizerPatterns $patterns
-     */
     public function __construct(TokenizerPatterns $patterns)
     {
         $this->patterns = $patterns;
diff --git a/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerPatterns.php b/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerPatterns.php
index 5b071cd090f84ffba64e24b3729eec6416e560b4..30584ca92ee855d8c98ade0cfb8cedc40ec0eed9 100644
--- a/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerPatterns.php
+++ b/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerPatterns.php
@@ -23,69 +23,19 @@ namespace Symfony\Component\CssSelector\Parser\Tokenizer;
  */
 class TokenizerPatterns
 {
-    /**
-     * @var string
-     */
     private $unicodeEscapePattern;
-
-    /**
-     * @var string
-     */
     private $simpleEscapePattern;
-
-    /**
-     * @var string
-     */
     private $newLineEscapePattern;
-
-    /**
-     * @var string
-     */
     private $escapePattern;
-
-    /**
-     * @var string
-     */
     private $stringEscapePattern;
-
-    /**
-     * @var string
-     */
     private $nonAsciiPattern;
-
-    /**
-     * @var string
-     */
     private $nmCharPattern;
-
-    /**
-     * @var string
-     */
     private $nmStartPattern;
-
-    /**
-     * @var string
-     */
     private $identifierPattern;
-
-    /**
-     * @var string
-     */
     private $hashPattern;
-
-    /**
-     * @var string
-     */
     private $numberPattern;
-
-    /**
-     * @var string
-     */
     private $quotedStringPattern;
 
-    /**
-     * Constructor.
-     */
     public function __construct()
     {
         $this->unicodeEscapePattern = '\\\\([0-9a-f]{1,6})(?:\r\n|[ \n\r\t\f])?';
diff --git a/vendor/symfony/css-selector/XPath/Extension/CombinationExtension.php b/vendor/symfony/css-selector/XPath/Extension/CombinationExtension.php
index 0d2d658b65c64fbeaac55bbd28f7f57273df7826..0c9cc0320c3c2dcfc4a7e4090bc637380a732531 100644
--- a/vendor/symfony/css-selector/XPath/Extension/CombinationExtension.php
+++ b/vendor/symfony/css-selector/XPath/Extension/CombinationExtension.php
@@ -39,9 +39,6 @@ class CombinationExtension extends AbstractExtension
     }
 
     /**
-     * @param XPathExpr $xpath
-     * @param XPathExpr $combinedXpath
-     *
      * @return XPathExpr
      */
     public function translateDescendant(XPathExpr $xpath, XPathExpr $combinedXpath)
@@ -50,9 +47,6 @@ class CombinationExtension extends AbstractExtension
     }
 
     /**
-     * @param XPathExpr $xpath
-     * @param XPathExpr $combinedXpath
-     *
      * @return XPathExpr
      */
     public function translateChild(XPathExpr $xpath, XPathExpr $combinedXpath)
@@ -61,9 +55,6 @@ class CombinationExtension extends AbstractExtension
     }
 
     /**
-     * @param XPathExpr $xpath
-     * @param XPathExpr $combinedXpath
-     *
      * @return XPathExpr
      */
     public function translateDirectAdjacent(XPathExpr $xpath, XPathExpr $combinedXpath)
@@ -75,9 +66,6 @@ class CombinationExtension extends AbstractExtension
     }
 
     /**
-     * @param XPathExpr $xpath
-     * @param XPathExpr $combinedXpath
-     *
      * @return XPathExpr
      */
     public function translateIndirectAdjacent(XPathExpr $xpath, XPathExpr $combinedXpath)
diff --git a/vendor/symfony/css-selector/XPath/Extension/FunctionExtension.php b/vendor/symfony/css-selector/XPath/Extension/FunctionExtension.php
index ea05523055f65b7e32bb2cbbe6131fc912558b1d..c2606b5ad4308b6c1f1e3f4b371bc3323afd54c4 100644
--- a/vendor/symfony/css-selector/XPath/Extension/FunctionExtension.php
+++ b/vendor/symfony/css-selector/XPath/Extension/FunctionExtension.php
@@ -111,9 +111,6 @@ class FunctionExtension extends AbstractExtension
     }
 
     /**
-     * @param XPathExpr    $xpath
-     * @param FunctionNode $function
-     *
      * @return XPathExpr
      */
     public function translateNthLastChild(XPathExpr $xpath, FunctionNode $function)
@@ -122,9 +119,6 @@ class FunctionExtension extends AbstractExtension
     }
 
     /**
-     * @param XPathExpr    $xpath
-     * @param FunctionNode $function
-     *
      * @return XPathExpr
      */
     public function translateNthOfType(XPathExpr $xpath, FunctionNode $function)
@@ -133,9 +127,6 @@ class FunctionExtension extends AbstractExtension
     }
 
     /**
-     * @param XPathExpr    $xpath
-     * @param FunctionNode $function
-     *
      * @return XPathExpr
      *
      * @throws ExpressionErrorException
@@ -150,9 +141,6 @@ class FunctionExtension extends AbstractExtension
     }
 
     /**
-     * @param XPathExpr    $xpath
-     * @param FunctionNode $function
-     *
      * @return XPathExpr
      *
      * @throws ExpressionErrorException
@@ -176,9 +164,6 @@ class FunctionExtension extends AbstractExtension
     }
 
     /**
-     * @param XPathExpr    $xpath
-     * @param FunctionNode $function
-     *
      * @return XPathExpr
      *
      * @throws ExpressionErrorException
diff --git a/vendor/symfony/css-selector/XPath/Extension/HtmlExtension.php b/vendor/symfony/css-selector/XPath/Extension/HtmlExtension.php
index de6ce41621bd4a23f015d7f8fe9409161eeb0730..625ffa5cad67035e0b6dfad161479c037bb4599c 100644
--- a/vendor/symfony/css-selector/XPath/Extension/HtmlExtension.php
+++ b/vendor/symfony/css-selector/XPath/Extension/HtmlExtension.php
@@ -28,11 +28,6 @@ use Symfony\Component\CssSelector\XPath\XPathExpr;
  */
 class HtmlExtension extends AbstractExtension
 {
-    /**
-     * Constructor.
-     *
-     * @param Translator $translator
-     */
     public function __construct(Translator $translator)
     {
         $translator
@@ -69,8 +64,6 @@ class HtmlExtension extends AbstractExtension
     }
 
     /**
-     * @param XPathExpr $xpath
-     *
      * @return XPathExpr
      */
     public function translateChecked(XPathExpr $xpath)
@@ -83,8 +76,6 @@ class HtmlExtension extends AbstractExtension
     }
 
     /**
-     * @param XPathExpr $xpath
-     *
      * @return XPathExpr
      */
     public function translateLink(XPathExpr $xpath)
@@ -93,8 +84,6 @@ class HtmlExtension extends AbstractExtension
     }
 
     /**
-     * @param XPathExpr $xpath
-     *
      * @return XPathExpr
      */
     public function translateDisabled(XPathExpr $xpath)
@@ -124,8 +113,6 @@ class HtmlExtension extends AbstractExtension
     }
 
     /**
-     * @param XPathExpr $xpath
-     *
      * @return XPathExpr
      */
     public function translateEnabled(XPathExpr $xpath)
@@ -162,9 +149,6 @@ class HtmlExtension extends AbstractExtension
     }
 
     /**
-     * @param XPathExpr    $xpath
-     * @param FunctionNode $function
-     *
      * @return XPathExpr
      *
      * @throws ExpressionErrorException
@@ -191,8 +175,6 @@ class HtmlExtension extends AbstractExtension
     }
 
     /**
-     * @param XPathExpr $xpath
-     *
      * @return XPathExpr
      */
     public function translateSelected(XPathExpr $xpath)
@@ -201,8 +183,6 @@ class HtmlExtension extends AbstractExtension
     }
 
     /**
-     * @param XPathExpr $xpath
-     *
      * @return XPathExpr
      */
     public function translateInvalid(XPathExpr $xpath)
@@ -211,8 +191,6 @@ class HtmlExtension extends AbstractExtension
     }
 
     /**
-     * @param XPathExpr $xpath
-     *
      * @return XPathExpr
      */
     public function translateHover(XPathExpr $xpath)
@@ -221,8 +199,6 @@ class HtmlExtension extends AbstractExtension
     }
 
     /**
-     * @param XPathExpr $xpath
-     *
      * @return XPathExpr
      */
     public function translateVisited(XPathExpr $xpath)
diff --git a/vendor/symfony/css-selector/XPath/Extension/NodeExtension.php b/vendor/symfony/css-selector/XPath/Extension/NodeExtension.php
index b0c78fa8108ef50d71aef4e477264b13698bf79f..715d9611a8267cbb5df811e34da411f0c04392ab 100644
--- a/vendor/symfony/css-selector/XPath/Extension/NodeExtension.php
+++ b/vendor/symfony/css-selector/XPath/Extension/NodeExtension.php
@@ -31,14 +31,9 @@ class NodeExtension extends AbstractExtension
     const ATTRIBUTE_NAME_IN_LOWER_CASE = 2;
     const ATTRIBUTE_VALUE_IN_LOWER_CASE = 4;
 
-    /**
-     * @var int
-     */
     private $flags;
 
     /**
-     * Constructor.
-     *
      * @param int $flags
      */
     public function __construct($flags = 0)
@@ -94,9 +89,6 @@ class NodeExtension extends AbstractExtension
     }
 
     /**
-     * @param Node\SelectorNode $node
-     * @param Translator        $translator
-     *
      * @return XPathExpr
      */
     public function translateSelector(Node\SelectorNode $node, Translator $translator)
@@ -105,9 +97,6 @@ class NodeExtension extends AbstractExtension
     }
 
     /**
-     * @param Node\CombinedSelectorNode $node
-     * @param Translator                $translator
-     *
      * @return XPathExpr
      */
     public function translateCombinedSelector(Node\CombinedSelectorNode $node, Translator $translator)
@@ -116,9 +105,6 @@ class NodeExtension extends AbstractExtension
     }
 
     /**
-     * @param Node\NegationNode $node
-     * @param Translator        $translator
-     *
      * @return XPathExpr
      */
     public function translateNegation(Node\NegationNode $node, Translator $translator)
@@ -135,9 +121,6 @@ class NodeExtension extends AbstractExtension
     }
 
     /**
-     * @param Node\FunctionNode $node
-     * @param Translator        $translator
-     *
      * @return XPathExpr
      */
     public function translateFunction(Node\FunctionNode $node, Translator $translator)
@@ -148,9 +131,6 @@ class NodeExtension extends AbstractExtension
     }
 
     /**
-     * @param Node\PseudoNode $node
-     * @param Translator      $translator
-     *
      * @return XPathExpr
      */
     public function translatePseudo(Node\PseudoNode $node, Translator $translator)
@@ -161,9 +141,6 @@ class NodeExtension extends AbstractExtension
     }
 
     /**
-     * @param Node\AttributeNode $node
-     * @param Translator         $translator
-     *
      * @return XPathExpr
      */
     public function translateAttribute(Node\AttributeNode $node, Translator $translator)
@@ -192,9 +169,6 @@ class NodeExtension extends AbstractExtension
     }
 
     /**
-     * @param Node\ClassNode $node
-     * @param Translator     $translator
-     *
      * @return XPathExpr
      */
     public function translateClass(Node\ClassNode $node, Translator $translator)
@@ -205,9 +179,6 @@ class NodeExtension extends AbstractExtension
     }
 
     /**
-     * @param Node\HashNode $node
-     * @param Translator    $translator
-     *
      * @return XPathExpr
      */
     public function translateHash(Node\HashNode $node, Translator $translator)
@@ -218,8 +189,6 @@ class NodeExtension extends AbstractExtension
     }
 
     /**
-     * @param Node\ElementNode $node
-     *
      * @return XPathExpr
      */
     public function translateElement(Node\ElementNode $node)
diff --git a/vendor/symfony/css-selector/XPath/Extension/PseudoClassExtension.php b/vendor/symfony/css-selector/XPath/Extension/PseudoClassExtension.php
index 1c8b217e39c09857b4ef0590cabf59ed0392cb5d..378dfb7de17736700131d27cc3b88964f6252ffb 100644
--- a/vendor/symfony/css-selector/XPath/Extension/PseudoClassExtension.php
+++ b/vendor/symfony/css-selector/XPath/Extension/PseudoClassExtension.php
@@ -44,8 +44,6 @@ class PseudoClassExtension extends AbstractExtension
     }
 
     /**
-     * @param XPathExpr $xpath
-     *
      * @return XPathExpr
      */
     public function translateRoot(XPathExpr $xpath)
@@ -54,8 +52,6 @@ class PseudoClassExtension extends AbstractExtension
     }
 
     /**
-     * @param XPathExpr $xpath
-     *
      * @return XPathExpr
      */
     public function translateFirstChild(XPathExpr $xpath)
@@ -67,8 +63,6 @@ class PseudoClassExtension extends AbstractExtension
     }
 
     /**
-     * @param XPathExpr $xpath
-     *
      * @return XPathExpr
      */
     public function translateLastChild(XPathExpr $xpath)
@@ -80,8 +74,6 @@ class PseudoClassExtension extends AbstractExtension
     }
 
     /**
-     * @param XPathExpr $xpath
-     *
      * @return XPathExpr
      *
      * @throws ExpressionErrorException
@@ -98,8 +90,6 @@ class PseudoClassExtension extends AbstractExtension
     }
 
     /**
-     * @param XPathExpr $xpath
-     *
      * @return XPathExpr
      *
      * @throws ExpressionErrorException
@@ -116,8 +106,6 @@ class PseudoClassExtension extends AbstractExtension
     }
 
     /**
-     * @param XPathExpr $xpath
-     *
      * @return XPathExpr
      */
     public function translateOnlyChild(XPathExpr $xpath)
@@ -129,8 +117,6 @@ class PseudoClassExtension extends AbstractExtension
     }
 
     /**
-     * @param XPathExpr $xpath
-     *
      * @return XPathExpr
      *
      * @throws ExpressionErrorException
@@ -145,8 +131,6 @@ class PseudoClassExtension extends AbstractExtension
     }
 
     /**
-     * @param XPathExpr $xpath
-     *
      * @return XPathExpr
      */
     public function translateEmpty(XPathExpr $xpath)
diff --git a/vendor/symfony/css-selector/XPath/Translator.php b/vendor/symfony/css-selector/XPath/Translator.php
index 2b01fc8e52526e2733ff3d04999ba87753d95f10..d20ad7dc3401dbc36c8600c3bd12392b4efe48bf 100644
--- a/vendor/symfony/css-selector/XPath/Translator.php
+++ b/vendor/symfony/css-selector/XPath/Translator.php
@@ -30,9 +30,6 @@ use Symfony\Component\CssSelector\Parser\ParserInterface;
  */
 class Translator implements TranslatorInterface
 {
-    /**
-     * @var ParserInterface
-     */
     private $mainParser;
 
     /**
@@ -41,33 +38,14 @@ class Translator implements TranslatorInterface
     private $shortcutParsers = array();
 
     /**
-     * @var Extension\ExtensionInterface
+     * @var Extension\ExtensionInterface[]
      */
     private $extensions = array();
 
-    /**
-     * @var array
-     */
     private $nodeTranslators = array();
-
-    /**
-     * @var array
-     */
     private $combinationTranslators = array();
-
-    /**
-     * @var array
-     */
     private $functionTranslators = array();
-
-    /**
-     * @var array
-     */
     private $pseudoClassTranslators = array();
-
-    /**
-     * @var array
-     */
     private $attributeMatchingTranslators = array();
 
     public function __construct(ParserInterface $parser = null)
@@ -144,8 +122,6 @@ class Translator implements TranslatorInterface
     /**
      * Registers an extension.
      *
-     * @param Extension\ExtensionInterface $extension
-     *
      * @return $this
      */
     public function registerExtension(Extension\ExtensionInterface $extension)
@@ -180,8 +156,6 @@ class Translator implements TranslatorInterface
     /**
      * Registers a shortcut parser.
      *
-     * @param ParserInterface $shortcut
-     *
      * @return $this
      */
     public function registerParserShortcut(ParserInterface $shortcut)
@@ -192,8 +166,6 @@ class Translator implements TranslatorInterface
     }
 
     /**
-     * @param NodeInterface $node
-     *
      * @return XPathExpr
      *
      * @throws ExpressionErrorException
@@ -226,9 +198,6 @@ class Translator implements TranslatorInterface
     }
 
     /**
-     * @param XPathExpr    $xpath
-     * @param FunctionNode $function
-     *
      * @return XPathExpr
      *
      * @throws ExpressionErrorException
diff --git a/vendor/symfony/css-selector/XPath/XPathExpr.php b/vendor/symfony/css-selector/XPath/XPathExpr.php
index 38ca295540071c63989141caf5e9e9a810bcb5b6..fa59bce2e0bb57c18b486e05a753f988590b871b 100644
--- a/vendor/symfony/css-selector/XPath/XPathExpr.php
+++ b/vendor/symfony/css-selector/XPath/XPathExpr.php
@@ -23,19 +23,8 @@ namespace Symfony\Component\CssSelector\XPath;
  */
 class XPathExpr
 {
-    /**
-     * @var string
-     */
     private $path;
-
-    /**
-     * @var string
-     */
     private $element;
-
-    /**
-     * @var string
-     */
     private $condition;
 
     /**
diff --git a/vendor/symfony/css-selector/composer.json b/vendor/symfony/css-selector/composer.json
index e94cfbded0d336e07045255a08a1da231c66c6a3..9661f70ea317d97e7f38dd13f554edbdc25e4bee 100644
--- a/vendor/symfony/css-selector/composer.json
+++ b/vendor/symfony/css-selector/composer.json
@@ -20,7 +20,7 @@
         }
     ],
     "require": {
-        "php": ">=5.5.9"
+        "php": "^5.5.9|>=7.0.8"
     },
     "autoload": {
         "psr-4": { "Symfony\\Component\\CssSelector\\": "" },
diff --git a/vendor/symfony/dependency-injection/Compiler/AnalyzeServiceReferencesPass.php b/vendor/symfony/dependency-injection/Compiler/AnalyzeServiceReferencesPass.php
index 717fc378e498ed16abce7e5f69a2646b2d89824e..68b2a0217263cff3c8675eaa89e71ab1a3fcb26d 100644
--- a/vendor/symfony/dependency-injection/Compiler/AnalyzeServiceReferencesPass.php
+++ b/vendor/symfony/dependency-injection/Compiler/AnalyzeServiceReferencesPass.php
@@ -12,8 +12,10 @@
 namespace Symfony\Component\DependencyInjection\Compiler;
 
 use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\ExpressionLanguage;
 use Symfony\Component\DependencyInjection\Reference;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\ExpressionLanguage\Expression;
 
 /**
  * Run this pass before passes that need to know more about the relation of
@@ -32,6 +34,7 @@ class AnalyzeServiceReferencesPass implements RepeatablePassInterface
     private $currentDefinition;
     private $repeatedPass;
     private $onlyConstructorArguments;
+    private $expressionLanguage;
 
     /**
      * @param bool $onlyConstructorArguments Sets this Service Reference pass to ignore method calls
@@ -97,6 +100,8 @@ class AnalyzeServiceReferencesPass implements RepeatablePassInterface
         foreach ($arguments as $argument) {
             if (is_array($argument)) {
                 $this->processArguments($argument);
+            } elseif ($argument instanceof Expression) {
+                $this->getExpressionLanguage()->compile((string) $argument, array('this' => 'container'));
             } elseif ($argument instanceof Reference) {
                 $this->graph->connect(
                     $this->currentId,
@@ -143,4 +148,27 @@ class AnalyzeServiceReferencesPass implements RepeatablePassInterface
 
         return $id;
     }
+
+    private function getExpressionLanguage()
+    {
+        if (null === $this->expressionLanguage) {
+            $providers = $this->container->getExpressionLanguageProviders();
+            $this->expressionLanguage = new ExpressionLanguage(null, $providers, function ($arg) {
+                if ('""' === substr_replace($arg, '', 1, -1)) {
+                    $id = stripcslashes(substr($arg, 1, -1));
+
+                    $this->graph->connect(
+                        $this->currentId,
+                        $this->currentDefinition,
+                        $this->getDefinitionId($id),
+                        $this->getDefinition($id)
+                    );
+                }
+
+                return sprintf('$this->get(%s)', $arg);
+            });
+        }
+
+        return $this->expressionLanguage;
+    }
 }
diff --git a/vendor/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php b/vendor/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php
index 64c041e93f3a7da0f9472a96954195c4ddf49eba..04e6cc67a55d944a5b18cef94e0a66f523ad144f 100644
--- a/vendor/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php
+++ b/vendor/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php
@@ -26,7 +26,7 @@ trait PriorityTaggedServiceTrait
      *
      * The order of additions must be respected for services having the same priority,
      * and knowing that the \SplPriorityQueue class does not respect the FIFO method,
-     * we should not use this class.
+     * we should not use that class.
      *
      * @see https://bugs.php.net/bug.php?id=53710
      * @see https://bugs.php.net/bug.php?id=60926
diff --git a/vendor/symfony/dependency-injection/Container.php b/vendor/symfony/dependency-injection/Container.php
index 1ed239b93974749f64771134f94f03da4c8c6d6d..6e156919a1b392f16bdd532fe8b424be2f3a19db 100644
--- a/vendor/symfony/dependency-injection/Container.php
+++ b/vendor/symfony/dependency-injection/Container.php
@@ -56,10 +56,14 @@ class Container implements ResettableContainerInterface
 
     protected $services = array();
     protected $methodMap = array();
-    protected $privates = array();
     protected $aliases = array();
     protected $loading = array();
 
+    /**
+     * @internal
+     */
+    protected $privates = array();
+
     private $underscoreMap = array('_' => '', '.' => '_', '\\' => '_');
     private $envCache = array();
 
@@ -249,9 +253,6 @@ class Container implements ResettableContainerInterface
             if (isset($this->privates[$id])) {
                 @trigger_error(sprintf('Requesting the "%s" private service is deprecated since Symfony 3.2 and won\'t be supported anymore in Symfony 4.0.', $id), E_USER_DEPRECATED);
             }
-            if ('service_container' === $id) {
-                return $this;
-            }
             if (isset($this->aliases[$id])) {
                 $id = $this->aliases[$id];
             }
@@ -260,6 +261,9 @@ class Container implements ResettableContainerInterface
             if (isset($this->services[$id])) {
                 return $this->services[$id];
             }
+            if ('service_container' === $id) {
+                return $this;
+            }
 
             if (isset($this->loading[$id])) {
                 throw new ServiceCircularReferenceException($id, array_keys($this->loading));
@@ -322,14 +326,14 @@ class Container implements ResettableContainerInterface
     {
         $id = strtolower($id);
 
-        if ('service_container' === $id) {
-            return false;
-        }
-
         if (isset($this->aliases[$id])) {
             $id = $this->aliases[$id];
         }
 
+        if ('service_container' === $id) {
+            return false;
+        }
+
         return isset($this->services[$id]);
     }
 
diff --git a/vendor/symfony/dependency-injection/Dumper/PhpDumper.php b/vendor/symfony/dependency-injection/Dumper/PhpDumper.php
index 2b7d0b2a6a3fe7076036a957a35e4b32f065d86d..4aee93dec5037677338e35e8d1b6f7c8b78358db 100644
--- a/vendor/symfony/dependency-injection/Dumper/PhpDumper.php
+++ b/vendor/symfony/dependency-injection/Dumper/PhpDumper.php
@@ -267,12 +267,11 @@ class PhpDumper extends Dumper
     /**
      * Generates the require_once statement for service includes.
      *
-     * @param string     $id         The service id
      * @param Definition $definition
      *
      * @return string
      */
-    private function addServiceInclude($id, $definition)
+    private function addServiceInclude($definition)
     {
         $template = "        require_once %s;\n";
         $code = '';
@@ -347,9 +346,9 @@ class PhpDumper extends Dumper
                 $code .= $this->addNewInstance($sDefinition, '$'.$name, ' = ', $id);
 
                 if (!$this->hasReference($id, $sDefinition->getMethodCalls(), true) && !$this->hasReference($id, $sDefinition->getProperties(), true)) {
-                    $code .= $this->addServiceProperties(null, $sDefinition, $name);
-                    $code .= $this->addServiceMethodCalls(null, $sDefinition, $name);
-                    $code .= $this->addServiceConfigurator(null, $sDefinition, $name);
+                    $code .= $this->addServiceProperties($sDefinition, $name);
+                    $code .= $this->addServiceMethodCalls($sDefinition, $name);
+                    $code .= $this->addServiceConfigurator($sDefinition, $name);
                 }
 
                 $code .= "\n";
@@ -447,13 +446,12 @@ class PhpDumper extends Dumper
     /**
      * Adds method calls to a service definition.
      *
-     * @param string     $id
      * @param Definition $definition
      * @param string     $variableName
      *
      * @return string
      */
-    private function addServiceMethodCalls($id, Definition $definition, $variableName = 'instance')
+    private function addServiceMethodCalls(Definition $definition, $variableName = 'instance')
     {
         $calls = '';
         foreach ($definition->getMethodCalls() as $call) {
@@ -468,7 +466,7 @@ class PhpDumper extends Dumper
         return $calls;
     }
 
-    private function addServiceProperties($id, Definition $definition, $variableName = 'instance')
+    private function addServiceProperties(Definition $definition, $variableName = 'instance')
     {
         $code = '';
         foreach ($definition->getProperties() as $name => $value) {
@@ -511,9 +509,9 @@ class PhpDumper extends Dumper
             }
 
             $name = (string) $this->definitionVariables->offsetGet($iDefinition);
-            $code .= $this->addServiceProperties(null, $iDefinition, $name);
-            $code .= $this->addServiceMethodCalls(null, $iDefinition, $name);
-            $code .= $this->addServiceConfigurator(null, $iDefinition, $name);
+            $code .= $this->addServiceProperties($iDefinition, $name);
+            $code .= $this->addServiceMethodCalls($iDefinition, $name);
+            $code .= $this->addServiceConfigurator($iDefinition, $name);
         }
 
         if ('' !== $code) {
@@ -526,13 +524,12 @@ class PhpDumper extends Dumper
     /**
      * Adds configurator definition.
      *
-     * @param string     $id
      * @param Definition $definition
      * @param string     $variableName
      *
      * @return string
      */
-    private function addServiceConfigurator($id, Definition $definition, $variableName = 'instance')
+    private function addServiceConfigurator(Definition $definition, $variableName = 'instance')
     {
         if (!$callable = $definition->getConfigurator()) {
             return '';
@@ -580,7 +577,7 @@ class PhpDumper extends Dumper
             $return[] = '@throws RuntimeException always since this service is expected to be injected dynamically';
         } elseif ($class = $definition->getClass()) {
             $class = $this->container->resolveEnvPlaceholders($class);
-            $return[] = sprintf('@return %s A %s instance', 0 === strpos($class, '%') ? 'object' : '\\'.ltrim($class, '\\'), ltrim($class, '\\'));
+            $return[] = sprintf(0 === strpos($class, '%') ? '@return object A %1$s instance' : '@return \%s', ltrim($class, '\\'));
         } elseif ($definition->getFactory()) {
             $factory = $definition->getFactory();
             if (is_string($factory)) {
@@ -605,40 +602,14 @@ class PhpDumper extends Dumper
         $return = str_replace("\n     * \n", "\n     *\n", implode("\n     * ", $return));
         $return = $this->container->resolveEnvPlaceholders($return);
 
-        $doc = '';
-        if ($definition->isShared()) {
-            $doc .= <<<'EOF'
-
-     *
-     * This service is shared.
-     * This method always returns the same instance of the service.
-EOF;
-        }
-
-        if (!$definition->isPublic()) {
-            $doc .= <<<'EOF'
-
-     *
-     * This service is private.
-     * If you want to be able to request this service from the container directly,
-     * make it public, otherwise you might end up with broken code.
-EOF;
-        }
-
-        if ($definition->isAutowired()) {
-            $doc .= <<<EOF
-
-     *
-     * This service is autowired.
-EOF;
-        }
+        $shared = $definition->isShared() ? ' shared' : '';
+        $public = $definition->isPublic() ? 'public' : 'private';
+        $autowired = $definition->isAutowired() ? ' autowired' : '';
 
         if ($definition->isLazy()) {
             $lazyInitialization = '$lazyLoad = true';
-            $lazyInitializationDoc = "\n     * @param bool    \$lazyLoad whether to try lazy-loading the service with a proxy\n     *";
         } else {
             $lazyInitialization = '';
-            $lazyInitializationDoc = '';
         }
 
         // with proxies, for 5.3.3 compatibility, the getter must be public to be accessible to the initializer
@@ -648,8 +619,8 @@ EOF;
         $code = <<<EOF
 
     /*{$this->docStar}
-     * Gets the '$id' service.$doc
-     *$lazyInitializationDoc
+     * Gets the $public '$id'$shared$autowired service.
+     *
      * $return
      */
     {$visibility} function {$methodName}($lazyInitialization)
@@ -667,14 +638,14 @@ EOF;
             }
 
             $code .=
-                $this->addServiceInclude($id, $definition).
+                $this->addServiceInclude($definition).
                 $this->addServiceLocalTempVariables($id, $definition).
                 $this->addServiceInlinedDefinitions($id, $definition).
                 $this->addServiceInstance($id, $definition).
                 $this->addServiceInlinedDefinitionsSetup($id, $definition).
-                $this->addServiceProperties($id, $definition).
-                $this->addServiceMethodCalls($id, $definition).
-                $this->addServiceConfigurator($id, $definition).
+                $this->addServiceProperties($definition).
+                $this->addServiceMethodCalls($definition).
+                $this->addServiceConfigurator($definition).
                 $this->addServiceReturn($id, $definition)
             ;
         }
@@ -1482,6 +1453,10 @@ EOF;
      */
     private function getServiceCall($id, Reference $reference = null)
     {
+        while ($this->container->hasAlias($id)) {
+            $id = (string) $this->container->getAlias($id);
+        }
+
         if ('service_container' === $id) {
             return '$this';
         }
@@ -1495,10 +1470,6 @@ EOF;
             return sprintf('$this->get(\'%s\', ContainerInterface::NULL_ON_INVALID_REFERENCE)', $id);
         }
 
-        if ($this->container->hasAlias($id)) {
-            $id = (string) $this->container->getAlias($id);
-        }
-
         return sprintf('$this->get(\'%s\')', $id);
     }
 
@@ -1597,7 +1568,15 @@ EOF;
                 throw new RuntimeException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.');
             }
             $providers = $this->container->getExpressionLanguageProviders();
-            $this->expressionLanguage = new ExpressionLanguage(null, $providers);
+            $this->expressionLanguage = new ExpressionLanguage(null, $providers, function ($arg) {
+                $id = '""' === substr_replace($arg, '', 1, -1) ? stripcslashes(substr($arg, 1, -1)) : null;
+
+                if (null !== $id && ($this->container->hasAlias($id) || $this->container->hasDefinition($id))) {
+                    return $this->getServiceCall($id);
+                }
+
+                return sprintf('$this->get(%s)', $arg);
+            });
 
             if ($this->container->isTrackingResources()) {
                 foreach ($providers as $provider) {
diff --git a/vendor/symfony/dependency-injection/ExpressionLanguage.php b/vendor/symfony/dependency-injection/ExpressionLanguage.php
index d80985fa670e587fd7722da30cadf2f90ce2abc5..051d41b84ba4b8974bb684eaa3dc3039299b15ae 100644
--- a/vendor/symfony/dependency-injection/ExpressionLanguage.php
+++ b/vendor/symfony/dependency-injection/ExpressionLanguage.php
@@ -25,10 +25,10 @@ class ExpressionLanguage extends BaseExpressionLanguage
     /**
      * {@inheritdoc}
      */
-    public function __construct($cache = null, array $providers = array())
+    public function __construct($cache = null, array $providers = array(), callable $serviceCompiler = null)
     {
         // prepend the default provider to let users override it easily
-        array_unshift($providers, new ExpressionLanguageProvider());
+        array_unshift($providers, new ExpressionLanguageProvider($serviceCompiler));
 
         parent::__construct($cache, $providers);
     }
diff --git a/vendor/symfony/dependency-injection/ExpressionLanguageProvider.php b/vendor/symfony/dependency-injection/ExpressionLanguageProvider.php
index ce6d69522e19127631ad4ae534e441119e4f6a5c..e2084aa85da6d88b7e59352aee83b053482c1da7 100644
--- a/vendor/symfony/dependency-injection/ExpressionLanguageProvider.php
+++ b/vendor/symfony/dependency-injection/ExpressionLanguageProvider.php
@@ -24,10 +24,17 @@ use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;
  */
 class ExpressionLanguageProvider implements ExpressionFunctionProviderInterface
 {
+    private $serviceCompiler;
+
+    public function __construct(callable $serviceCompiler = null)
+    {
+        $this->serviceCompiler = $serviceCompiler;
+    }
+
     public function getFunctions()
     {
         return array(
-            new ExpressionFunction('service', function ($arg) {
+            new ExpressionFunction('service', $this->serviceCompiler ?: function ($arg) {
                 return sprintf('$this->get(%s)', $arg);
             }, function (array $variables, $value) {
                 return $variables['container']->get($value);
diff --git a/vendor/symfony/dependency-injection/Tests/Dumper/PhpDumperTest.php b/vendor/symfony/dependency-injection/Tests/Dumper/PhpDumperTest.php
index 2ff01d120b169ed0c320e843bc4d2feccdb1ec8f..eb491d9435b2d461701d017288817b63b7312d9c 100644
--- a/vendor/symfony/dependency-injection/Tests/Dumper/PhpDumperTest.php
+++ b/vendor/symfony/dependency-injection/Tests/Dumper/PhpDumperTest.php
@@ -122,13 +122,13 @@ class PhpDumperTest extends TestCase
         // without compilation
         $container = include self::$fixturesPath.'/containers/container9.php';
         $dumper = new PhpDumper($container);
-        $this->assertEquals(str_replace('%path%', str_replace('\\', '\\\\', self::$fixturesPath.DIRECTORY_SEPARATOR.'includes'.DIRECTORY_SEPARATOR), file_get_contents(self::$fixturesPath.'/php/services9.php')), $dumper->dump(), '->dump() dumps services');
+        $this->assertStringEqualsFile(self::$fixturesPath.'/php/services9.php', str_replace(str_replace('\\', '\\\\', self::$fixturesPath.DIRECTORY_SEPARATOR.'includes'.DIRECTORY_SEPARATOR), '%path%', $dumper->dump()), '->dump() dumps services');
 
         // with compilation
         $container = include self::$fixturesPath.'/containers/container9.php';
         $container->compile();
         $dumper = new PhpDumper($container);
-        $this->assertEquals(str_replace('%path%', str_replace('\\', '\\\\', self::$fixturesPath.DIRECTORY_SEPARATOR.'includes'.DIRECTORY_SEPARATOR), file_get_contents(self::$fixturesPath.'/php/services9_compiled.php')), $dumper->dump(), '->dump() dumps services');
+        $this->assertStringEqualsFile(self::$fixturesPath.'/php/services9_compiled.php', str_replace(str_replace('\\', '\\\\', self::$fixturesPath.DIRECTORY_SEPARATOR.'includes'.DIRECTORY_SEPARATOR), '%path%', $dumper->dump()), '->dump() dumps services');
 
         $dumper = new PhpDumper($container = new ContainerBuilder());
         $container->register('foo', 'FooClass')->addArgument(new \stdClass());
@@ -425,6 +425,22 @@ class PhpDumperTest extends TestCase
         $this->assertInstanceOf('BazClass', $container->get('bar')->getBaz());
     }
 
+    public function testExpressionReferencingPrivateService()
+    {
+        $container = new ContainerBuilder();
+        $container->register('private_bar', 'stdClass')
+            ->setPublic(false);
+        $container->register('private_foo', 'stdClass')
+            ->setPublic(false);
+        $container->register('public_foo', 'stdClass')
+            ->addArgument(new Expression('service("private_foo")'));
+
+        $container->compile();
+        $dumper = new PhpDumper($container);
+
+        $this->assertStringEqualsFile(self::$fixturesPath.'/php/services_private_in_expression.php', $dumper->dump());
+    }
+
     public function testDumpHandlesLiteralClassWithRootNamespace()
     {
         $container = new ContainerBuilder();
diff --git a/vendor/symfony/dependency-injection/Tests/Fixtures/php/services10.php b/vendor/symfony/dependency-injection/Tests/Fixtures/php/services10.php
index c300e5a4c49f08a6cf6be3b70e717d347a9020a0..e0a0c49542b4d4798bb773f7041f50dcc366df9b 100644
--- a/vendor/symfony/dependency-injection/Tests/Fixtures/php/services10.php
+++ b/vendor/symfony/dependency-injection/Tests/Fixtures/php/services10.php
@@ -50,12 +50,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'test' service.
+     * Gets the public 'test' shared service.
      *
-     * This service is shared.
-     * This method always returns the same instance of the service.
-     *
-     * @return \stdClass A stdClass instance
+     * @return \stdClass
      */
     protected function getTestService()
     {
diff --git a/vendor/symfony/dependency-injection/Tests/Fixtures/php/services12.php b/vendor/symfony/dependency-injection/Tests/Fixtures/php/services12.php
index 5c299f55d69c1895cd4cec95e0b25e78c31b9051..f0c765218c8ce09b900b748db5e2c495ba715ce3 100644
--- a/vendor/symfony/dependency-injection/Tests/Fixtures/php/services12.php
+++ b/vendor/symfony/dependency-injection/Tests/Fixtures/php/services12.php
@@ -54,12 +54,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'test' service.
+     * Gets the public 'test' shared service.
      *
-     * This service is shared.
-     * This method always returns the same instance of the service.
-     *
-     * @return \stdClass A stdClass instance
+     * @return \stdClass
      */
     protected function getTestService()
     {
diff --git a/vendor/symfony/dependency-injection/Tests/Fixtures/php/services13.php b/vendor/symfony/dependency-injection/Tests/Fixtures/php/services13.php
index 58052966744eeac4e0dabe77fead21ae0b69d704..852e5a2f3c6b24748ea2f674ff81791440814ac9 100644
--- a/vendor/symfony/dependency-injection/Tests/Fixtures/php/services13.php
+++ b/vendor/symfony/dependency-injection/Tests/Fixtures/php/services13.php
@@ -48,12 +48,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'bar' service.
+     * Gets the public 'bar' shared service.
      *
-     * This service is shared.
-     * This method always returns the same instance of the service.
-     *
-     * @return \stdClass A stdClass instance
+     * @return \stdClass
      */
     protected function getBarService()
     {
diff --git a/vendor/symfony/dependency-injection/Tests/Fixtures/php/services19.php b/vendor/symfony/dependency-injection/Tests/Fixtures/php/services19.php
index e89c3c8f8e22b1d956c94e245c10a67645a51007..da8135e32b6e88cd999821a5617597bbf6b062ff 100644
--- a/vendor/symfony/dependency-injection/Tests/Fixtures/php/services19.php
+++ b/vendor/symfony/dependency-injection/Tests/Fixtures/php/services19.php
@@ -31,12 +31,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'service_from_anonymous_factory' service.
+     * Gets the public 'service_from_anonymous_factory' shared service.
      *
-     * This service is shared.
-     * This method always returns the same instance of the service.
-     *
-     * @return \Bar\FooClass A Bar\FooClass instance
+     * @return \Bar\FooClass
      */
     protected function getServiceFromAnonymousFactoryService()
     {
@@ -44,12 +41,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'service_with_method_call_and_factory' service.
-     *
-     * This service is shared.
-     * This method always returns the same instance of the service.
+     * Gets the public 'service_with_method_call_and_factory' shared service.
      *
-     * @return \Bar\FooClass A Bar\FooClass instance
+     * @return \Bar\FooClass
      */
     protected function getServiceWithMethodCallAndFactoryService()
     {
diff --git a/vendor/symfony/dependency-injection/Tests/Fixtures/php/services24.php b/vendor/symfony/dependency-injection/Tests/Fixtures/php/services24.php
index 00f11e925e17dd1b9aef8c68c9e152339d685d90..aa920e7c77bd1fe1e27bc0594a08e587bd1969c1 100644
--- a/vendor/symfony/dependency-injection/Tests/Fixtures/php/services24.php
+++ b/vendor/symfony/dependency-injection/Tests/Fixtures/php/services24.php
@@ -30,14 +30,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'foo' service.
+     * Gets the public 'foo' shared autowired service.
      *
-     * This service is shared.
-     * This method always returns the same instance of the service.
-     *
-     * This service is autowired.
-     *
-     * @return \Foo A Foo instance
+     * @return \Foo
      */
     protected function getFooService()
     {
diff --git a/vendor/symfony/dependency-injection/Tests/Fixtures/php/services26.php b/vendor/symfony/dependency-injection/Tests/Fixtures/php/services26.php
index d834ae2865dae78063f13e41d456529a78e2e126..84eb66deaca9fa05f91a4b7bd5654c4eee2298f8 100644
--- a/vendor/symfony/dependency-injection/Tests/Fixtures/php/services26.php
+++ b/vendor/symfony/dependency-injection/Tests/Fixtures/php/services26.php
@@ -50,10 +50,7 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'test' service.
-     *
-     * This service is shared.
-     * This method always returns the same instance of the service.
+     * Gets the public 'test' shared service.
      *
      * @return object A %env(FOO)% instance
      */
diff --git a/vendor/symfony/dependency-injection/Tests/Fixtures/php/services9.php b/vendor/symfony/dependency-injection/Tests/Fixtures/php/services9.php
index 306375d1b5541ecad4abe754720902ecf56499cc..0100b8f585f50fbb170607eba8ee4c8ccf00a2c6 100644
--- a/vendor/symfony/dependency-injection/Tests/Fixtures/php/services9.php
+++ b/vendor/symfony/dependency-injection/Tests/Fixtures/php/services9.php
@@ -63,12 +63,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'bar' service.
+     * Gets the public 'bar' shared service.
      *
-     * This service is shared.
-     * This method always returns the same instance of the service.
-     *
-     * @return \Bar\FooClass A Bar\FooClass instance
+     * @return \Bar\FooClass
      */
     protected function getBarService()
     {
@@ -82,12 +79,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'baz' service.
-     *
-     * This service is shared.
-     * This method always returns the same instance of the service.
+     * Gets the public 'baz' shared service.
      *
-     * @return \Baz A Baz instance
+     * @return \Baz
      */
     protected function getBazService()
     {
@@ -99,12 +93,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'configured_service' service.
+     * Gets the public 'configured_service' shared service.
      *
-     * This service is shared.
-     * This method always returns the same instance of the service.
-     *
-     * @return \stdClass A stdClass instance
+     * @return \stdClass
      */
     protected function getConfiguredServiceService()
     {
@@ -116,12 +107,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'configured_service_simple' service.
-     *
-     * This service is shared.
-     * This method always returns the same instance of the service.
+     * Gets the public 'configured_service_simple' shared service.
      *
-     * @return \stdClass A stdClass instance
+     * @return \stdClass
      */
     protected function getConfiguredServiceSimpleService()
     {
@@ -133,12 +121,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'decorated' service.
+     * Gets the public 'decorated' shared service.
      *
-     * This service is shared.
-     * This method always returns the same instance of the service.
-     *
-     * @return \stdClass A stdClass instance
+     * @return \stdClass
      */
     protected function getDecoratedService()
     {
@@ -146,12 +131,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'decorator_service' service.
-     *
-     * This service is shared.
-     * This method always returns the same instance of the service.
+     * Gets the public 'decorator_service' shared service.
      *
-     * @return \stdClass A stdClass instance
+     * @return \stdClass
      */
     protected function getDecoratorServiceService()
     {
@@ -159,12 +141,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'decorator_service_with_name' service.
-     *
-     * This service is shared.
-     * This method always returns the same instance of the service.
+     * Gets the public 'decorator_service_with_name' shared service.
      *
-     * @return \stdClass A stdClass instance
+     * @return \stdClass
      */
     protected function getDecoratorServiceWithNameService()
     {
@@ -172,12 +151,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'deprecated_service' service.
+     * Gets the public 'deprecated_service' shared service.
      *
-     * This service is shared.
-     * This method always returns the same instance of the service.
-     *
-     * @return \stdClass A stdClass instance
+     * @return \stdClass
      *
      * @deprecated The "deprecated_service" service is deprecated. You should stop using it, as it will soon be removed.
      */
@@ -189,12 +165,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'factory_service' service.
-     *
-     * This service is shared.
-     * This method always returns the same instance of the service.
+     * Gets the public 'factory_service' shared service.
      *
-     * @return \Bar A Bar instance
+     * @return \Bar
      */
     protected function getFactoryServiceService()
     {
@@ -202,12 +175,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'factory_service_simple' service.
+     * Gets the public 'factory_service_simple' shared service.
      *
-     * This service is shared.
-     * This method always returns the same instance of the service.
-     *
-     * @return \Bar A Bar instance
+     * @return \Bar
      */
     protected function getFactoryServiceSimpleService()
     {
@@ -215,12 +185,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'foo' service.
-     *
-     * This service is shared.
-     * This method always returns the same instance of the service.
+     * Gets the public 'foo' shared service.
      *
-     * @return \Bar\FooClass A Bar\FooClass instance
+     * @return \Bar\FooClass
      */
     protected function getFooService()
     {
@@ -239,10 +206,7 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'foo.baz' service.
-     *
-     * This service is shared.
-     * This method always returns the same instance of the service.
+     * Gets the public 'foo.baz' shared service.
      *
      * @return object A %baz_class% instance
      */
@@ -256,7 +220,7 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'foo_bar' service.
+     * Gets the public 'foo_bar' service.
      *
      * @return object A %foo_class% instance
      */
@@ -268,12 +232,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'foo_with_inline' service.
-     *
-     * This service is shared.
-     * This method always returns the same instance of the service.
+     * Gets the public 'foo_with_inline' shared service.
      *
-     * @return \Foo A Foo instance
+     * @return \Foo
      */
     protected function getFooWithInlineService()
     {
@@ -285,12 +246,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'method_call1' service.
-     *
-     * This service is shared.
-     * This method always returns the same instance of the service.
+     * Gets the public 'method_call1' shared service.
      *
-     * @return \Bar\FooClass A Bar\FooClass instance
+     * @return \Bar\FooClass
      */
     protected function getMethodCall1Service()
     {
@@ -306,18 +264,15 @@ class ProjectServiceContainer extends Container
         if ($this->has('foobaz')) {
             $instance->setBar($this->get('foobaz', ContainerInterface::NULL_ON_INVALID_REFERENCE));
         }
-        $instance->setBar(($this->get("foo")->foo() . (($this->hasParameter("foo")) ? ($this->getParameter("foo")) : ("default"))));
+        $instance->setBar(($this->get('foo')->foo() . (($this->hasParameter("foo")) ? ($this->getParameter("foo")) : ("default"))));
 
         return $instance;
     }
 
     /**
-     * Gets the 'new_factory_service' service.
+     * Gets the public 'new_factory_service' shared service.
      *
-     * This service is shared.
-     * This method always returns the same instance of the service.
-     *
-     * @return \FooBarBaz A FooBarBaz instance
+     * @return \FooBarBaz
      */
     protected function getNewFactoryServiceService()
     {
@@ -329,10 +284,7 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'request' service.
-     *
-     * This service is shared.
-     * This method always returns the same instance of the service.
+     * Gets the public 'request' shared service.
      *
      * @throws RuntimeException always since this service is expected to be injected dynamically
      */
@@ -342,12 +294,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'service_from_static_method' service.
+     * Gets the public 'service_from_static_method' shared service.
      *
-     * This service is shared.
-     * This method always returns the same instance of the service.
-     *
-     * @return \Bar\FooClass A Bar\FooClass instance
+     * @return \Bar\FooClass
      */
     protected function getServiceFromStaticMethodService()
     {
@@ -355,16 +304,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'configurator_service' service.
-     *
-     * This service is shared.
-     * This method always returns the same instance of the service.
+     * Gets the private 'configurator_service' shared service.
      *
-     * This service is private.
-     * If you want to be able to request this service from the container directly,
-     * make it public, otherwise you might end up with broken code.
-     *
-     * @return \ConfClass A ConfClass instance
+     * @return \ConfClass
      */
     protected function getConfiguratorServiceService()
     {
@@ -376,16 +318,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'configurator_service_simple' service.
-     *
-     * This service is shared.
-     * This method always returns the same instance of the service.
-     *
-     * This service is private.
-     * If you want to be able to request this service from the container directly,
-     * make it public, otherwise you might end up with broken code.
+     * Gets the private 'configurator_service_simple' shared service.
      *
-     * @return \ConfClass A ConfClass instance
+     * @return \ConfClass
      */
     protected function getConfiguratorServiceSimpleService()
     {
@@ -393,16 +328,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'factory_simple' service.
+     * Gets the private 'factory_simple' shared service.
      *
-     * This service is shared.
-     * This method always returns the same instance of the service.
-     *
-     * This service is private.
-     * If you want to be able to request this service from the container directly,
-     * make it public, otherwise you might end up with broken code.
-     *
-     * @return \SimpleFactoryClass A SimpleFactoryClass instance
+     * @return \SimpleFactoryClass
      */
     protected function getFactorySimpleService()
     {
@@ -410,16 +338,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'inlined' service.
-     *
-     * This service is shared.
-     * This method always returns the same instance of the service.
+     * Gets the private 'inlined' shared service.
      *
-     * This service is private.
-     * If you want to be able to request this service from the container directly,
-     * make it public, otherwise you might end up with broken code.
-     *
-     * @return \Bar A Bar instance
+     * @return \Bar
      */
     protected function getInlinedService()
     {
@@ -432,16 +353,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'new_factory' service.
-     *
-     * This service is shared.
-     * This method always returns the same instance of the service.
-     *
-     * This service is private.
-     * If you want to be able to request this service from the container directly,
-     * make it public, otherwise you might end up with broken code.
+     * Gets the private 'new_factory' shared service.
      *
-     * @return \FactoryClass A FactoryClass instance
+     * @return \FactoryClass
      */
     protected function getNewFactoryService()
     {
diff --git a/vendor/symfony/dependency-injection/Tests/Fixtures/php/services9_compiled.php b/vendor/symfony/dependency-injection/Tests/Fixtures/php/services9_compiled.php
index f8b263c2a01f31688f3cfd5a18a62acec8da445c..4680b6e853b9c8154af0d7d2ceae7f281db049d8 100644
--- a/vendor/symfony/dependency-injection/Tests/Fixtures/php/services9_compiled.php
+++ b/vendor/symfony/dependency-injection/Tests/Fixtures/php/services9_compiled.php
@@ -69,12 +69,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'bar' service.
+     * Gets the public 'bar' shared service.
      *
-     * This service is shared.
-     * This method always returns the same instance of the service.
-     *
-     * @return \Bar\FooClass A Bar\FooClass instance
+     * @return \Bar\FooClass
      */
     protected function getBarService()
     {
@@ -88,12 +85,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'baz' service.
-     *
-     * This service is shared.
-     * This method always returns the same instance of the service.
+     * Gets the public 'baz' shared service.
      *
-     * @return \Baz A Baz instance
+     * @return \Baz
      */
     protected function getBazService()
     {
@@ -105,12 +99,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'configured_service' service.
+     * Gets the public 'configured_service' shared service.
      *
-     * This service is shared.
-     * This method always returns the same instance of the service.
-     *
-     * @return \stdClass A stdClass instance
+     * @return \stdClass
      */
     protected function getConfiguredServiceService()
     {
@@ -125,12 +116,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'configured_service_simple' service.
-     *
-     * This service is shared.
-     * This method always returns the same instance of the service.
+     * Gets the public 'configured_service_simple' shared service.
      *
-     * @return \stdClass A stdClass instance
+     * @return \stdClass
      */
     protected function getConfiguredServiceSimpleService()
     {
@@ -142,12 +130,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'decorator_service' service.
+     * Gets the public 'decorator_service' shared service.
      *
-     * This service is shared.
-     * This method always returns the same instance of the service.
-     *
-     * @return \stdClass A stdClass instance
+     * @return \stdClass
      */
     protected function getDecoratorServiceService()
     {
@@ -155,12 +140,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'decorator_service_with_name' service.
-     *
-     * This service is shared.
-     * This method always returns the same instance of the service.
+     * Gets the public 'decorator_service_with_name' shared service.
      *
-     * @return \stdClass A stdClass instance
+     * @return \stdClass
      */
     protected function getDecoratorServiceWithNameService()
     {
@@ -168,12 +150,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'deprecated_service' service.
+     * Gets the public 'deprecated_service' shared service.
      *
-     * This service is shared.
-     * This method always returns the same instance of the service.
-     *
-     * @return \stdClass A stdClass instance
+     * @return \stdClass
      *
      * @deprecated The "deprecated_service" service is deprecated. You should stop using it, as it will soon be removed.
      */
@@ -185,12 +164,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'factory_service' service.
-     *
-     * This service is shared.
-     * This method always returns the same instance of the service.
+     * Gets the public 'factory_service' shared service.
      *
-     * @return \Bar A Bar instance
+     * @return \Bar
      */
     protected function getFactoryServiceService()
     {
@@ -198,12 +174,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'factory_service_simple' service.
+     * Gets the public 'factory_service_simple' shared service.
      *
-     * This service is shared.
-     * This method always returns the same instance of the service.
-     *
-     * @return \Bar A Bar instance
+     * @return \Bar
      */
     protected function getFactoryServiceSimpleService()
     {
@@ -211,12 +184,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'foo' service.
-     *
-     * This service is shared.
-     * This method always returns the same instance of the service.
+     * Gets the public 'foo' shared service.
      *
-     * @return \Bar\FooClass A Bar\FooClass instance
+     * @return \Bar\FooClass
      */
     protected function getFooService()
     {
@@ -235,12 +205,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'foo.baz' service.
+     * Gets the public 'foo.baz' shared service.
      *
-     * This service is shared.
-     * This method always returns the same instance of the service.
-     *
-     * @return \BazClass A BazClass instance
+     * @return \BazClass
      */
     protected function getFoo_BazService()
     {
@@ -252,9 +219,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'foo_bar' service.
+     * Gets the public 'foo_bar' service.
      *
-     * @return \Bar\FooClass A Bar\FooClass instance
+     * @return \Bar\FooClass
      */
     protected function getFooBarService()
     {
@@ -262,12 +229,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'foo_with_inline' service.
-     *
-     * This service is shared.
-     * This method always returns the same instance of the service.
+     * Gets the public 'foo_with_inline' shared service.
      *
-     * @return \Foo A Foo instance
+     * @return \Foo
      */
     protected function getFooWithInlineService()
     {
@@ -284,12 +248,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'method_call1' service.
+     * Gets the public 'method_call1' shared service.
      *
-     * This service is shared.
-     * This method always returns the same instance of the service.
-     *
-     * @return \Bar\FooClass A Bar\FooClass instance
+     * @return \Bar\FooClass
      */
     protected function getMethodCall1Service()
     {
@@ -299,18 +260,15 @@ class ProjectServiceContainer extends Container
 
         $instance->setBar($this->get('foo'));
         $instance->setBar(NULL);
-        $instance->setBar(($this->get("foo")->foo() . (($this->hasParameter("foo")) ? ($this->getParameter("foo")) : ("default"))));
+        $instance->setBar(($this->get('foo')->foo() . (($this->hasParameter("foo")) ? ($this->getParameter("foo")) : ("default"))));
 
         return $instance;
     }
 
     /**
-     * Gets the 'new_factory_service' service.
-     *
-     * This service is shared.
-     * This method always returns the same instance of the service.
+     * Gets the public 'new_factory_service' shared service.
      *
-     * @return \FooBarBaz A FooBarBaz instance
+     * @return \FooBarBaz
      */
     protected function getNewFactoryServiceService()
     {
@@ -325,10 +283,7 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'request' service.
-     *
-     * This service is shared.
-     * This method always returns the same instance of the service.
+     * Gets the public 'request' shared service.
      *
      * @throws RuntimeException always since this service is expected to be injected dynamically
      */
@@ -338,12 +293,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'service_from_static_method' service.
-     *
-     * This service is shared.
-     * This method always returns the same instance of the service.
+     * Gets the public 'service_from_static_method' shared service.
      *
-     * @return \Bar\FooClass A Bar\FooClass instance
+     * @return \Bar\FooClass
      */
     protected function getServiceFromStaticMethodService()
     {
diff --git a/vendor/symfony/dependency-injection/Tests/Fixtures/php/services_private_frozen.php b/vendor/symfony/dependency-injection/Tests/Fixtures/php/services_private_frozen.php
index f14141b8d1b2ccfc1885ebeadc08ec134963e02a..998418fc8da60d8befb015cf8842c6b705fd0e5f 100644
--- a/vendor/symfony/dependency-injection/Tests/Fixtures/php/services_private_frozen.php
+++ b/vendor/symfony/dependency-injection/Tests/Fixtures/php/services_private_frozen.php
@@ -53,12 +53,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'bar_service' service.
+     * Gets the public 'bar_service' shared service.
      *
-     * This service is shared.
-     * This method always returns the same instance of the service.
-     *
-     * @return \stdClass A stdClass instance
+     * @return \stdClass
      */
     protected function getBarServiceService()
     {
@@ -66,12 +63,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'foo_service' service.
-     *
-     * This service is shared.
-     * This method always returns the same instance of the service.
+     * Gets the public 'foo_service' shared service.
      *
-     * @return \stdClass A stdClass instance
+     * @return \stdClass
      */
     protected function getFooServiceService()
     {
@@ -79,16 +73,9 @@ class ProjectServiceContainer extends Container
     }
 
     /**
-     * Gets the 'baz_service' service.
-     *
-     * This service is shared.
-     * This method always returns the same instance of the service.
-     *
-     * This service is private.
-     * If you want to be able to request this service from the container directly,
-     * make it public, otherwise you might end up with broken code.
+     * Gets the private 'baz_service' shared service.
      *
-     * @return \stdClass A stdClass instance
+     * @return \stdClass
      */
     protected function getBazServiceService()
     {
diff --git a/vendor/symfony/dependency-injection/Tests/Fixtures/php/services_private_in_expression.php b/vendor/symfony/dependency-injection/Tests/Fixtures/php/services_private_in_expression.php
new file mode 100644
index 0000000000000000000000000000000000000000..3ac7e1c46c7ae531d5341faa66fcf582031c43db
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Tests/Fixtures/php/services_private_in_expression.php
@@ -0,0 +1,73 @@
+<?php
+
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Container;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\DependencyInjection\Exception\LogicException;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;
+
+/**
+ * ProjectServiceContainer.
+ *
+ * This class has been auto-generated
+ * by the Symfony Dependency Injection Component.
+ */
+class ProjectServiceContainer extends Container
+{
+    private $parameters;
+    private $targetDirs = array();
+
+    /**
+     * Constructor.
+     */
+    public function __construct()
+    {
+        $this->services = array();
+        $this->methodMap = array(
+            'private_foo' => 'getPrivateFooService',
+            'public_foo' => 'getPublicFooService',
+        );
+        $this->privates = array(
+            'private_foo' => true,
+        );
+
+        $this->aliases = array();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function compile()
+    {
+        throw new LogicException('You cannot compile a dumped frozen container.');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isFrozen()
+    {
+        return true;
+    }
+
+    /**
+     * Gets the public 'public_foo' shared service.
+     *
+     * @return \stdClass
+     */
+    protected function getPublicFooService()
+    {
+        return $this->services['public_foo'] = new \stdClass(${($_ = isset($this->services['private_foo']) ? $this->services['private_foo'] : $this->getPrivateFooService()) && false ?: '_'});
+    }
+
+    /**
+     * Gets the private 'private_foo' shared service.
+     *
+     * @return \stdClass
+     */
+    protected function getPrivateFooService()
+    {
+        return $this->services['private_foo'] = new \stdClass();
+    }
+}
diff --git a/vendor/symfony/event-dispatcher/ContainerAwareEventDispatcher.php b/vendor/symfony/event-dispatcher/ContainerAwareEventDispatcher.php
index f2d5a4053d4f71a02534639efe36214586e88c77..58c2a89f6773510d8706f72de4d6c30c74537dc9 100644
--- a/vendor/symfony/event-dispatcher/ContainerAwareEventDispatcher.php
+++ b/vendor/symfony/event-dispatcher/ContainerAwareEventDispatcher.php
@@ -23,32 +23,18 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
  */
 class ContainerAwareEventDispatcher extends EventDispatcher
 {
-    /**
-     * The container from where services are loaded.
-     *
-     * @var ContainerInterface
-     */
     private $container;
 
     /**
      * The service IDs of the event listeners and subscribers.
-     *
-     * @var array
      */
     private $listenerIds = array();
 
     /**
      * The services registered as listeners.
-     *
-     * @var array
      */
     private $listeners = array();
 
-    /**
-     * Constructor.
-     *
-     * @param ContainerInterface $container A ContainerInterface instance
-     */
     public function __construct(ContainerInterface $container)
     {
         $this->container = $container;
@@ -185,7 +171,7 @@ class ContainerAwareEventDispatcher extends EventDispatcher
                 $key = $serviceId.'.'.$method;
                 if (!isset($this->listeners[$eventName][$key])) {
                     $this->addListener($eventName, array($listener, $method), $priority);
-                } elseif ($listener !== $this->listeners[$eventName][$key]) {
+                } elseif ($this->listeners[$eventName][$key] !== $listener) {
                     parent::removeListener($eventName, array($this->listeners[$eventName][$key], $method));
                     $this->addListener($eventName, array($listener, $method), $priority);
                 }
diff --git a/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php b/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php
index 2f6d9be0276a78d8306b3d251ea42e4f02312748..db76bb845021a465aaaea4790df03c7459b616d1 100644
--- a/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php
+++ b/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php
@@ -33,13 +33,6 @@ class TraceableEventDispatcher implements TraceableEventDispatcherInterface
     private $dispatcher;
     private $wrappedListeners;
 
-    /**
-     * Constructor.
-     *
-     * @param EventDispatcherInterface $dispatcher An EventDispatcherInterface instance
-     * @param Stopwatch                $stopwatch  A Stopwatch instance
-     * @param LoggerInterface          $logger     A LoggerInterface instance
-     */
     public function __construct(EventDispatcherInterface $dispatcher, Stopwatch $stopwatch, LoggerInterface $logger = null)
     {
         $this->dispatcher = $dispatcher;
diff --git a/vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php b/vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php
index 326bfd184f49744b0bf5d9199308876a270a0545..764517693c01ca991bb7b999e00a422568b322c7 100644
--- a/vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php
+++ b/vendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php
@@ -19,24 +19,11 @@ use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
  */
 class RegisterListenersPass implements CompilerPassInterface
 {
-    /**
-     * @var string
-     */
     protected $dispatcherService;
-
-    /**
-     * @var string
-     */
     protected $listenerTag;
-
-    /**
-     * @var string
-     */
     protected $subscriberTag;
 
     /**
-     * Constructor.
-     *
      * @param string $dispatcherService Service name of the event dispatcher in processed container
      * @param string $listenerTag       Tag name used for listener
      * @param string $subscriberTag     Tag name used for subscribers
diff --git a/vendor/symfony/event-dispatcher/EventDispatcherInterface.php b/vendor/symfony/event-dispatcher/EventDispatcherInterface.php
index abe8d2895ebc353bfc25f1edef5ef26fdb46a771..60160a90e00ae8a1c02545f0d0209e0711cdfd36 100644
--- a/vendor/symfony/event-dispatcher/EventDispatcherInterface.php
+++ b/vendor/symfony/event-dispatcher/EventDispatcherInterface.php
@@ -27,7 +27,7 @@ interface EventDispatcherInterface
      *                          the event is the name of the method that is
      *                          invoked on listeners.
      * @param Event  $event     The event to pass to the event handlers/listeners
-     *                          If not supplied, an empty Event instance is created.
+     *                          If not supplied, an empty Event instance is created
      *
      * @return Event
      */
@@ -48,8 +48,6 @@ interface EventDispatcherInterface
      *
      * The subscriber is asked for all the events he is
      * interested in and added as a listener for these events.
-     *
-     * @param EventSubscriberInterface $subscriber The subscriber
      */
     public function addSubscriber(EventSubscriberInterface $subscriber);
 
@@ -61,11 +59,6 @@ interface EventDispatcherInterface
      */
     public function removeListener($eventName, $listener);
 
-    /**
-     * Removes an event subscriber.
-     *
-     * @param EventSubscriberInterface $subscriber The subscriber
-     */
     public function removeSubscriber(EventSubscriberInterface $subscriber);
 
     /**
diff --git a/vendor/symfony/event-dispatcher/GenericEvent.php b/vendor/symfony/event-dispatcher/GenericEvent.php
index e8e4cc050266ee0762585c27ee11d21ec84d6faf..95c99408de20f3ee779c1f44a009f56903adbace 100644
--- a/vendor/symfony/event-dispatcher/GenericEvent.php
+++ b/vendor/symfony/event-dispatcher/GenericEvent.php
@@ -20,24 +20,13 @@ namespace Symfony\Component\EventDispatcher;
  */
 class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate
 {
-    /**
-     * Event subject.
-     *
-     * @var mixed usually object or callable
-     */
     protected $subject;
-
-    /**
-     * Array of arguments.
-     *
-     * @var array
-     */
     protected $arguments;
 
     /**
      * Encapsulate an event with $subject and $args.
      *
-     * @param mixed $subject   The subject of the event, usually an object
+     * @param mixed $subject   The subject of the event, usually an object or a callable
      * @param array $arguments Arguments to store in the event
      */
     public function __construct($subject = null, array $arguments = array())
@@ -63,7 +52,7 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate
      *
      * @return mixed Contents of array key
      *
-     * @throws \InvalidArgumentException If key is not found.
+     * @throws \InvalidArgumentException if key is not found
      */
     public function getArgument($key)
     {
@@ -132,7 +121,7 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate
      *
      * @return mixed
      *
-     * @throws \InvalidArgumentException If key does not exist in $this->args.
+     * @throws \InvalidArgumentException if key does not exist in $this->args
      */
     public function offsetGet($key)
     {
diff --git a/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php b/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php
index 7f2be8d3145d6f1b2315d4c24a8bc4b8e8899976..b3cf56c502dba3a7f80fea3241b766024348c3d7 100644
--- a/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php
+++ b/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php
@@ -18,18 +18,8 @@ namespace Symfony\Component\EventDispatcher;
  */
 class ImmutableEventDispatcher implements EventDispatcherInterface
 {
-    /**
-     * The proxied dispatcher.
-     *
-     * @var EventDispatcherInterface
-     */
     private $dispatcher;
 
-    /**
-     * Creates an unmodifiable proxy for an event dispatcher.
-     *
-     * @param EventDispatcherInterface $dispatcher The proxied event dispatcher
-     */
     public function __construct(EventDispatcherInterface $dispatcher)
     {
         $this->dispatcher = $dispatcher;
diff --git a/vendor/symfony/finder/Adapter/AbstractFindAdapter.php b/vendor/symfony/finder/Adapter/AbstractFindAdapter.php
index cff694732ce615a1a8ba9124f646b51c3f5619b8..d0294c9f87d96bac6d2d847a013cfbae6683ac13 100644
--- a/vendor/symfony/finder/Adapter/AbstractFindAdapter.php
+++ b/vendor/symfony/finder/Adapter/AbstractFindAdapter.php
@@ -30,14 +30,8 @@ use Symfony\Component\Finder\Comparator\DateComparator;
  */
 abstract class AbstractFindAdapter extends AbstractAdapter
 {
-    /**
-     * @var Shell
-     */
     protected $shell;
 
-    /**
-     * Constructor.
-     */
     public function __construct()
     {
         $this->shell = new Shell();
diff --git a/vendor/symfony/finder/Adapter/AdapterInterface.php b/vendor/symfony/finder/Adapter/AdapterInterface.php
index 07e4f5f241673470754da64a5f606d53bcdf3cf7..8d8fb0749a6b4e753214507df079dbead6671209 100644
--- a/vendor/symfony/finder/Adapter/AdapterInterface.php
+++ b/vendor/symfony/finder/Adapter/AdapterInterface.php
@@ -33,64 +33,46 @@ interface AdapterInterface
     public function setMode($mode);
 
     /**
-     * @param array $exclude
-     *
      * @return $this
      */
     public function setExclude(array $exclude);
 
     /**
-     * @param array $depths
-     *
      * @return $this
      */
     public function setDepths(array $depths);
 
     /**
-     * @param array $names
-     *
      * @return $this
      */
     public function setNames(array $names);
 
     /**
-     * @param array $notNames
-     *
      * @return $this
      */
     public function setNotNames(array $notNames);
 
     /**
-     * @param array $contains
-     *
      * @return $this
      */
     public function setContains(array $contains);
 
     /**
-     * @param array $notContains
-     *
      * @return $this
      */
     public function setNotContains(array $notContains);
 
     /**
-     * @param array $sizes
-     *
      * @return $this
      */
     public function setSizes(array $sizes);
 
     /**
-     * @param array $dates
-     *
      * @return $this
      */
     public function setDates(array $dates);
 
     /**
-     * @param array $filters
-     *
      * @return $this
      */
     public function setFilters(array $filters);
@@ -103,15 +85,11 @@ interface AdapterInterface
     public function setSort($sort);
 
     /**
-     * @param array $paths
-     *
      * @return $this
      */
     public function setPath(array $paths);
 
     /**
-     * @param array $notPaths
-     *
      * @return $this
      */
     public function setNotPath(array $notPaths);
diff --git a/vendor/symfony/finder/Adapter/GnuFindAdapter.php b/vendor/symfony/finder/Adapter/GnuFindAdapter.php
index 3888645ad61275db6d3e996dfceebe89dd392492..ec3dff49834528ed18a9b29b06743d392809b112 100644
--- a/vendor/symfony/finder/Adapter/GnuFindAdapter.php
+++ b/vendor/symfony/finder/Adapter/GnuFindAdapter.php
@@ -76,7 +76,7 @@ class GnuFindAdapter extends AbstractFindAdapter
      */
     protected function canBeUsed()
     {
-        return $this->shell->getType() === Shell::TYPE_UNIX && parent::canBeUsed();
+        return Shell::TYPE_UNIX === $this->shell->getType() && parent::canBeUsed();
     }
 
     /**
diff --git a/vendor/symfony/finder/Comparator/DateComparator.php b/vendor/symfony/finder/Comparator/DateComparator.php
index 8b7746badbe99329e9b376065feed29d0d8f2a3f..3de43ef4b8ddb757ee0d977d1679175c349e63e1 100644
--- a/vendor/symfony/finder/Comparator/DateComparator.php
+++ b/vendor/symfony/finder/Comparator/DateComparator.php
@@ -19,8 +19,6 @@ namespace Symfony\Component\Finder\Comparator;
 class DateComparator extends Comparator
 {
     /**
-     * Constructor.
-     *
      * @param string $test A comparison string
      *
      * @throws \InvalidArgumentException If the test is not understood
diff --git a/vendor/symfony/finder/Comparator/NumberComparator.php b/vendor/symfony/finder/Comparator/NumberComparator.php
index 16f91285a6d8c2606425f490350d2fd60c22b495..f62c0e5740f69f51d4d7b315faa55b0ac5bc6270 100644
--- a/vendor/symfony/finder/Comparator/NumberComparator.php
+++ b/vendor/symfony/finder/Comparator/NumberComparator.php
@@ -35,8 +35,6 @@ namespace Symfony\Component\Finder\Comparator;
 class NumberComparator extends Comparator
 {
     /**
-     * Constructor.
-     *
      * @param string|int $test A comparison string or an integer
      *
      * @throws \InvalidArgumentException If the test is not understood
diff --git a/vendor/symfony/finder/Exception/AdapterFailureException.php b/vendor/symfony/finder/Exception/AdapterFailureException.php
index 7229451b8c15dd331558b71d56454812c4e09216..5c2111b46daa98f6651bb443266ae5c52d5e3334 100644
--- a/vendor/symfony/finder/Exception/AdapterFailureException.php
+++ b/vendor/symfony/finder/Exception/AdapterFailureException.php
@@ -24,9 +24,6 @@ use Symfony\Component\Finder\Adapter\AdapterInterface;
  */
 class AdapterFailureException extends \RuntimeException implements ExceptionInterface
 {
-    /**
-     * @var \Symfony\Component\Finder\Adapter\AdapterInterface
-     */
     private $adapter;
 
     /**
diff --git a/vendor/symfony/finder/Exception/ShellCommandFailureException.php b/vendor/symfony/finder/Exception/ShellCommandFailureException.php
index 10251bff96dba308539ed310118b7d2df0d41542..45d42ba1a7a63ee31282294112f440fa61a1783f 100644
--- a/vendor/symfony/finder/Exception/ShellCommandFailureException.php
+++ b/vendor/symfony/finder/Exception/ShellCommandFailureException.php
@@ -23,16 +23,8 @@ use Symfony\Component\Finder\Shell\Command;
  */
 class ShellCommandFailureException extends AdapterFailureException
 {
-    /**
-     * @var Command
-     */
     private $command;
 
-    /**
-     * @param AdapterInterface $adapter
-     * @param Command          $command
-     * @param \Exception|null  $previous
-     */
     public function __construct(AdapterInterface $adapter, Command $command, \Exception $previous = null)
     {
         $this->command = $command;
diff --git a/vendor/symfony/finder/Expression/Glob.php b/vendor/symfony/finder/Expression/Glob.php
index 9382d9169bfd4ebde72cd3c3377b42f789cb3c58..f4c1f9aeab249d2865a921777056e313fe96b240 100644
--- a/vendor/symfony/finder/Expression/Glob.php
+++ b/vendor/symfony/finder/Expression/Glob.php
@@ -20,9 +20,6 @@ use Symfony\Component\Finder\Glob as FinderGlob;
  */
 class Glob implements ValueInterface
 {
-    /**
-     * @var string
-     */
     private $pattern;
 
     /**
diff --git a/vendor/symfony/finder/Expression/Regex.php b/vendor/symfony/finder/Expression/Regex.php
index 2fd2b96edb1421438d20e5e166d00343fe13cdae..b8c770cf1153a8dacd63076a4afe698b7ee90f50 100644
--- a/vendor/symfony/finder/Expression/Regex.php
+++ b/vendor/symfony/finder/Expression/Regex.php
@@ -30,7 +30,7 @@ class Regex implements ValueInterface
     private $pattern;
 
     /**
-     * @var array
+     * @var string
      */
     private $options;
 
@@ -69,8 +69,8 @@ class Regex implements ValueInterface
 
             if (
                 ($start === $end && !preg_match('/[*?[:alnum:] \\\\]/', $start))
-                || ($start === '{' && $end === '}')
-                || ($start === '(' && $end === ')')
+                || ('{' === $start && '}' === $end)
+                || ('(' === $start && ')' === $end)
             ) {
                 return new self(substr($m[1], 1, -1), $m[2], $end);
             }
@@ -279,8 +279,6 @@ class Regex implements ValueInterface
     }
 
     /**
-     * @param array $replacement
-     *
      * @return $this
      */
     public function replaceJokers($replacement)
diff --git a/vendor/symfony/finder/Finder.php b/vendor/symfony/finder/Finder.php
index e6a5442f1fff7fe861e17e282c2762f4f60af6dd..d8a20f11865147801a1c5ef9d296dc7dccb39a9e 100644
--- a/vendor/symfony/finder/Finder.php
+++ b/vendor/symfony/finder/Finder.php
@@ -67,9 +67,6 @@ class Finder implements \IteratorAggregate, \Countable
 
     private static $vcsPatterns = array('.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg');
 
-    /**
-     * Constructor.
-     */
     public function __construct()
     {
         $this->ignore = static::IGNORE_VCS_FILES | static::IGNORE_DOT_FILES;
@@ -486,8 +483,6 @@ class Finder implements \IteratorAggregate, \Countable
      *
      * This can be slow as all the matching files and directories must be retrieved for comparison.
      *
-     * @param \Closure $closure An anonymous function
-     *
      * @return $this
      *
      * @see SortableIterator
@@ -593,8 +588,6 @@ class Finder implements \IteratorAggregate, \Countable
      * The anonymous function receives a \SplFileInfo and must return false
      * to remove files.
      *
-     * @param \Closure $closure An anonymous function
-     *
      * @return $this
      *
      * @see CustomFilterIterator
@@ -702,7 +695,7 @@ class Finder implements \IteratorAggregate, \Countable
      *
      * @return $this
      *
-     * @throws \InvalidArgumentException When the given argument is not iterable.
+     * @throws \InvalidArgumentException when the given argument is not iterable
      */
     public function append($iterator)
     {
@@ -854,8 +847,6 @@ class Finder implements \IteratorAggregate, \Countable
     }
 
     /**
-     * @param AdapterInterface $adapter
-     *
      * @return AdapterInterface
      */
     private function buildAdapter(AdapterInterface $adapter)
diff --git a/vendor/symfony/finder/Iterator/CustomFilterIterator.php b/vendor/symfony/finder/Iterator/CustomFilterIterator.php
index b43b88d98df79ae0500484e9a65b709efa0b59a4..399b6a9719c0181b05d3820dfc98f4782f3407a1 100644
--- a/vendor/symfony/finder/Iterator/CustomFilterIterator.php
+++ b/vendor/symfony/finder/Iterator/CustomFilterIterator.php
@@ -24,8 +24,6 @@ class CustomFilterIterator extends FilterIterator
     private $filters = array();
 
     /**
-     * Constructor.
-     *
      * @param \Iterator  $iterator The Iterator to filter
      * @param callable[] $filters  An array of PHP callbacks
      *
diff --git a/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php b/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php
index 0f2d48f39ef99bb9fba75d3f1215f119423fad90..b01e5e3f5d8857c4e9a43b7b3afcac9aa6d3ce33 100644
--- a/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php
+++ b/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php
@@ -23,8 +23,6 @@ class DateRangeFilterIterator extends FilterIterator
     private $comparators = array();
 
     /**
-     * Constructor.
-     *
      * @param \Iterator        $iterator    The Iterator to filter
      * @param DateComparator[] $comparators An array of DateComparator instances
      */
diff --git a/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php b/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php
index f78c71ed415cc4a009e26cbca091837f23430a37..ce9d3aa73a13e5da737ff629bc85caa78b38e7a7 100644
--- a/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php
+++ b/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php
@@ -21,8 +21,6 @@ class DepthRangeFilterIterator extends FilterIterator
     private $minDepth = 0;
 
     /**
-     * Constructor.
-     *
      * @param \RecursiveIteratorIterator $iterator The Iterator to filter
      * @param int                        $minDepth The min depth
      * @param int                        $maxDepth The max depth
diff --git a/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php b/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php
index 3f5a5dfeb133cde33d2aa3fe9bc7c9083ae4eb82..c57128c278492d8526539bc1442d4f96aac680c7 100644
--- a/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php
+++ b/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php
@@ -24,8 +24,6 @@ class ExcludeDirectoryFilterIterator extends FilterIterator implements \Recursiv
     private $excludedPattern;
 
     /**
-     * Constructor.
-     *
      * @param \Iterator $iterator    The Iterator to filter
      * @param array     $directories An array of directories to exclude
      */
diff --git a/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php b/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php
index f50fd82c345f49a80f6ab9bccab7d77891798172..e9811d4a03ee6b2a65180fd92eaa9bdab08e3ec7 100644
--- a/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php
+++ b/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php
@@ -24,8 +24,6 @@ class FileTypeFilterIterator extends FilterIterator
     private $mode;
 
     /**
-     * Constructor.
-     *
      * @param \Iterator $iterator The Iterator to filter
      * @param int       $mode     The mode (self::ONLY_FILES or self::ONLY_DIRECTORIES)
      */
diff --git a/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php b/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php
index 162dc1410b9790274ca23fa5ee4adb4fc3369e97..fc8854047e3422953a85fbbdd8a08674f3d0032f 100644
--- a/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php
+++ b/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php
@@ -22,8 +22,6 @@ abstract class MultiplePcreFilterIterator extends FilterIterator
     protected $noMatchRegexps = array();
 
     /**
-     * Constructor.
-     *
      * @param \Iterator $iterator        The Iterator to filter
      * @param array     $matchPatterns   An array of patterns that need to match
      * @param array     $noMatchPatterns An array of patterns that need to not match
diff --git a/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php b/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php
index c87096fc87e237db059daf4b60da9c16862add7b..8b94965ef1566f0051a4f99e2dd30abcd9ac2598 100644
--- a/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php
+++ b/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php
@@ -37,8 +37,6 @@ class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator
     private $directorySeparator = '/';
 
     /**
-     * Constructor.
-     *
      * @param string $path
      * @param int    $flags
      * @param bool   $ignoreUnreadableDirs
diff --git a/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php b/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php
index 3d3140a6ae45abcc1249957819f743bab97f7b0a..bd1a7fb7004819273329563388d9f1eff3306b61 100644
--- a/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php
+++ b/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php
@@ -23,8 +23,6 @@ class SizeRangeFilterIterator extends FilterIterator
     private $comparators = array();
 
     /**
-     * Constructor.
-     *
      * @param \Iterator          $iterator    The Iterator to filter
      * @param NumberComparator[] $comparators An array of NumberComparator instances
      */
diff --git a/vendor/symfony/finder/Iterator/SortableIterator.php b/vendor/symfony/finder/Iterator/SortableIterator.php
index f1134c00b9489ed91af9631df9ef25448eb530d9..c2f54b937652f868c48a66b93068af33fe333f95 100644
--- a/vendor/symfony/finder/Iterator/SortableIterator.php
+++ b/vendor/symfony/finder/Iterator/SortableIterator.php
@@ -28,8 +28,6 @@ class SortableIterator implements \IteratorAggregate
     private $sort;
 
     /**
-     * Constructor.
-     *
      * @param \Traversable $iterator The Iterator to filter
      * @param int|callable $sort     The sort type (SORT_BY_NAME, SORT_BY_TYPE, or a PHP callback)
      *
diff --git a/vendor/symfony/finder/Shell/Command.php b/vendor/symfony/finder/Shell/Command.php
index 455b2613777d7021a162fa801de1dc1ac35ae4ea..67d4b748ec468363eee29e17e750db52815a8bc8 100644
--- a/vendor/symfony/finder/Shell/Command.php
+++ b/vendor/symfony/finder/Shell/Command.php
@@ -20,19 +20,8 @@ namespace Symfony\Component\Finder\Shell;
  */
 class Command
 {
-    /**
-     * @var Command|null
-     */
     private $parent;
-
-    /**
-     * @var array
-     */
     private $bits = array();
-
-    /**
-     * @var array
-     */
     private $labels = array();
 
     /**
@@ -40,11 +29,6 @@ class Command
      */
     private $errorHandler;
 
-    /**
-     * Constructor.
-     *
-     * @param Command|null $parent Parent command
-     */
     public function __construct(Command $parent = null)
     {
         $this->parent = $parent;
@@ -63,8 +47,6 @@ class Command
     /**
      * Creates a new Command instance.
      *
-     * @param Command|null $parent Parent command
-     *
      * @return self
      */
     public static function create(Command $parent = null)
@@ -222,8 +204,6 @@ class Command
     }
 
     /**
-     * @param \Closure $errorHandler
-     *
      * @return $this
      */
     public function setErrorHandler(\Closure $errorHandler)
diff --git a/vendor/symfony/finder/SplFileInfo.php b/vendor/symfony/finder/SplFileInfo.php
index 31a3f86a674d55d033b648dfcb1f515a1ea3361b..19f95e26be69a663a9b1465861f522d62890e09d 100644
--- a/vendor/symfony/finder/SplFileInfo.php
+++ b/vendor/symfony/finder/SplFileInfo.php
@@ -22,8 +22,6 @@ class SplFileInfo extends \SplFileInfo
     private $relativePathname;
 
     /**
-     * Constructor.
-     *
      * @param string $file             The file name
      * @param string $relativePath     The relative path
      * @param string $relativePathname The relative path name
diff --git a/vendor/symfony/finder/Tests/Iterator/MockSplFileInfo.php b/vendor/symfony/finder/Tests/Iterator/MockSplFileInfo.php
index d03a9ac78e2518dd1c7eff28e1fd477b64968fc5..cfe31c90f7414b05310a01a231ad02a37ddc81aa 100644
--- a/vendor/symfony/finder/Tests/Iterator/MockSplFileInfo.php
+++ b/vendor/symfony/finder/Tests/Iterator/MockSplFileInfo.php
@@ -13,9 +13,9 @@ namespace Symfony\Component\Finder\Tests\Iterator;
 
 class MockSplFileInfo extends \SplFileInfo
 {
-    const   TYPE_DIRECTORY = 1;
-    const   TYPE_FILE = 2;
-    const   TYPE_UNKNOWN = 3;
+    const TYPE_DIRECTORY = 1;
+    const TYPE_FILE = 2;
+    const TYPE_UNKNOWN = 3;
 
     private $contents = null;
     private $mode = null;
diff --git a/vendor/symfony/finder/Tests/Iterator/SortableIteratorTest.php b/vendor/symfony/finder/Tests/Iterator/SortableIteratorTest.php
index 4750f250d736c67b4c3929795d5daac4541ab7de..444654a28fb61fbbb9fe70cec8726ff962500d7c 100644
--- a/vendor/symfony/finder/Tests/Iterator/SortableIteratorTest.php
+++ b/vendor/symfony/finder/Tests/Iterator/SortableIteratorTest.php
@@ -58,9 +58,9 @@ class SortableIteratorTest extends RealIteratorTestCase
 
         $iterator = new SortableIterator($inner, $mode);
 
-        if ($mode === SortableIterator::SORT_BY_ACCESSED_TIME
-            || $mode === SortableIterator::SORT_BY_CHANGED_TIME
-            || $mode === SortableIterator::SORT_BY_MODIFIED_TIME
+        if (SortableIterator::SORT_BY_ACCESSED_TIME === $mode
+            || SortableIterator::SORT_BY_CHANGED_TIME === $mode
+            || SortableIterator::SORT_BY_MODIFIED_TIME === $mode
         ) {
             if ('\\' === DIRECTORY_SEPARATOR && SortableIterator::SORT_BY_MODIFIED_TIME !== $mode) {
                 $this->markTestSkipped('Sorting by atime or ctime is not supported on Windows');
diff --git a/vendor/symfony/polyfill-mbstring/composer.json b/vendor/symfony/polyfill-mbstring/composer.json
index 48fc3ddf3ad431c1322043032ea2e90afb771a61..5946b5d8230cf6a62587006611f01f61f8553b42 100644
--- a/vendor/symfony/polyfill-mbstring/composer.json
+++ b/vendor/symfony/polyfill-mbstring/composer.json
@@ -28,7 +28,7 @@
     "minimum-stability": "dev",
     "extra": {
         "branch-alias": {
-            "dev-master": "1.4-dev"
+            "dev-master": "1.6-dev"
         }
     }
 }
diff --git a/vendor/symfony/process/Exception/ProcessTimedOutException.php b/vendor/symfony/process/Exception/ProcessTimedOutException.php
index d45114696f640d9a05a4eea92ce1fa1b203d2a4a..fef4a8ae867b85c5b4728af1098891bcc00ef5a6 100644
--- a/vendor/symfony/process/Exception/ProcessTimedOutException.php
+++ b/vendor/symfony/process/Exception/ProcessTimedOutException.php
@@ -45,12 +45,12 @@ class ProcessTimedOutException extends RuntimeException
 
     public function isGeneralTimeout()
     {
-        return $this->timeoutType === self::TYPE_GENERAL;
+        return self::TYPE_GENERAL === $this->timeoutType;
     }
 
     public function isIdleTimeout()
     {
-        return $this->timeoutType === self::TYPE_IDLE;
+        return self::TYPE_IDLE === $this->timeoutType;
     }
 
     public function getExceededTimeout()
diff --git a/vendor/symfony/process/ExecutableFinder.php b/vendor/symfony/process/ExecutableFinder.php
index d8e689622a537ebf3a386f7b005745629b6392f2..d042a5b13a2112aa841b5292830dd00745ecc147 100644
--- a/vendor/symfony/process/ExecutableFinder.php
+++ b/vendor/symfony/process/ExecutableFinder.php
@@ -23,8 +23,6 @@ class ExecutableFinder
 
     /**
      * Replaces default suffixes of executable.
-     *
-     * @param array $suffixes
      */
     public function setSuffixes(array $suffixes)
     {
diff --git a/vendor/symfony/process/PhpProcess.php b/vendor/symfony/process/PhpProcess.php
index 42ecb66f2bd4d1d50be9300325ee34f70a8c9d33..3ecde89749cc203c95fde2b254128e41ed55ed81 100644
--- a/vendor/symfony/process/PhpProcess.php
+++ b/vendor/symfony/process/PhpProcess.php
@@ -25,8 +25,6 @@ use Symfony\Component\Process\Exception\RuntimeException;
 class PhpProcess extends Process
 {
     /**
-     * Constructor.
-     *
      * @param string      $script  The PHP script to run (as a string)
      * @param string|null $cwd     The working directory or null to use the working dir of the current PHP process
      * @param array|null  $env     The environment variables or null to use the same environment as the current PHP process
diff --git a/vendor/symfony/process/Pipes/AbstractPipes.php b/vendor/symfony/process/Pipes/AbstractPipes.php
index 1a94755bd71c1c74d6481acb087abb60f18fc20a..d46a861388c9c632d649743e6148bb22f56ab7a5 100644
--- a/vendor/symfony/process/Pipes/AbstractPipes.php
+++ b/vendor/symfony/process/Pipes/AbstractPipes.php
@@ -18,16 +18,15 @@ namespace Symfony\Component\Process\Pipes;
  */
 abstract class AbstractPipes implements PipesInterface
 {
-    /** @var array */
     public $pipes = array();
 
-    /** @var string */
     private $inputBuffer = '';
-    /** @var resource|null */
     private $input;
-    /** @var bool */
     private $blocked = true;
 
+    /**
+     * @param resource|null $input
+     */
     public function __construct($input)
     {
         if (is_resource($input)) {
diff --git a/vendor/symfony/process/Pipes/UnixPipes.php b/vendor/symfony/process/Pipes/UnixPipes.php
index c4babcdf5c92c813258c429c299e486bc72f295a..b5b88358a40c6e9c0960a6510e31f4177b1b2487 100644
--- a/vendor/symfony/process/Pipes/UnixPipes.php
+++ b/vendor/symfony/process/Pipes/UnixPipes.php
@@ -22,11 +22,8 @@ use Symfony\Component\Process\Process;
  */
 class UnixPipes extends AbstractPipes
 {
-    /** @var bool */
     private $ttyMode;
-    /** @var bool */
     private $ptyMode;
-    /** @var bool */
     private $disableOutput;
 
     public function __construct($ttyMode, $ptyMode, $input, $disableOutput)
diff --git a/vendor/symfony/process/Pipes/WindowsPipes.php b/vendor/symfony/process/Pipes/WindowsPipes.php
index 87a781ea9204accb369313b4594e15ec2f1807e0..bcf1329f434ec30dab08d21e31b229292424e79c 100644
--- a/vendor/symfony/process/Pipes/WindowsPipes.php
+++ b/vendor/symfony/process/Pipes/WindowsPipes.php
@@ -26,16 +26,12 @@ use Symfony\Component\Process\Exception\RuntimeException;
  */
 class WindowsPipes extends AbstractPipes
 {
-    /** @var array */
     private $files = array();
-    /** @var array */
     private $fileHandles = array();
-    /** @var array */
     private $readBytes = array(
         Process::STDOUT => 0,
         Process::STDERR => 0,
     );
-    /** @var bool */
     private $disableOutput;
 
     public function __construct($disableOutput, $input)
diff --git a/vendor/symfony/process/Process.php b/vendor/symfony/process/Process.php
index 96a93343f1d5d17047add2f60fa04ecf204e9393..05f7ecf833eac836609a5c2fc5f87a4549c2239c 100644
--- a/vendor/symfony/process/Process.php
+++ b/vendor/symfony/process/Process.php
@@ -80,8 +80,6 @@ class Process
      * Exit codes translation table.
      *
      * User-defined errors must use exit codes in the 64-113 range.
-     *
-     * @var array
      */
     public static $exitCodes = array(
         0 => 'OK',
@@ -127,8 +125,6 @@ class Process
     );
 
     /**
-     * Constructor.
-     *
      * @param string         $commandline The command line to run
      * @param string|null    $cwd         The working directory or null to use the working dir of the current PHP process
      * @param array|null     $env         The environment variables or null to use the same environment as the current PHP process
@@ -713,7 +709,7 @@ class Process
      */
     public function isStarted()
     {
-        return $this->status != self::STATUS_READY;
+        return self::STATUS_READY != $this->status;
     }
 
     /**
@@ -725,7 +721,7 @@ class Process
     {
         $this->updateStatus(false);
 
-        return $this->status == self::STATUS_TERMINATED;
+        return self::STATUS_TERMINATED == $this->status;
     }
 
     /**
@@ -1187,7 +1183,7 @@ class Process
      */
     public function checkTimeout()
     {
-        if ($this->status !== self::STATUS_STARTED) {
+        if (self::STATUS_STARTED !== $this->status) {
             return;
         }
 
@@ -1318,7 +1314,7 @@ class Process
     /**
      * Reads pipes for the freshest output.
      *
-     * @param $caller The name of the method that needs fresh outputs
+     * @param string $caller The name of the method that needs fresh outputs
      *
      * @throws LogicException in case output has been disabled or process is not started
      */
@@ -1368,7 +1364,7 @@ class Process
         $callback = $this->callback;
         foreach ($result as $type => $data) {
             if (3 !== $type) {
-                $callback($type === self::STDOUT ? self::OUT : self::ERR, $data);
+                $callback(self::STDOUT === $type ? self::OUT : self::ERR, $data);
             } elseif (!isset($this->fallbackStatus['signaled'])) {
                 $this->fallbackStatus['exitcode'] = (int) $data;
             }
@@ -1487,7 +1483,7 @@ class Process
      *
      * @param string $functionName The function name that was called
      *
-     * @throws LogicException If the process has not run.
+     * @throws LogicException if the process has not run
      */
     private function requireProcessIsStarted($functionName)
     {
@@ -1501,7 +1497,7 @@ class Process
      *
      * @param string $functionName The function name that was called
      *
-     * @throws LogicException If the process is not yet terminated.
+     * @throws LogicException if the process is not yet terminated
      */
     private function requireProcessIsTerminated($functionName)
     {
diff --git a/vendor/symfony/process/ProcessBuilder.php b/vendor/symfony/process/ProcessBuilder.php
index 54877a8282813c8f2595e564cc55ff20d799c660..3d90f1a5d6d71b273c1c84dd0f0a0e2e3451e4a4 100644
--- a/vendor/symfony/process/ProcessBuilder.php
+++ b/vendor/symfony/process/ProcessBuilder.php
@@ -15,8 +15,6 @@ use Symfony\Component\Process\Exception\InvalidArgumentException;
 use Symfony\Component\Process\Exception\LogicException;
 
 /**
- * Process builder.
- *
  * @author Kris Wallsmith <kris@symfony.com>
  */
 class ProcessBuilder
@@ -32,8 +30,6 @@ class ProcessBuilder
     private $outputDisabled = false;
 
     /**
-     * Constructor.
-     *
      * @param string[] $arguments An array of arguments
      */
     public function __construct(array $arguments = array())
diff --git a/vendor/symfony/process/Tests/ProcessTest.php b/vendor/symfony/process/Tests/ProcessTest.php
index 4cb3b03f898a518726d82f5742aa6165cf42e630..3240aa7954d309ec6e39686ea38e8edb802cb1b8 100644
--- a/vendor/symfony/process/Tests/ProcessTest.php
+++ b/vendor/symfony/process/Tests/ProcessTest.php
@@ -336,7 +336,7 @@ class ProcessTest extends TestCase
 
         $called = false;
         $p->run(function ($type, $buffer) use (&$called) {
-            $called = $buffer === 'foo';
+            $called = 'foo' === $buffer;
         });
 
         $this->assertTrue($called, 'The callback should be executed with the output');
diff --git a/vendor/symfony/stopwatch/Section.php b/vendor/symfony/stopwatch/Section.php
index 2337e03140c7f28234a9040f2cac87f3c271e43f..fe658a57e66453f6b1e20255acbb9c9ce0f592b8 100644
--- a/vendor/symfony/stopwatch/Section.php
+++ b/vendor/symfony/stopwatch/Section.php
@@ -39,8 +39,6 @@ class Section
     private $children = array();
 
     /**
-     * Constructor.
-     *
      * @param float|null $origin Set the origin of the events in this section, use null to set their origin to their start time
      */
     public function __construct($origin = null)
@@ -67,7 +65,7 @@ class Section
     /**
      * Creates or re-opens a child section.
      *
-     * @param string|null $id null to create a new section, the identifier to re-open an existing one
+     * @param string|null $id Null to create a new section, the identifier to re-open an existing one
      *
      * @return self
      */
diff --git a/vendor/symfony/stopwatch/Stopwatch.php b/vendor/symfony/stopwatch/Stopwatch.php
index 8ad93165bfd74d9aaaa482fe27a8eaa9435155f0..6663632bdc88cdfdd0fc770a30119b4b3dd0603d 100644
--- a/vendor/symfony/stopwatch/Stopwatch.php
+++ b/vendor/symfony/stopwatch/Stopwatch.php
@@ -30,7 +30,7 @@ class Stopwatch
 
     public function __construct()
     {
-        $this->sections = $this->activeSections = array('__root__' => new Section('__root__'));
+        $this->sections = $this->activeSections = array('__root__' => new Section(null));
     }
 
     /**
diff --git a/vendor/symfony/stopwatch/StopwatchEvent.php b/vendor/symfony/stopwatch/StopwatchEvent.php
index 16a30db2aa50ee6114321edb458370fbf9be5f80..5fdd62e6e0b1f2578ade8594ae97c1635ba107e4 100644
--- a/vendor/symfony/stopwatch/StopwatchEvent.php
+++ b/vendor/symfony/stopwatch/StopwatchEvent.php
@@ -39,8 +39,6 @@ class StopwatchEvent
     private $started = array();
 
     /**
-     * Constructor.
-     *
      * @param float       $origin   The origin time in milliseconds
      * @param string|null $category The event category or null to use the default
      *
diff --git a/vendor/symfony/stopwatch/StopwatchPeriod.php b/vendor/symfony/stopwatch/StopwatchPeriod.php
index 9876f179aadb6f79dd0601e5f147710ac8e25975..c14610304f1c6109f24ed3807202128da9a37f43 100644
--- a/vendor/symfony/stopwatch/StopwatchPeriod.php
+++ b/vendor/symfony/stopwatch/StopwatchPeriod.php
@@ -23,8 +23,6 @@ class StopwatchPeriod
     private $memory;
 
     /**
-     * Constructor.
-     *
      * @param int $start The relative time of the start of the period (in milliseconds)
      * @param int $end   The relative time of the end of the period (in milliseconds)
      */
diff --git a/vendor/symfony/validator/Constraint.php b/vendor/symfony/validator/Constraint.php
index fc5288d13bee7f2ec053720d91ee323db853b5b5..faaa5fb4bcc5b011d142d468e1a768ccc512a449 100644
--- a/vendor/symfony/validator/Constraint.php
+++ b/vendor/symfony/validator/Constraint.php
@@ -33,29 +33,21 @@ abstract class Constraint
 {
     /**
      * The name of the group given to all constraints with no explicit group.
-     *
-     * @var string
      */
     const DEFAULT_GROUP = 'Default';
 
     /**
      * Marks a constraint that can be put onto classes.
-     *
-     * @var string
      */
     const CLASS_CONSTRAINT = 'class';
 
     /**
      * Marks a constraint that can be put onto properties.
-     *
-     * @var string
      */
     const PROPERTY_CONSTRAINT = 'property';
 
     /**
      * Maps error codes to the names of their constants.
-     *
-     * @var array
      */
     protected static $errorNames = array();
 
@@ -141,7 +133,7 @@ abstract class Constraint
                     $invalidOptions[] = $option;
                 }
             }
-        } elseif (null !== $options && !(is_array($options) && count($options) === 0)) {
+        } elseif (null !== $options && !(is_array($options) && 0 === count($options))) {
             $option = $this->getDefaultOption();
 
             if (null === $option) {
@@ -209,7 +201,7 @@ abstract class Constraint
      *
      * @throws InvalidOptionsException If an invalid option name is given
      *
-     * @internal This method should not be used or overwritten in userland code.
+     * @internal this method should not be used or overwritten in userland code
      */
     public function __get($option)
     {
diff --git a/vendor/symfony/validator/ConstraintValidator.php b/vendor/symfony/validator/ConstraintValidator.php
index 804a9b2a193ec444b63494a52f39ebf7e6506104..c060e91723fd74d945ebb8cf1d1786eb6d3d3f1f 100644
--- a/vendor/symfony/validator/ConstraintValidator.php
+++ b/vendor/symfony/validator/ConstraintValidator.php
@@ -25,15 +25,11 @@ abstract class ConstraintValidator implements ConstraintValidatorInterface
     /**
      * Whether to format {@link \DateTime} objects as RFC-3339 dates
      * ("Y-m-d H:i:s").
-     *
-     * @var int
      */
     const PRETTY_DATE = 1;
 
     /**
      * Whether to cast objects with a "__toString()" method to strings.
-     *
-     * @var int
      */
     const OBJECT_TO_STRING = 2;
 
diff --git a/vendor/symfony/validator/ConstraintValidatorFactoryInterface.php b/vendor/symfony/validator/ConstraintValidatorFactoryInterface.php
index 5e216275b493382d0df0bb04d60625bbb26cdcce..b64764562189956081c45250a865f4c020497701 100644
--- a/vendor/symfony/validator/ConstraintValidatorFactoryInterface.php
+++ b/vendor/symfony/validator/ConstraintValidatorFactoryInterface.php
@@ -21,8 +21,6 @@ interface ConstraintValidatorFactoryInterface
      * Given a Constraint, this returns the ConstraintValidatorInterface
      * object that should be used to verify its validity.
      *
-     * @param Constraint $constraint The source constraint
-     *
      * @return ConstraintValidatorInterface
      */
     public function getInstance(Constraint $constraint);
diff --git a/vendor/symfony/validator/ConstraintViolation.php b/vendor/symfony/validator/ConstraintViolation.php
index 516004a7c169b26c363bc8576c351223bf684abb..804b6a8ccfaeb79085d3bd1130ff09120ef95d4e 100644
--- a/vendor/symfony/validator/ConstraintViolation.php
+++ b/vendor/symfony/validator/ConstraintViolation.php
@@ -18,54 +18,15 @@ namespace Symfony\Component\Validator;
  */
 class ConstraintViolation implements ConstraintViolationInterface
 {
-    /**
-     * @var string
-     */
     private $message;
-
-    /**
-     * @var string
-     */
     private $messageTemplate;
-
-    /**
-     * @var array
-     */
     private $parameters;
-
-    /**
-     * @var int|null
-     */
     private $plural;
-
-    /**
-     * @var mixed
-     */
     private $root;
-
-    /**
-     * @var string
-     */
     private $propertyPath;
-
-    /**
-     * @var mixed
-     */
     private $invalidValue;
-
-    /**
-     * @var Constraint|null
-     */
     private $constraint;
-
-    /**
-     * @var mixed
-     */
     private $code;
-
-    /**
-     * @var mixed
-     */
     private $cause;
 
     /**
diff --git a/vendor/symfony/validator/ConstraintViolationInterface.php b/vendor/symfony/validator/ConstraintViolationInterface.php
index 11028fe0ab1aa0a4ca1a87fb740f7dafb6893675..9889b92fe31b6a45e12b7eee8500ab82b1b97056 100644
--- a/vendor/symfony/validator/ConstraintViolationInterface.php
+++ b/vendor/symfony/validator/ConstraintViolationInterface.php
@@ -56,8 +56,8 @@ interface ConstraintViolationInterface
     /**
      * Returns the parameters to be inserted into the raw violation message.
      *
-     * @return array A possibly empty list of parameters indexed by the names
-     *               that appear in the message template.
+     * @return array a possibly empty list of parameters indexed by the names
+     *               that appear in the message template
      *
      * @see getMessageTemplate()
      * @deprecated since version 2.7, to be replaced by getParameters() in 3.0.
@@ -111,8 +111,8 @@ interface ConstraintViolationInterface
     /**
      * Returns the value that caused the violation.
      *
-     * @return mixed The invalid value that caused the validated constraint to
-     *               fail.
+     * @return mixed the invalid value that caused the validated constraint to
+     *               fail
      */
     public function getInvalidValue();
 
diff --git a/vendor/symfony/validator/ConstraintViolationListInterface.php b/vendor/symfony/validator/ConstraintViolationListInterface.php
index d96755c9a277e60e7b523fecf3e869d440804190..0489ab500a1dc71c315b2931e0d3c94794748162 100644
--- a/vendor/symfony/validator/ConstraintViolationListInterface.php
+++ b/vendor/symfony/validator/ConstraintViolationListInterface.php
@@ -20,15 +20,11 @@ interface ConstraintViolationListInterface extends \Traversable, \Countable, \Ar
 {
     /**
      * Adds a constraint violation to this list.
-     *
-     * @param ConstraintViolationInterface $violation The violation to add
      */
     public function add(ConstraintViolationInterface $violation);
 
     /**
      * Merges an existing violation list into this list.
-     *
-     * @param ConstraintViolationListInterface $otherList The list to merge
      */
     public function addAll(ConstraintViolationListInterface $otherList);
 
@@ -39,7 +35,7 @@ interface ConstraintViolationListInterface extends \Traversable, \Countable, \Ar
      *
      * @return ConstraintViolationInterface The violation
      *
-     * @throws \OutOfBoundsException If the offset does not exist.
+     * @throws \OutOfBoundsException if the offset does not exist
      */
     public function get($offset);
 
diff --git a/vendor/symfony/validator/Constraints/AbstractComparisonValidator.php b/vendor/symfony/validator/Constraints/AbstractComparisonValidator.php
index ca0c3aa71d45f0824fc0d52a66603073c6c058ad..87e8a5f3ff46b02bb3886b7093a554f4c34252a7 100644
--- a/vendor/symfony/validator/Constraints/AbstractComparisonValidator.php
+++ b/vendor/symfony/validator/Constraints/AbstractComparisonValidator.php
@@ -47,7 +47,7 @@ abstract class AbstractComparisonValidator extends ConstraintValidator
             if ($value instanceof \DateTimeImmutable) {
                 // If $value is immutable, convert the compared value to a
                 // DateTimeImmutable too
-                $comparedValue = new \DatetimeImmutable($comparedValue);
+                $comparedValue = new \DateTimeImmutable($comparedValue);
             } elseif ($value instanceof \DateTime || $value instanceof \DateTimeInterface) {
                 // Otherwise use DateTime
                 $comparedValue = new \DateTime($comparedValue);
diff --git a/vendor/symfony/validator/Constraints/ChoiceValidator.php b/vendor/symfony/validator/Constraints/ChoiceValidator.php
index 83cfc6e77887ae867bece2d493077913963db7ce..c1b11599d024d49bee1f683536db01f228f96bb6 100644
--- a/vendor/symfony/validator/Constraints/ChoiceValidator.php
+++ b/vendor/symfony/validator/Constraints/ChoiceValidator.php
@@ -81,7 +81,7 @@ class ChoiceValidator extends ConstraintValidator
 
             $count = count($value);
 
-            if ($constraint->min !== null && $count < $constraint->min) {
+            if (null !== $constraint->min && $count < $constraint->min) {
                 if ($this->context instanceof ExecutionContextInterface) {
                     $this->context->buildViolation($constraint->minMessage)
                         ->setParameter('{{ limit }}', $constraint->min)
@@ -99,7 +99,7 @@ class ChoiceValidator extends ConstraintValidator
                 return;
             }
 
-            if ($constraint->max !== null && $count > $constraint->max) {
+            if (null !== $constraint->max && $count > $constraint->max) {
                 if ($this->context instanceof ExecutionContextInterface) {
                     $this->context->buildViolation($constraint->maxMessage)
                         ->setParameter('{{ limit }}', $constraint->max)
diff --git a/vendor/symfony/validator/Constraints/Collection.php b/vendor/symfony/validator/Constraints/Collection.php
index ac1edd3b5927229f138312de866debd892163688..9cb2063042faeac3d5dce2fcbb7b6a6c6a2fb2ba 100644
--- a/vendor/symfony/validator/Constraints/Collection.php
+++ b/vendor/symfony/validator/Constraints/Collection.php
@@ -63,7 +63,7 @@ class Collection extends Composite
         foreach ($this->fields as $fieldName => $field) {
             // the XmlFileLoader and YamlFileLoader pass the field Optional
             // and Required constraint as an array with exactly one element
-            if (is_array($field) && count($field) == 1) {
+            if (is_array($field) && 1 == count($field)) {
                 $this->fields[$fieldName] = $field = $field[0];
             }
 
diff --git a/vendor/symfony/validator/Constraints/EmailValidator.php b/vendor/symfony/validator/Constraints/EmailValidator.php
index cdd162d816f98d9095f0616000c50e021191399c..4063c83ffe2e029b3693a3a3ba7600ff2d2c3b79 100644
--- a/vendor/symfony/validator/Constraints/EmailValidator.php
+++ b/vendor/symfony/validator/Constraints/EmailValidator.php
@@ -22,11 +22,11 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException;
  */
 class EmailValidator extends ConstraintValidator
 {
-    /**
-     * @var bool
-     */
     private $isStrict;
 
+    /**
+     * @param bool $strict
+     */
     public function __construct($strict = false)
     {
         $this->isStrict = $strict;
diff --git a/vendor/symfony/validator/Constraints/ExpressionValidator.php b/vendor/symfony/validator/Constraints/ExpressionValidator.php
index 8cc289bb6b819cd9417973b69844c69094c0258a..45b3b7b7e786d790c008f0248cb1a7105443857f 100644
--- a/vendor/symfony/validator/Constraints/ExpressionValidator.php
+++ b/vendor/symfony/validator/Constraints/ExpressionValidator.php
@@ -27,14 +27,7 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException;
  */
 class ExpressionValidator extends ConstraintValidator
 {
-    /**
-     * @var PropertyAccessorInterface
-     */
     private $propertyAccessor;
-
-    /**
-     * @var ExpressionLanguage
-     */
     private $expressionLanguage;
 
     public function __construct(PropertyAccessorInterface $propertyAccessor = null, ExpressionLanguage $expressionLanguage = null)
diff --git a/vendor/symfony/validator/Constraints/File.php b/vendor/symfony/validator/Constraints/File.php
index 341fbaf4407757920e9af04f33e32c3845d19fae..c00ece3e3d221eeb7346bd92cbfb52d727d641bb 100644
--- a/vendor/symfony/validator/Constraints/File.php
+++ b/vendor/symfony/validator/Constraints/File.php
@@ -18,6 +18,8 @@ use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
  * @Annotation
  * @Target({"PROPERTY", "METHOD", "ANNOTATION"})
  *
+ * @property int $maxSize
+ *
  * @author Bernhard Schussek <bschussek@gmail.com>
  */
 class File extends Constraint
@@ -86,6 +88,15 @@ class File extends Constraint
         return parent::__get($option);
     }
 
+    public function __isset($option)
+    {
+        if ('maxSize' === $option) {
+            return true;
+        }
+
+        return parent::__isset($option);
+    }
+
     private function normalizeBinaryFormat($maxSize)
     {
         $sizeInt = (int) $maxSize;
diff --git a/vendor/symfony/validator/Constraints/IbanValidator.php b/vendor/symfony/validator/Constraints/IbanValidator.php
index ae4eb112b744cb7728ae61b0778f98441197641b..87b3ad6451d0068715e357e83b361cbcda00517e 100644
--- a/vendor/symfony/validator/Constraints/IbanValidator.php
+++ b/vendor/symfony/validator/Constraints/IbanValidator.php
@@ -34,9 +34,7 @@ class IbanValidator extends ConstraintValidator
      * a BBAN (Basic Bank Account Number) which has a fixed length per country and,
      * included within it, a bank identifier with a fixed position and a fixed length per country
      *
-     * @see http://www.swift.com/dsp/resources/documents/IBAN_Registry.pdf
-     *
-     * @var array
+     * @see https://www.swift.com/sites/default/files/resources/iban_registry.pdf
      */
     private static $formats = array(
         'AD' => 'AD\d{2}\d{4}\d{4}[\dA-Z]{12}', // Andorra
@@ -53,13 +51,14 @@ class IbanValidator extends ConstraintValidator
         'BH' => 'BH\d{2}[A-Z]{4}[\dA-Z]{14}', // Bahrain
         'BI' => 'BI\d{2}\d{12}', // Burundi
         'BJ' => 'BJ\d{2}[A-Z]{1}\d{23}', // Benin
+        'BY' => 'BY\d{2}[\dA-Z]{4}\d{4}[\dA-Z]{16}', // Belarus - https://bank.codes/iban/structure/belarus/
         'BL' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2}', // Saint Barthelemy
         'BR' => 'BR\d{2}\d{8}\d{5}\d{10}[A-Z][\dA-Z]', // Brazil
         'CG' => 'CG\d{2}\d{23}', // Congo
         'CH' => 'CH\d{2}\d{5}[\dA-Z]{12}', // Switzerland
         'CI' => 'CI\d{2}[A-Z]{1}\d{23}', // Ivory Coast
         'CM' => 'CM\d{2}\d{23}', // Cameron
-        'CR' => 'CR\d{2}\d{3}\d{14}', // Costa Rica
+        'CR' => 'CR\d{2}0\d{3}\d{14}', // Costa Rica
         'CV' => 'CV\d{2}\d{21}', // Cape Verde
         'CY' => 'CY\d{2}\d{3}\d{5}[\dA-Z]{16}', // Cyprus
         'CZ' => 'CZ\d{2}\d{20}', // Czech Republic
@@ -130,7 +129,7 @@ class IbanValidator extends ConstraintValidator
         'TL' => 'TL\d{2}\d{3}\d{14}\d{2}', // Timor-Leste
         'TN' => 'TN59\d{2}\d{3}\d{13}\d{2}', // Tunisia
         'TR' => 'TR\d{2}\d{5}[\dA-Z]{1}[\dA-Z]{16}', // Turkey
-        'UA' => 'UA\d{2}[A-Z]{6}[\dA-Z]{19}', // Ukraine
+        'UA' => 'UA\d{2}\d{6}[\dA-Z]{19}', // Ukraine
         'VG' => 'VG\d{2}[A-Z]{4}\d{16}', // Virgin Islands, British
         'WF' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2}', // Wallis and Futuna Islands
         'XK' => 'XK\d{2}\d{4}\d{10}\d{2}', // Republic of Kosovo
diff --git a/vendor/symfony/validator/Constraints/ImageValidator.php b/vendor/symfony/validator/Constraints/ImageValidator.php
index a5165e25532cdb42bd2852e2f187f1cb66294fa5..4ff9e00c2f9bece5c6a1e6a91ae95a787568c56e 100644
--- a/vendor/symfony/validator/Constraints/ImageValidator.php
+++ b/vendor/symfony/validator/Constraints/ImageValidator.php
@@ -53,7 +53,7 @@ class ImageValidator extends FileValidator
 
         $size = @getimagesize($value);
 
-        if (empty($size) || ($size[0] === 0) || ($size[1] === 0)) {
+        if (empty($size) || (0 === $size[0]) || (0 === $size[1])) {
             if ($this->context instanceof ExecutionContextInterface) {
                 $this->context->buildViolation($constraint->sizeNotDetectedMessage)
                     ->setCode(Image::SIZE_NOT_DETECTED_ERROR)
diff --git a/vendor/symfony/validator/Constraints/TypeValidator.php b/vendor/symfony/validator/Constraints/TypeValidator.php
index 48f7e28a02e8317912a1855b2cf32d0cc77cb4cc..1a2276e464e1fbfb08e863894462c9a8ab430cbe 100644
--- a/vendor/symfony/validator/Constraints/TypeValidator.php
+++ b/vendor/symfony/validator/Constraints/TypeValidator.php
@@ -35,7 +35,7 @@ class TypeValidator extends ConstraintValidator
         }
 
         $type = strtolower($constraint->type);
-        $type = $type == 'boolean' ? 'bool' : $constraint->type;
+        $type = 'boolean' == $type ? 'bool' : $constraint->type;
         $isFunction = 'is_'.$type;
         $ctypeFunction = 'ctype_'.$type;
 
diff --git a/vendor/symfony/validator/Constraints/UrlValidator.php b/vendor/symfony/validator/Constraints/UrlValidator.php
index ded371b04aa1a7f01ffc3b508b7046bf681d6034..d1fa53c59ef54263d5d3c4edb9aa1b5097cbc495 100644
--- a/vendor/symfony/validator/Constraints/UrlValidator.php
+++ b/vendor/symfony/validator/Constraints/UrlValidator.php
@@ -23,7 +23,7 @@ class UrlValidator extends ConstraintValidator
 {
     const PATTERN = '~^
             (%s)://                                 # protocol
-            (([\pL\pN-]+:)?([\pL\pN-]+)@)?          # basic auth
+            (([\.\pL\pN-]+:)?([\.\pL\pN-]+)@)?      # basic auth
             (
                 ([\pL\pN\pS-\.])+(\.?([\pL\pN]|xn\-\-[\pL\pN-]+)+\.?) # a domain name
                     |                                                 # or
diff --git a/vendor/symfony/validator/Constraints/UuidValidator.php b/vendor/symfony/validator/Constraints/UuidValidator.php
index 4d4e15f3031e7a74dd5ad7351f933ad4ebfdc8e1..048f5f98df983f0b1a7e39a498fbbb83921a1ee2 100644
--- a/vendor/symfony/validator/Constraints/UuidValidator.php
+++ b/vendor/symfony/validator/Constraints/UuidValidator.php
@@ -18,13 +18,19 @@ use Symfony\Component\Validator\Constraints\Deprecated\UuidValidator as Deprecat
 use Symfony\Component\Validator\Exception\UnexpectedTypeException;
 
 /**
- * Validates whether the value is a valid UUID per RFC 4122.
+ * Validates whether the value is a valid UUID (also known as GUID).
+ *
+ * Strict validation will allow a UUID as specified per RFC 4122.
+ * Loose validation will allow any type of UUID.
+ *
+ * For better compatibility, both loose and strict, you should consider using a specialized UUID library like "ramsey/uuid" instead.
  *
  * @author Colin O'Dell <colinodell@gmail.com>
  * @author Bernhard Schussek <bschussek@gmail.com>
  *
  * @see http://tools.ietf.org/html/rfc4122
  * @see https://en.wikipedia.org/wiki/Universally_unique_identifier
+ * @see https://github.com/ramsey/uuid
  */
 class UuidValidator extends ConstraintValidator
 {
@@ -327,7 +333,7 @@ class UuidValidator extends ConstraintValidator
         //   0b10xx
         // & 0b1100 (12)
         // = 0b1000 (8)
-        if ((hexdec($value[self::STRICT_VARIANT_POSITION]) & 12) !== 8) {
+        if (8 !== (hexdec($value[self::STRICT_VARIANT_POSITION]) & 12)) {
             if ($this->context instanceof ExecutionContextInterface) {
                 $this->context->buildViolation($constraint->message)
                     ->setParameter('{{ value }}', $this->formatValue($value))
diff --git a/vendor/symfony/validator/Context/ExecutionContextFactory.php b/vendor/symfony/validator/Context/ExecutionContextFactory.php
index 8182c41f8c1ca82ae8a165ad950d52344e5cb38d..cbd9935443209aa60c3da523112fb9be9ee03c5f 100644
--- a/vendor/symfony/validator/Context/ExecutionContextFactory.php
+++ b/vendor/symfony/validator/Context/ExecutionContextFactory.php
@@ -24,14 +24,7 @@ use Symfony\Component\Validator\Validator\ValidatorInterface;
  */
 class ExecutionContextFactory implements ExecutionContextFactoryInterface
 {
-    /**
-     * @var TranslatorInterface
-     */
     private $translator;
-
-    /**
-     * @var string|null
-     */
     private $translationDomain;
 
     /**
diff --git a/vendor/symfony/validator/Context/LegacyExecutionContext.php b/vendor/symfony/validator/Context/LegacyExecutionContext.php
index 37ca2a1d102b3173330655b0df9b9e0d4c3fad81..3d5181f09a6a00ca216c0ba0d5e27f1727c7c958 100644
--- a/vendor/symfony/validator/Context/LegacyExecutionContext.php
+++ b/vendor/symfony/validator/Context/LegacyExecutionContext.php
@@ -26,9 +26,6 @@ use Symfony\Component\Validator\Validator\ValidatorInterface;
  */
 class LegacyExecutionContext extends ExecutionContext
 {
-    /**
-     * @var MetadataFactoryInterface
-     */
     private $metadataFactory;
 
     /**
diff --git a/vendor/symfony/validator/Context/LegacyExecutionContextFactory.php b/vendor/symfony/validator/Context/LegacyExecutionContextFactory.php
index 757eb72a5bda2d18316edacc061c06bc43f62d62..5c541077bf16950a8c605bab26eb2f8c11a8dc48 100644
--- a/vendor/symfony/validator/Context/LegacyExecutionContextFactory.php
+++ b/vendor/symfony/validator/Context/LegacyExecutionContextFactory.php
@@ -28,19 +28,8 @@ use Symfony\Component\Validator\Validator\ValidatorInterface;
  */
 class LegacyExecutionContextFactory implements ExecutionContextFactoryInterface
 {
-    /**
-     * @var MetadataFactoryInterface
-     */
     private $metadataFactory;
-
-    /**
-     * @var TranslatorInterface
-     */
     private $translator;
-
-    /**
-     * @var string|null
-     */
     private $translationDomain;
 
     /**
diff --git a/vendor/symfony/validator/DefaultTranslator.php b/vendor/symfony/validator/DefaultTranslator.php
index 85853d8d858cea4e9940bf81e5d408acd5fb0be3..15712d0d68e126e88040544aac69b4fb2fe3d83a 100644
--- a/vendor/symfony/validator/DefaultTranslator.php
+++ b/vendor/symfony/validator/DefaultTranslator.php
@@ -129,8 +129,8 @@ class DefaultTranslator implements TranslatorInterface
      *
      * @return string The translated string
      *
-     * @throws InvalidArgumentException If the message id does not have the format
-     *                                  "singular|plural".
+     * @throws InvalidArgumentException if the message id does not have the format
+     *                                  "singular|plural"
      */
     public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null)
     {
diff --git a/vendor/symfony/validator/ExecutionContext.php b/vendor/symfony/validator/ExecutionContext.php
index 52cccb2f68b7dd12706f3a936a1d45f8621ddb99..0603ffb62f937d6da841370e0690853afe3acfd3 100644
--- a/vendor/symfony/validator/ExecutionContext.php
+++ b/vendor/symfony/validator/ExecutionContext.php
@@ -28,39 +28,12 @@ use Symfony\Component\Translation\TranslatorInterface;
  */
 class ExecutionContext implements ExecutionContextInterface
 {
-    /**
-     * @var GlobalExecutionContextInterface
-     */
     private $globalContext;
-
-    /**
-     * @var TranslatorInterface
-     */
     private $translator;
-
-    /**
-     * @var null|string
-     */
     private $translationDomain;
-
-    /**
-     * @var MetadataInterface
-     */
     private $metadata;
-
-    /**
-     * @var mixed
-     */
     private $value;
-
-    /**
-     * @var string
-     */
     private $group;
-
-    /**
-     * @var string
-     */
     private $propertyPath;
 
     /**
diff --git a/vendor/symfony/validator/ExecutionContextInterface.php b/vendor/symfony/validator/ExecutionContextInterface.php
index 075fecb0c520a81b12bff16b4414b84c7e732705..2f352fa6809dcf66754c2fae3503a5b3df1ff774 100644
--- a/vendor/symfony/validator/ExecutionContextInterface.php
+++ b/vendor/symfony/validator/ExecutionContextInterface.php
@@ -151,9 +151,9 @@ interface ExecutionContextInterface
      *                                       groups here, the current group of the context
      *                                       will be used.
      * @param bool                 $traverse Whether to traverse the value if it is an array
-     *                                       or an instance of <tt>\Traversable</tt>.
+     *                                       or an instance of <tt>\Traversable</tt>
      * @param bool                 $deep     Whether to traverse the value recursively if
-     *                                       it is a collection of collections.
+     *                                       it is a collection of collections
      *
      * @deprecated since version 2.5, to be removed in 3.0.
      *             Use {@link Context\ExecutionContextInterface::getValidator()}
@@ -237,8 +237,8 @@ interface ExecutionContextInterface
      * has been called with a plain value and constraint, this method returns
      * null.
      *
-     * @return MetadataInterface|null The metadata of the currently validated
-     *                                value.
+     * @return MetadataInterface|null the metadata of the currently validated
+     *                                value
      */
     public function getMetadata();
 
diff --git a/vendor/symfony/validator/Mapping/Cache/CacheInterface.php b/vendor/symfony/validator/Mapping/Cache/CacheInterface.php
index e8047c60ca8bc72c73069e62b3c8dcdd71e6e414..f770f4615407760f3e3e5ac667a04dcf34981bf9 100644
--- a/vendor/symfony/validator/Mapping/Cache/CacheInterface.php
+++ b/vendor/symfony/validator/Mapping/Cache/CacheInterface.php
@@ -38,8 +38,6 @@ interface CacheInterface
 
     /**
      * Stores a class metadata in the cache.
-     *
-     * @param ClassMetadata $metadata A Class Metadata
      */
     public function write(ClassMetadata $metadata);
 }
diff --git a/vendor/symfony/validator/Mapping/Cache/DoctrineCache.php b/vendor/symfony/validator/Mapping/Cache/DoctrineCache.php
index 6dd5447fedc88a98d44b935ac99ee278bc4464cd..36f1febc5ac6718d4d90721d5e661e8db7a00f90 100644
--- a/vendor/symfony/validator/Mapping/Cache/DoctrineCache.php
+++ b/vendor/symfony/validator/Mapping/Cache/DoctrineCache.php
@@ -23,21 +23,11 @@ final class DoctrineCache implements CacheInterface
 {
     private $cache;
 
-    /**
-     * Creates a new Doctrine cache.
-     *
-     * @param Cache $cache The cache to adapt
-     */
     public function __construct(Cache $cache)
     {
         $this->cache = $cache;
     }
 
-    /**
-     * Sets the cache to adapt.
-     *
-     * @param Cache $cache The cache to adapt
-     */
     public function setCache(Cache $cache)
     {
         $this->cache = $cache;
diff --git a/vendor/symfony/validator/Mapping/ClassMetadata.php b/vendor/symfony/validator/Mapping/ClassMetadata.php
index f895ad40402dc79e04b5e87c03d5c7edaaa0e563..abaefcab299c56401ade7db9966b007ecf6a42ab 100644
--- a/vendor/symfony/validator/Mapping/ClassMetadata.php
+++ b/vendor/symfony/validator/Mapping/ClassMetadata.php
@@ -376,11 +376,13 @@ class ClassMetadata extends ElementMetadata implements ClassMetadataInterface
 
     /**
      * Merges the constraints of the given metadata into this object.
-     *
-     * @param ClassMetadata $source The source metadata
      */
     public function mergeConstraints(ClassMetadata $source)
     {
+        if ($source->isGroupSequenceProvider()) {
+            $this->setGroupSequenceProvider(true);
+        }
+
         foreach ($source->getConstraints() as $constraint) {
             $this->addConstraint(clone $constraint);
         }
@@ -586,11 +588,6 @@ class ClassMetadata extends ElementMetadata implements ClassMetadataInterface
         return CascadingStrategy::NONE;
     }
 
-    /**
-     * Adds a property metadata.
-     *
-     * @param PropertyMetadataInterface $metadata
-     */
     private function addPropertyMetadata(PropertyMetadataInterface $metadata)
     {
         $property = $metadata->getPropertyName();
diff --git a/vendor/symfony/validator/Mapping/Factory/LazyLoadingMetadataFactory.php b/vendor/symfony/validator/Mapping/Factory/LazyLoadingMetadataFactory.php
index 82e1cf6bffd44794506cc7ec7e1712a80db89c79..1a4f3074b6e4f512ffb9bc76a09910ba432eb2bb 100644
--- a/vendor/symfony/validator/Mapping/Factory/LazyLoadingMetadataFactory.php
+++ b/vendor/symfony/validator/Mapping/Factory/LazyLoadingMetadataFactory.php
@@ -40,18 +40,7 @@ use Symfony\Component\Validator\Mapping\Loader\LoaderInterface;
  */
 class LazyLoadingMetadataFactory implements MetadataFactoryInterface
 {
-    /**
-     * The loader for loading the class metadata.
-     *
-     * @var LoaderInterface|null
-     */
     protected $loader;
-
-    /**
-     * The cache for caching class metadata.
-     *
-     * @var CacheInterface|null
-     */
     protected $cache;
 
     /**
diff --git a/vendor/symfony/validator/Mapping/GenericMetadata.php b/vendor/symfony/validator/Mapping/GenericMetadata.php
index 97915ac71307f1b891f31cefbe5ddf27ad858561..ae69d9b66dfeaa6043e00c3abfccc4c4a1433181 100644
--- a/vendor/symfony/validator/Mapping/GenericMetadata.php
+++ b/vendor/symfony/validator/Mapping/GenericMetadata.php
@@ -119,8 +119,6 @@ class GenericMetadata implements MetadataInterface
      *    if $traverse is enabled, but $deep is disabled
      *  - {@link TraversalStrategy::NONE} if $traverse is disabled
      *
-     * @param Constraint $constraint The constraint to add
-     *
      * @return $this
      *
      * @throws ConstraintDefinitionException When trying to add the
diff --git a/vendor/symfony/validator/Mapping/GetterMetadata.php b/vendor/symfony/validator/Mapping/GetterMetadata.php
index cd42c4338cbb56d981062eb6bf82d590682075ec..5a72bd84b744267ede21a2d2ae49cd8714dcf7de 100644
--- a/vendor/symfony/validator/Mapping/GetterMetadata.php
+++ b/vendor/symfony/validator/Mapping/GetterMetadata.php
@@ -33,8 +33,6 @@ use Symfony\Component\Validator\Exception\ValidatorException;
 class GetterMetadata extends MemberMetadata
 {
     /**
-     * Constructor.
-     *
      * @param string      $class    The class the getter is defined on
      * @param string      $property The property which the getter returns
      * @param string|null $method   The method that is called to retrieve the value being validated (null for auto-detection)
diff --git a/vendor/symfony/validator/Mapping/Loader/AbstractLoader.php b/vendor/symfony/validator/Mapping/Loader/AbstractLoader.php
index 2ae89886c8d0967211651a451cbbe08dd459b007..9d92de348ae5cd9b1b10c3b3e5984d1781189d29 100644
--- a/vendor/symfony/validator/Mapping/Loader/AbstractLoader.php
+++ b/vendor/symfony/validator/Mapping/Loader/AbstractLoader.php
@@ -32,9 +32,6 @@ abstract class AbstractLoader implements LoaderInterface
      */
     const DEFAULT_NAMESPACE = '\\Symfony\\Component\\Validator\\Constraints\\';
 
-    /**
-     * @var array
-     */
     protected $namespaces = array();
 
     /**
@@ -72,9 +69,9 @@ abstract class AbstractLoader implements LoaderInterface
      */
     protected function newConstraint($name, $options = null)
     {
-        if (strpos($name, '\\') !== false && class_exists($name)) {
+        if (false !== strpos($name, '\\') && class_exists($name)) {
             $className = (string) $name;
-        } elseif (strpos($name, ':') !== false) {
+        } elseif (false !== strpos($name, ':')) {
             list($prefix, $className) = explode(':', $name, 2);
 
             if (!isset($this->namespaces[$prefix])) {
diff --git a/vendor/symfony/validator/Mapping/Loader/AnnotationLoader.php b/vendor/symfony/validator/Mapping/Loader/AnnotationLoader.php
index a3b5f7ee8e9731d6dd55290fb1db0e37b188edd4..c2d1bdf1cdb0c2dd3db205a82b4bd85fb654e1d9 100644
--- a/vendor/symfony/validator/Mapping/Loader/AnnotationLoader.php
+++ b/vendor/symfony/validator/Mapping/Loader/AnnotationLoader.php
@@ -26,9 +26,6 @@ use Symfony\Component\Validator\Mapping\ClassMetadata;
  */
 class AnnotationLoader implements LoaderInterface
 {
-    /**
-     * @var Reader
-     */
     protected $reader;
 
     public function __construct(Reader $reader)
diff --git a/vendor/symfony/validator/Mapping/Loader/FileLoader.php b/vendor/symfony/validator/Mapping/Loader/FileLoader.php
index 326bbdfe75c725fc6cce67d1a6beda5f2507d531..b8f9490379aee54d90e80ecb8e02e93360eb8d1a 100644
--- a/vendor/symfony/validator/Mapping/Loader/FileLoader.php
+++ b/vendor/symfony/validator/Mapping/Loader/FileLoader.php
@@ -23,11 +23,6 @@ use Symfony\Component\Validator\Exception\MappingException;
  */
 abstract class FileLoader extends AbstractLoader
 {
-    /**
-     * The file to load.
-     *
-     * @var string
-     */
     protected $file;
 
     /**
diff --git a/vendor/symfony/validator/Mapping/Loader/LoaderChain.php b/vendor/symfony/validator/Mapping/Loader/LoaderChain.php
index 970d9068d8ff4b8caf3ce904c3abb24aa8e7c3ac..ead415e977c9e8a31bda2899c41b681d851448e7 100644
--- a/vendor/symfony/validator/Mapping/Loader/LoaderChain.php
+++ b/vendor/symfony/validator/Mapping/Loader/LoaderChain.php
@@ -25,9 +25,6 @@ use Symfony\Component\Validator\Mapping\ClassMetadata;
  */
 class LoaderChain implements LoaderInterface
 {
-    /**
-     * @var LoaderInterface[]
-     */
     protected $loaders;
 
     /**
diff --git a/vendor/symfony/validator/Mapping/Loader/LoaderInterface.php b/vendor/symfony/validator/Mapping/Loader/LoaderInterface.php
index 5dadc82eb80949d3b0cd43acd17586706e70408b..d988309f811dfbe04707ddf8df68c7ff98179b50 100644
--- a/vendor/symfony/validator/Mapping/Loader/LoaderInterface.php
+++ b/vendor/symfony/validator/Mapping/Loader/LoaderInterface.php
@@ -23,8 +23,6 @@ interface LoaderInterface
     /**
      * Loads validation metadata into a {@link ClassMetadata} instance.
      *
-     * @param ClassMetadata $metadata The metadata to load
-     *
      * @return bool Whether the loader succeeded
      */
     public function loadClassMetadata(ClassMetadata $metadata);
diff --git a/vendor/symfony/validator/Mapping/Loader/StaticMethodLoader.php b/vendor/symfony/validator/Mapping/Loader/StaticMethodLoader.php
index 4ff22573acc3714daca1db351ccdfa000d57543d..95fc578eb4b5c5a76d8bf795e7c8041d581ebe29 100644
--- a/vendor/symfony/validator/Mapping/Loader/StaticMethodLoader.php
+++ b/vendor/symfony/validator/Mapping/Loader/StaticMethodLoader.php
@@ -21,11 +21,6 @@ use Symfony\Component\Validator\Mapping\ClassMetadata;
  */
 class StaticMethodLoader implements LoaderInterface
 {
-    /**
-     * The name of the method to call.
-     *
-     * @var string
-     */
     protected $methodName;
 
     /**
diff --git a/vendor/symfony/validator/Mapping/MemberMetadata.php b/vendor/symfony/validator/Mapping/MemberMetadata.php
index 0def248431f2dc9d7e0205efed48298d3a5fcd41..612c45c06c8aa1db54a8ff4c7f231dda250e0a37 100644
--- a/vendor/symfony/validator/Mapping/MemberMetadata.php
+++ b/vendor/symfony/validator/Mapping/MemberMetadata.php
@@ -30,8 +30,6 @@ use Symfony\Component\Validator\ValidationVisitorInterface;
 abstract class MemberMetadata extends ElementMetadata implements PropertyMetadataInterface
 {
     /**
-     * @var string
-     *
      * @internal This property is public in order to reduce the size of the
      *           class' serialized representation. Do not access it. Use
      *           {@link getClassName()} instead.
@@ -39,8 +37,6 @@ abstract class MemberMetadata extends ElementMetadata implements PropertyMetadat
     public $class;
 
     /**
-     * @var string
-     *
      * @internal This property is public in order to reduce the size of the
      *           class' serialized representation. Do not access it. Use
      *           {@link getName()} instead.
@@ -48,8 +44,6 @@ abstract class MemberMetadata extends ElementMetadata implements PropertyMetadat
     public $name;
 
     /**
-     * @var string
-     *
      * @internal This property is public in order to reduce the size of the
      *           class' serialized representation. Do not access it. Use
      *           {@link getPropertyName()} instead.
@@ -62,8 +56,6 @@ abstract class MemberMetadata extends ElementMetadata implements PropertyMetadat
     private $reflMember = array();
 
     /**
-     * Constructor.
-     *
      * @param string $class    The name of the class this member is defined on
      * @param string $name     The name of the member
      * @param string $property The property the member belongs to
diff --git a/vendor/symfony/validator/Mapping/PropertyMetadata.php b/vendor/symfony/validator/Mapping/PropertyMetadata.php
index d12701cb44aba94505011a9b88a51c0ff37f963f..7fc19dd2f702099522cc95067452e3f0404e117f 100644
--- a/vendor/symfony/validator/Mapping/PropertyMetadata.php
+++ b/vendor/symfony/validator/Mapping/PropertyMetadata.php
@@ -29,8 +29,6 @@ use Symfony\Component\Validator\Exception\ValidatorException;
 class PropertyMetadata extends MemberMetadata
 {
     /**
-     * Constructor.
-     *
      * @param string $class The class this property is defined on
      * @param string $name  The name of this property
      *
diff --git a/vendor/symfony/validator/Resources/translations/validators.cs.xlf b/vendor/symfony/validator/Resources/translations/validators.cs.xlf
index 62779e19df9785fedfabce5bac09f8e57e6b701f..24061e5b1a014d48b77d17ccf39bb0ce50063ab0 100644
--- a/vendor/symfony/validator/Resources/translations/validators.cs.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.cs.xlf
@@ -36,7 +36,7 @@
             </trans-unit>
             <trans-unit id="9">
                 <source>This field was not expected.</source>
-                <target>Toto pole nebyla očekávána.</target>
+                <target>Toto pole nebylo očekáváno.</target>
             </trans-unit>
             <trans-unit id="10">
                 <source>This field is missing.</source>
diff --git a/vendor/symfony/validator/Resources/translations/validators.el.xlf b/vendor/symfony/validator/Resources/translations/validators.el.xlf
index 4fa0d422205007b99b5c2c1bd993ffad00647b50..a3199bcc9d79e51c139aefdd156703b35cfc571c 100644
--- a/vendor/symfony/validator/Resources/translations/validators.el.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.el.xlf
@@ -100,7 +100,7 @@
             </trans-unit>
             <trans-unit id="25">
                 <source>This value is not valid.</source>
-                <target>Αυτή η τιμή δεν είναι έκγυρη.</target>
+                <target>Αυτή η τιμή δεν είναι έγκυρη.</target>
             </trans-unit>
             <trans-unit id="26">
                 <source>This value is not a valid time.</source>
@@ -136,11 +136,11 @@
             </trans-unit>
             <trans-unit id="37">
                 <source>This is not a valid IP address.</source>
-                <target>Αυτό δεν είναι μια έκγυρη διεύθυνση IP.</target>
+                <target>Αυτό δεν είναι μια έγκυρη διεύθυνση IP.</target>
             </trans-unit>
             <trans-unit id="38">
                 <source>This value is not a valid language.</source>
-                <target>Αυτή η τιμή δεν αντιστοιχεί σε μια έκγυρη γλώσσα.</target>
+                <target>Αυτή η τιμή δεν αντιστοιχεί σε μια έγκυρη γλώσσα.</target>
             </trans-unit>
             <trans-unit id="39">
                 <source>This value is not a valid locale.</source>
@@ -148,7 +148,7 @@
             </trans-unit>
             <trans-unit id="40">
                 <source>This value is not a valid country.</source>
-                <target>Αυτή η τιμή δεν αντιστοιχεί σε μια έκγυρη χώρα.</target>
+                <target>Αυτή η τιμή δεν αντιστοιχεί σε μια έγκυρη χώρα.</target>
             </trans-unit>
             <trans-unit id="41">
                 <source>This value is already used.</source>
diff --git a/vendor/symfony/validator/Resources/translations/validators.lb.xlf b/vendor/symfony/validator/Resources/translations/validators.lb.xlf
index d631797018bb8b659a514bfefe12b67aa1a3343f..668b2a631e9f36810358aa655ef69786b64de76d 100644
--- a/vendor/symfony/validator/Resources/translations/validators.lb.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.lb.xlf
@@ -140,7 +140,7 @@
             </trans-unit>
             <trans-unit id="38">
                 <source>This value is not a valid language.</source>
-                <target>Dëse Wäert aentsprécht kenger gëlteger Sprooch.</target>
+                <target>Dëse Wäert entsprécht kenger gëlteger Sprooch.</target>
             </trans-unit>
             <trans-unit id="39">
                 <source>This value is not a valid locale.</source>
@@ -180,7 +180,7 @@
             </trans-unit>
             <trans-unit id="48">
                 <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
-                <target>Dëse Wäert sollt exactly {{ limit }} Buschtaf hunn.|Dëse Wäert sollt exakt {{ limit }} Buschtawen hunn.</target>
+                <target>Dëse Wäert sollt exakt {{ limit }} Buschtaf hunn.|Dëse Wäert sollt exakt {{ limit }} Buschtawen hunn.</target>
             </trans-unit>
             <trans-unit id="49">
                 <source>The file was only partially uploaded.</source>
@@ -192,7 +192,7 @@
             </trans-unit>
             <trans-unit id="51">
                 <source>No temporary folder was configured in php.ini.</source>
-                <target>Et gouf keen temporären Dossier an der php.ini konfiguréiert.</target>
+                <target>Et gouf keen temporären Dossier an der php.ini konfiguréiert oder den temporären Dossier existéiert net.</target>
             </trans-unit>
             <trans-unit id="52">
                 <source>Cannot write temporary file to disk.</source>
@@ -304,7 +304,7 @@
             </trans-unit>
             <trans-unit id="79">
                 <source>The host could not be resolved.</source>
-                <target>Den Domain-Numm konnt net opgeléist ginn.</target>
+                <target>Den Host-Numm konnt net opgeléist ginn.</target>
             </trans-unit>
             <trans-unit id="80">
                 <source>This value does not match the expected {{ charset }} charset.</source>
diff --git a/vendor/symfony/validator/Tests/Constraints/FileTest.php b/vendor/symfony/validator/Tests/Constraints/FileTest.php
index fdecdc7cc1f45d4bc254dc840a72d64224ab29d6..18b68f5f11740bb0259100586a4f5c38ef138e9e 100644
--- a/vendor/symfony/validator/Tests/Constraints/FileTest.php
+++ b/vendor/symfony/validator/Tests/Constraints/FileTest.php
@@ -18,9 +18,6 @@ use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
 class FileTest extends TestCase
 {
     /**
-     * @param mixed $maxSize
-     * @param int   $bytes
-     * @param bool  $binaryFormat
      * @dataProvider provideValidSizes
      */
     public function testMaxSize($maxSize, $bytes, $binaryFormat)
@@ -33,10 +30,6 @@ class FileTest extends TestCase
 
     /**
      * @dataProvider provideValidSizes
-     *
-     * @param int|string $maxSize
-     * @param int        $bytes
-     * @param string     $binaryFormat
      */
     public function testMaxSizeCanBeSetAfterInitialization($maxSize, $bytes, $binaryFormat)
     {
@@ -50,8 +43,6 @@ class FileTest extends TestCase
     /**
      * @dataProvider provideInvalidSizes
      * @expectedException \Symfony\Component\Validator\Exception\ConstraintDefinitionException
-     *
-     * @param int|string $maxSize
      */
     public function testInvalidValueForMaxSizeThrowsExceptionAfterInitialization($maxSize)
     {
@@ -61,8 +52,6 @@ class FileTest extends TestCase
 
     /**
      * @dataProvider provideInvalidSizes
-     *
-     * @param int|string $maxSize
      */
     public function testMaxSizeCannotBeSetToInvalidValueAfterInitialization($maxSize)
     {
@@ -77,7 +66,6 @@ class FileTest extends TestCase
     }
 
     /**
-     * @param mixed $maxSize
      * @dataProvider provideInValidSizes
      * @expectedException \Symfony\Component\Validator\Exception\ConstraintDefinitionException
      */
@@ -86,9 +74,6 @@ class FileTest extends TestCase
         new File(array('maxSize' => $maxSize));
     }
 
-    /**
-     * @return array
-     */
     public function provideValidSizes()
     {
         return array(
@@ -105,9 +90,6 @@ class FileTest extends TestCase
         );
     }
 
-    /**
-     * @return array
-     */
     public function provideInvalidSizes()
     {
         return array(
@@ -121,9 +103,6 @@ class FileTest extends TestCase
     }
 
     /**
-     * @param mixed $maxSize
-     * @param bool  $guessedFormat
-     * @param bool  $binaryFormat
      * @dataProvider provideFormats
      */
     public function testBinaryFormat($maxSize, $guessedFormat, $binaryFormat)
@@ -133,9 +112,6 @@ class FileTest extends TestCase
         $this->assertSame($binaryFormat, $file->binaryFormat);
     }
 
-    /**
-     * @return array
-     */
     public function provideFormats()
     {
         return array(
diff --git a/vendor/symfony/validator/Tests/Constraints/IbanValidatorTest.php b/vendor/symfony/validator/Tests/Constraints/IbanValidatorTest.php
index e9deb11de4943e77596d366641c24aed4405ab6d..16bf834f87c1c65921d3c952a8e78e5203b4beb8 100644
--- a/vendor/symfony/validator/Tests/Constraints/IbanValidatorTest.php
+++ b/vendor/symfony/validator/Tests/Constraints/IbanValidatorTest.php
@@ -68,6 +68,9 @@ class IbanValidatorTest extends AbstractConstraintValidatorTest
             array('BE62 5100 0754 7061'), //Belgium
             array('BA39 1290 0794 0102 8494'), //Bosnia and Herzegovina
             array('BG80 BNBG 9661 1020 3456 78'), //Bulgaria
+            array('BY 13 NBRB 3600 900000002Z00AB00'), //Belarus
+            array('BY13 NBRB 3600 900000002Z00AB00'), //Belarus
+            array('BY22NB23324232T78YR7823HR32U'), //Belarus
             array('HR12 1001 0051 8630 0016 0'), //Croatia
             array('CY17 0020 0128 0000 0012 0052 7600'), //Cyprus
             array('CZ65 0800 0000 1920 0014 5399'), //Czech Republic
@@ -118,7 +121,7 @@ class IbanValidatorTest extends AbstractConstraintValidatorTest
 
             //Extended country list
             //http://www.nordea.com/Our+services/International+products+and+services/Cash+Management/IBAN+countries/908462.html
-            // http://www.swift.com/dsp/resources/documents/IBAN_Registry.pdf
+            // https://www.swift.com/sites/default/files/resources/iban_registry.pdf
             array('AO06000600000100037131174'), //Angola
             array('AZ21NABZ00000000137010001944'), //Azerbaijan
             array('BH29BMAG1299123456BH00'), //Bahrain
@@ -132,7 +135,7 @@ class IbanValidatorTest extends AbstractConstraintValidatorTest
             array('CV64000300004547069110176'), //Cape Verde
             array('FR7630007000110009970004942'), //Central African Republic
             array('CG5230011000202151234567890'), //Congo
-            array('CR0515202001026284066'), //Costa Rica
+            array('CR05015202001026284066'), //Costa Rica
             array('DO28BAGR00000001212453611324'), //Dominican Republic
             array('GT82TRAJ01020000001210029690'), //Guatemala
             array('IR580540105180021273113007'), //Iran
@@ -156,6 +159,7 @@ class IbanValidatorTest extends AbstractConstraintValidatorTest
             array('TL380080012345678910157'), //Timor-Leste
             array('TN5914207207100707129648'), //Tunisia
             array('TR330006100519786457841326'), //Turkey
+            array('UA213223130000026007233566001'), //Ukraine
             array('AE260211000000230064016'), //United Arab Emirates
         );
     }
@@ -182,6 +186,10 @@ class IbanValidatorTest extends AbstractConstraintValidatorTest
             array('BA39 1290 0794 0102 8494 4'), //Bosnia and Herzegovina
             array('BG80 BNBG 9661 1020 3456 7'), //Bulgaria
             array('BG80 B2BG 9661 1020 3456 78'), //Bulgaria
+            array('BY 13 NBRB 3600 900000002Z00AB001'), //Belarus
+            array('BY 13 NBRB 3600 900000002Z00AB0'), //Belarus
+            array('BYRO NBRB 3600 900000002Z00AB0'), //Belarus
+            array('BY 13 3600 NBRB 900000002Z00AB05'), //Belarus
             array('HR12 1001 0051 8630 0016 01'), //Croatia
             array('CY17 0020 0128 0000 0012 0052 7600 1'), //Cyprus
             array('CZ65 0800 0000 1920 0014 5399 1'), //Czech Republic
@@ -245,6 +253,7 @@ class IbanValidatorTest extends AbstractConstraintValidatorTest
             array('FR76300070001100099700049421'), //Central African Republic
             array('CG52300110002021512345678901'), //Congo
             array('CR05152020010262840661'), //Costa Rica
+            array('CR0515202001026284066'), //Costa Rica
             array('DO28BAGR000000012124536113241'), //Dominican Republic
             array('GT82TRAJ010200000012100296901'), //Guatemala
             array('IR5805401051800212731130071'), //Iran
@@ -268,6 +277,7 @@ class IbanValidatorTest extends AbstractConstraintValidatorTest
             array('TL3800800123456789101571'), //Timor-Leste
             array('TN59142072071007071296481'), //Tunisia
             array('TR3300061005197864578413261'), //Turkey
+            array('UA21AAAA1300000260072335660012'), //Ukraine
             array('AE2602110000002300640161'), //United Arab Emirates
         );
     }
@@ -291,6 +301,7 @@ class IbanValidatorTest extends AbstractConstraintValidatorTest
             array('BE62 5100 0754 7062'), //Belgium
             array('BA39 1290 0794 0102 8495'), //Bosnia and Herzegovina
             array('BG80 BNBG 9661 1020 3456 79'), //Bulgaria
+            array('BY90 NBRB 3600 900000002Z00AB00'), //Belarus
             array('HR12 1001 0051 8630 0016 1'), //Croatia
             array('CY17 0020 0128 0000 0012 0052 7601'), //Cyprus
             array('CZ65 0800 0000 1920 0014 5398'), //Czech Republic
@@ -353,7 +364,7 @@ class IbanValidatorTest extends AbstractConstraintValidatorTest
             array('CV64000300004547069110177'), //Cape Verde
             array('FR7630007000110009970004943'), //Central African Republic
             array('CG5230011000202151234567891'), //Congo
-            array('CR0515202001026284067'), //Costa Rica
+            array('CR96042332432534543564'), //Costa Rica
             array('DO28BAGR00000001212453611325'), //Dominican Republic
             array('GT82TRAJ01020000001210029691'), //Guatemala
             array('IR580540105180021273113008'), //Iran
@@ -377,6 +388,7 @@ class IbanValidatorTest extends AbstractConstraintValidatorTest
             array('TL380080012345678910158'), //Timor-Leste
             array('TN5914207207100707129649'), //Tunisia
             array('TR330006100519786457841327'), //Turkey
+            array('UA213223130000026007233566002'), //Ukraine
             array('AE260211000000230064017'), //United Arab Emirates
         );
     }
diff --git a/vendor/symfony/validator/Tests/Constraints/UrlValidatorTest.php b/vendor/symfony/validator/Tests/Constraints/UrlValidatorTest.php
index 9b89a92559341b99cfa130a7371ae7ace0e3833c..bc3bd027d1f6e5187b7aa890c79c2ec785c78802 100644
--- a/vendor/symfony/validator/Tests/Constraints/UrlValidatorTest.php
+++ b/vendor/symfony/validator/Tests/Constraints/UrlValidatorTest.php
@@ -121,6 +121,9 @@ class UrlValidatorTest extends AbstractConstraintValidatorTest
             array('http://xn--d1abbgf6aiiy.xn--p1ai/'),
             array('http://☎.com/'),
             array('http://username:password@symfony.com'),
+            array('http://user.name:password@symfony.com'),
+            array('http://username:pass.word@symfony.com'),
+            array('http://user.name:pass.word@symfony.com'),
             array('http://user-name@symfony.com'),
             array('http://symfony.com?'),
             array('http://symfony.com?query=1'),
diff --git a/vendor/symfony/validator/Tests/Fixtures/GroupSequenceProviderChildEntity.php b/vendor/symfony/validator/Tests/Fixtures/GroupSequenceProviderChildEntity.php
new file mode 100644
index 0000000000000000000000000000000000000000..be7191f9b6e1d0c878c0661078479c674685b3b6
--- /dev/null
+++ b/vendor/symfony/validator/Tests/Fixtures/GroupSequenceProviderChildEntity.php
@@ -0,0 +1,16 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Validator\Tests\Fixtures;
+
+class GroupSequenceProviderChildEntity extends GroupSequenceProviderEntity
+{
+}
diff --git a/vendor/symfony/validator/Tests/Mapping/ClassMetadataTest.php b/vendor/symfony/validator/Tests/Mapping/ClassMetadataTest.php
index 9a23e8cf355a00fa7a3bbe10dc7e25f26f55a3ed..a3f8a8c1ec8a3ded8c2afdafe1a8131249225ef8 100644
--- a/vendor/symfony/validator/Tests/Mapping/ClassMetadataTest.php
+++ b/vendor/symfony/validator/Tests/Mapping/ClassMetadataTest.php
@@ -24,6 +24,7 @@ class ClassMetadataTest extends TestCase
     const CLASSNAME = 'Symfony\Component\Validator\Tests\Fixtures\Entity';
     const PARENTCLASS = 'Symfony\Component\Validator\Tests\Fixtures\EntityParent';
     const PROVIDERCLASS = 'Symfony\Component\Validator\Tests\Fixtures\GroupSequenceProviderEntity';
+    const PROVIDERCHILDCLASS = 'Symfony\Component\Validator\Tests\Fixtures\GroupSequenceProviderChildEntity';
 
     protected $metadata;
 
@@ -301,6 +302,17 @@ class ClassMetadataTest extends TestCase
         $this->assertTrue($metadata->isGroupSequenceProvider());
     }
 
+    public function testMergeConstraintsMergesGroupSequenceProvider()
+    {
+        $parent = new ClassMetadata(self::PROVIDERCLASS);
+        $parent->setGroupSequenceProvider(true);
+
+        $metadata = new ClassMetadata(self::PROVIDERCHILDCLASS);
+        $metadata->mergeConstraints($parent);
+
+        $this->assertTrue($metadata->isGroupSequenceProvider());
+    }
+
     /**
      * https://github.com/symfony/symfony/issues/11604.
      */
@@ -309,13 +321,3 @@ class ClassMetadataTest extends TestCase
         $this->assertCount(0, $this->metadata->getPropertyMetadata('foo'), '->getPropertyMetadata() returns an empty collection if no metadata is configured for the given property');
     }
 }
-
-class ParentClass
-{
-    public $example = 0;
-}
-
-class ChildClass extends ParentClass
-{
-    public $example = 1;    // overrides parent property of same name
-}
diff --git a/vendor/symfony/validator/Tests/Validator/Abstract2Dot5ApiTest.php b/vendor/symfony/validator/Tests/Validator/Abstract2Dot5ApiTest.php
index 5e97d523bf759a03430c37a35aebd1d3acb84590..da4ef197ad60520c54f23930589350d477e742a0 100644
--- a/vendor/symfony/validator/Tests/Validator/Abstract2Dot5ApiTest.php
+++ b/vendor/symfony/validator/Tests/Validator/Abstract2Dot5ApiTest.php
@@ -40,9 +40,6 @@ abstract class Abstract2Dot5ApiTest extends AbstractValidatorTest
     protected $validator;
 
     /**
-     * @param MetadataFactoryInterface $metadataFactory
-     * @param array                    $objectInitializers
-     *
      * @return ValidatorInterface
      */
     abstract protected function createValidator(MetadataFactoryInterface $metadataFactory, array $objectInitializers = array());
diff --git a/vendor/symfony/validator/Validation.php b/vendor/symfony/validator/Validation.php
index 94ed62c52559b96aba3d6327e4f52007e99d0d15..a469b47e25ea25662b087145b8c89b76651af05e 100644
--- a/vendor/symfony/validator/Validation.php
+++ b/vendor/symfony/validator/Validation.php
@@ -21,7 +21,7 @@ final class Validation
     /**
      * The Validator API provided by Symfony 2.4 and older.
      *
-     * @deprecated use API_VERSION_2_5_BC instead.
+     * @deprecated use API_VERSION_2_5_BC instead
      */
     const API_VERSION_2_4 = 1;
 
diff --git a/vendor/symfony/validator/ValidationVisitor.php b/vendor/symfony/validator/ValidationVisitor.php
index 82af6a9e727dec2380d13e668e4708eccd6b9ea1..8f1657083adf7f488cec83566a3ea876a193a403 100644
--- a/vendor/symfony/validator/ValidationVisitor.php
+++ b/vendor/symfony/validator/ValidationVisitor.php
@@ -27,44 +27,13 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException;
  */
 class ValidationVisitor implements ValidationVisitorInterface, GlobalExecutionContextInterface
 {
-    /**
-     * @var mixed
-     */
     private $root;
-
-    /**
-     * @var MetadataFactoryInterface
-     */
     private $metadataFactory;
-
-    /**
-     * @var ConstraintValidatorFactoryInterface
-     */
     private $validatorFactory;
-
-    /**
-     * @var TranslatorInterface
-     */
     private $translator;
-
-    /**
-     * @var null|string
-     */
     private $translationDomain;
-
-    /**
-     * @var array
-     */
     private $objectInitializers;
-
-    /**
-     * @var ConstraintViolationList
-     */
     private $violations;
-
-    /**
-     * @var array
-     */
     private $validatedObjects = array();
 
     /**
diff --git a/vendor/symfony/validator/ValidationVisitorInterface.php b/vendor/symfony/validator/ValidationVisitorInterface.php
index b6c6e9f1cb9d32803267c64fe09614ff6c113ebc..28d492132b8a1125ac8a9f891db783f1b0b9e1df 100644
--- a/vendor/symfony/validator/ValidationVisitorInterface.php
+++ b/vendor/symfony/validator/ValidationVisitorInterface.php
@@ -62,8 +62,8 @@ interface ValidationVisitorInterface
      * @param bool   $traverse     Whether to traverse the value if it is traversable
      * @param bool   $deep         Whether to traverse nested traversable values recursively
      *
-     * @throws Exception\NoSuchMetadataException If no metadata can be found for
-     *                                           the given value.
+     * @throws Exception\NoSuchMetadataException if no metadata can be found for
+     *                                           the given value
      */
     public function validate($value, $group, $propertyPath, $traverse = false, $deep = false);
 
diff --git a/vendor/symfony/validator/Validator.php b/vendor/symfony/validator/Validator.php
index feaec0d400382e51108bb4a57bce1117bc0a7e39..27a2be8ad2506b9ded2b2bcbf5fa7378be2f7872 100644
--- a/vendor/symfony/validator/Validator.php
+++ b/vendor/symfony/validator/Validator.php
@@ -28,29 +28,10 @@ use Symfony\Component\Validator\Exception\ValidatorException;
  */
 class Validator implements ValidatorInterface, Mapping\Factory\MetadataFactoryInterface
 {
-    /**
-     * @var MetadataFactoryInterface
-     */
     private $metadataFactory;
-
-    /**
-     * @var ConstraintValidatorFactoryInterface
-     */
     private $validatorFactory;
-
-    /**
-     * @var TranslatorInterface
-     */
     private $translator;
-
-    /**
-     * @var null|string
-     */
     private $translationDomain;
-
-    /**
-     * @var array
-     */
     private $objectInitializers;
 
     public function __construct(
@@ -108,7 +89,7 @@ class Validator implements ValidatorInterface, Mapping\Factory\MetadataFactoryIn
     /**
      * {@inheritdoc}
      *
-     * @throws ValidatorException If the metadata for the value does not support properties.
+     * @throws ValidatorException if the metadata for the value does not support properties
      */
     public function validateProperty($containingValue, $property, $groups = null)
     {
@@ -139,7 +120,7 @@ class Validator implements ValidatorInterface, Mapping\Factory\MetadataFactoryIn
     /**
      * {@inheritdoc}
      *
-     * @throws ValidatorException If the metadata for the value does not support properties.
+     * @throws ValidatorException if the metadata for the value does not support properties
      */
     public function validatePropertyValue($containingValue, $property, $value, $groups = null)
     {
diff --git a/vendor/symfony/validator/Validator/RecursiveContextualValidator.php b/vendor/symfony/validator/Validator/RecursiveContextualValidator.php
index a9e9f7f0e8a12d174862a7543889c8842a4618eb..acb43283967ca414a0009fa8c57454eaaa86d11a 100644
--- a/vendor/symfony/validator/Validator/RecursiveContextualValidator.php
+++ b/vendor/symfony/validator/Validator/RecursiveContextualValidator.php
@@ -38,34 +38,11 @@ use Symfony\Component\Validator\Util\PropertyPath;
  */
 class RecursiveContextualValidator implements ContextualValidatorInterface
 {
-    /**
-     * @var ExecutionContextInterface
-     */
     private $context;
-
-    /**
-     * @var string
-     */
     private $defaultPropertyPath;
-
-    /**
-     * @var array
-     */
     private $defaultGroups;
-
-    /**
-     * @var MetadataFactoryInterface
-     */
     private $metadataFactory;
-
-    /**
-     * @var ConstraintValidatorFactoryInterface
-     */
     private $validatorFactory;
-
-    /**
-     * @var ObjectInitializerInterface[]
-     */
     private $objectInitializers;
 
     /**
diff --git a/vendor/symfony/validator/Validator/RecursiveValidator.php b/vendor/symfony/validator/Validator/RecursiveValidator.php
index abd29087bc08a103814e65a2b2d7d4cb873e3d5f..7ab9527a3a9dfb2813100206ffeeaa3f77d9afbf 100644
--- a/vendor/symfony/validator/Validator/RecursiveValidator.php
+++ b/vendor/symfony/validator/Validator/RecursiveValidator.php
@@ -28,24 +28,9 @@ use Symfony\Component\Validator\ValidatorInterface as LegacyValidatorInterface;
  */
 class RecursiveValidator implements ValidatorInterface, LegacyValidatorInterface
 {
-    /**
-     * @var ExecutionContextFactoryInterface
-     */
     protected $contextFactory;
-
-    /**
-     * @var MetadataFactoryInterface
-     */
     protected $metadataFactory;
-
-    /**
-     * @var ConstraintValidatorFactoryInterface
-     */
     protected $validatorFactory;
-
-    /**
-     * @var ObjectInitializerInterface[]
-     */
     protected $objectInitializers;
 
     /**
diff --git a/vendor/symfony/validator/Validator/ValidatorInterface.php b/vendor/symfony/validator/Validator/ValidatorInterface.php
index e9576f5eceb370b85c569966015bbfcedfa6e568..5bac2e88987f633ba362416a347621c257561668 100644
--- a/vendor/symfony/validator/Validator/ValidatorInterface.php
+++ b/vendor/symfony/validator/Validator/ValidatorInterface.php
@@ -91,8 +91,6 @@ interface ValidatorInterface extends MetadataFactoryInterface
      * The returned validator adds all generated violations to the given
      * context.
      *
-     * @param ExecutionContextInterface $context The execution context
-     *
      * @return ContextualValidatorInterface The validator for that context
      */
     public function inContext(ExecutionContextInterface $context);
diff --git a/vendor/symfony/validator/ValidatorBuilder.php b/vendor/symfony/validator/ValidatorBuilder.php
index 4a69976ed2b11227cca39acf9ffdc9031052ddfe..05ccaac4fd4353c20d254af83c743fccfc498423 100644
--- a/vendor/symfony/validator/ValidatorBuilder.php
+++ b/vendor/symfony/validator/ValidatorBuilder.php
@@ -39,24 +39,9 @@ use Symfony\Component\Validator\Validator\RecursiveValidator;
  */
 class ValidatorBuilder implements ValidatorBuilderInterface
 {
-    /**
-     * @var array
-     */
     private $initializers = array();
-
-    /**
-     * @var array
-     */
     private $xmlMappings = array();
-
-    /**
-     * @var array
-     */
     private $yamlMappings = array();
-
-    /**
-     * @var array
-     */
     private $methodMappings = array();
 
     /**
diff --git a/vendor/symfony/validator/ValidatorBuilderInterface.php b/vendor/symfony/validator/ValidatorBuilderInterface.php
index b9b33e4fbcad10eb94a78c83917e9222dc84d46d..1b0bd729963089d1376535dd80ae333244151bef 100644
--- a/vendor/symfony/validator/ValidatorBuilderInterface.php
+++ b/vendor/symfony/validator/ValidatorBuilderInterface.php
@@ -26,8 +26,6 @@ interface ValidatorBuilderInterface
     /**
      * Adds an object initializer to the validator.
      *
-     * @param ObjectInitializerInterface $initializer The initializer
-     *
      * @return $this
      */
     public function addObjectInitializer(ObjectInitializerInterface $initializer);
@@ -35,7 +33,7 @@ interface ValidatorBuilderInterface
     /**
      * Adds a list of object initializers to the validator.
      *
-     * @param array $initializers The initializer
+     * @param ObjectInitializerInterface[] $initializers
      *
      * @return $this
      */
@@ -53,7 +51,7 @@ interface ValidatorBuilderInterface
     /**
      * Adds a list of XML constraint mapping files to the validator.
      *
-     * @param array $paths The paths to the mapping files
+     * @param string[] $paths The paths to the mapping files
      *
      * @return $this
      */
@@ -71,7 +69,7 @@ interface ValidatorBuilderInterface
     /**
      * Adds a list of YAML constraint mappings file to the validator.
      *
-     * @param array $paths The paths to the mapping files
+     * @param string[] $paths The paths to the mapping files
      *
      * @return $this
      */
@@ -89,7 +87,7 @@ interface ValidatorBuilderInterface
     /**
      * Enables constraint mapping using the given static methods.
      *
-     * @param array $methodNames The names of the methods
+     * @param string[] $methodNames The names of the methods
      *
      * @return $this
      */
@@ -98,8 +96,6 @@ interface ValidatorBuilderInterface
     /**
      * Enables annotation based constraint mapping.
      *
-     * @param Reader $annotationReader The annotation reader to be used
-     *
      * @return $this
      */
     public function enableAnnotationMapping(Reader $annotationReader = null);
@@ -114,8 +110,6 @@ interface ValidatorBuilderInterface
     /**
      * Sets the class metadata factory used by the validator.
      *
-     * @param MetadataFactoryInterface $metadataFactory The metadata factory
-     *
      * @return $this
      */
     public function setMetadataFactory(MetadataFactoryInterface $metadataFactory);
@@ -123,8 +117,6 @@ interface ValidatorBuilderInterface
     /**
      * Sets the cache for caching class metadata.
      *
-     * @param CacheInterface $cache The cache instance
-     *
      * @return $this
      */
     public function setMetadataCache(CacheInterface $cache);
@@ -132,8 +124,6 @@ interface ValidatorBuilderInterface
     /**
      * Sets the constraint validator factory used by the validator.
      *
-     * @param ConstraintValidatorFactoryInterface $validatorFactory The validator factory
-     *
      * @return $this
      */
     public function setConstraintValidatorFactory(ConstraintValidatorFactoryInterface $validatorFactory);
@@ -141,8 +131,6 @@ interface ValidatorBuilderInterface
     /**
      * Sets the translator used for translating violation messages.
      *
-     * @param TranslatorInterface $translator The translator instance
-     *
      * @return $this
      */
     public function setTranslator(TranslatorInterface $translator);
diff --git a/vendor/symfony/validator/ValidatorInterface.php b/vendor/symfony/validator/ValidatorInterface.php
index 58b8cd6e4cbb704919b910ac18cffc2bebe57f81..570ba99720dee609052aec5e0e7a706fe80dd34b 100644
--- a/vendor/symfony/validator/ValidatorInterface.php
+++ b/vendor/symfony/validator/ValidatorInterface.php
@@ -65,7 +65,7 @@ interface ValidatorInterface
      * @param mixed      $containingValue The value containing the property
      * @param string     $property        The name of the property to validate
      * @param string     $value           The value to validate against the
-     *                                    constraints of the property.
+     *                                    constraints of the property
      * @param array|null $groups          The validation groups to validate
      *
      * @return ConstraintViolationListInterface A list of constraint violations. If the
diff --git a/vendor/symfony/validator/Violation/ConstraintViolationBuilder.php b/vendor/symfony/validator/Violation/ConstraintViolationBuilder.php
index bf887a08ec2b80b5b07eedc06737c3ef95fae95a..284841e2eb3058e3ea97b0e7e77cdb89746ad937 100644
--- a/vendor/symfony/validator/Violation/ConstraintViolationBuilder.php
+++ b/vendor/symfony/validator/Violation/ConstraintViolationBuilder.php
@@ -27,59 +27,16 @@ use Symfony\Component\Validator\Util\PropertyPath;
  */
 class ConstraintViolationBuilder implements ConstraintViolationBuilderInterface
 {
-    /**
-     * @var ConstraintViolationList
-     */
     private $violations;
-
-    /**
-     * @var string
-     */
     private $message;
-
-    /**
-     * @var array
-     */
     private $parameters;
-
-    /**
-     * @var mixed
-     */
     private $root;
-
-    /**
-     * @var mixed
-     */
     private $invalidValue;
-
-    /**
-     * @var string
-     */
     private $propertyPath;
-
-    /**
-     * @var TranslatorInterface
-     */
     private $translator;
-
-    /**
-     * @var string|null
-     */
     private $translationDomain;
-
-    /**
-     * @var int|null
-     */
     private $plural;
-
-    /**
-     * @var Constraint
-     */
     private $constraint;
-
-    /**
-     * @var mixed
-     */
     private $code;
 
     /**
diff --git a/vendor/zendframework/zend-diactoros/CHANGELOG.md b/vendor/zendframework/zend-diactoros/CHANGELOG.md
index 4440059f7b0092401c682ea5dd47024d306c2d7a..d322efecd4f073264a43bf5dee45111968de1a9f 100644
--- a/vendor/zendframework/zend-diactoros/CHANGELOG.md
+++ b/vendor/zendframework/zend-diactoros/CHANGELOG.md
@@ -2,6 +2,169 @@
 
 All notable changes to this project will be documented in this file, in reverse chronological order by release.
 
+## 1.6.1 - 2017-10-12
+
+### Added
+
+- Nothing.
+
+### Changed
+
+- [#273](https://github.com/zendframework/zend-diactoros/pull/273) updates each
+  of the SAPI emitter implementations to emit the status line after emitting
+  other headers; this is done to ensure that the status line is not overridden
+  by PHP.
+
+### Deprecated
+
+- Nothing.
+
+### Removed
+
+- Nothing.
+
+### Fixed
+
+- [#273](https://github.com/zendframework/zend-diactoros/pull/273) modifies how
+  the `SapiEmitterTrait` calls `header()` to ensure that a response code is
+  _always_ passed as the third argument; this is done to prevent PHP from
+  silently overriding it.
+
+## 1.6.0 - 2017-09-13
+
+### Added
+
+- Nothing.
+
+### Changed
+
+- [#270](https://github.com/zendframework/zend-diactoros/pull/270) changes the
+  behavior of `Zend\Diactoros\Server`: it no longer creates an output buffer.
+
+- [#270](https://github.com/zendframework/zend-diactoros/pull/270) changes the
+  behavior of the two SAPI emitters in two backwards-incompatible ways:
+
+  - They no longer auto-inject a `Content-Length` header. If you need this
+    functionality, zendframework/zend-expressive-helpers 4.1+ provides it via
+    `Zend\Expressive\Helper\ContentLengthMiddleware`.
+
+  - They no longer flush the output buffer. Instead, if headers have been sent,
+    or the output buffer exists and has a non-zero length, the emitters raise an
+    exception, as mixed PSR-7/output buffer content creates a blocking issue.
+    If you are emitting content via `echo`, `print`, `var_dump`, etc., or not
+    catching PHP errors or exceptions, you will need to either fix your
+    application to always work with a PSR-7 response, or provide your own
+    emitters that allow mixed output mechanisms.
+
+### Deprecated
+
+- Nothing.
+
+### Removed
+
+- Nothing.
+
+### Fixed
+
+- Nothing.
+
+## 1.5.0 - 2017-08-22
+
+### Added
+
+- [#205](https://github.com/zendframework/zend-diactoros/pull/205) adds support
+  for PHP 7.2.
+
+- [#250](https://github.com/zendframework/zend-diactoros/pull/250) adds a new
+  API to `JsonResponse` to avoid the need for decoding the response body in
+  order to make changes to the underlying content. New methods include:
+  - `getPayload()`: retrieve the unencoded payload.
+  - `withPayload($data)`: create a new instance with the given data.
+  - `getEncodingOptions()`: retrieve the flags to use when encoding the payload
+    to JSON.
+  - `withEncodingOptions(int $encodingOptions)`: create a new instance that uses
+    the provided flags when encoding the payload to JSON.
+
+### Changed
+
+- [#249](https://github.com/zendframework/zend-diactoros/pull/249) changes the
+  behavior of the various `Uri::with*()` methods slightly: if the value
+  represents no change, these methods will return the same instance instead of a
+  new one.
+
+- [#248](https://github.com/zendframework/zend-diactoros/pull/248) changes the
+  behavior of `Uri::getUserInfo()` slightly: it now (correctly) returns the
+  percent-encoded values for the user and/or password, per RFC 3986 Section
+  3.2.1. `withUserInfo()` will percent-encode values, using a mechanism that
+  prevents double-encoding.
+
+- [#243](https://github.com/zendframework/zend-diactoros/pull/243) changes the
+  exception messages thrown by `UploadedFile::getStream()` and `moveTo()` when
+  an upload error exists to include details about the upload error.
+
+- [#233](https://github.com/zendframework/zend-diactoros/pull/233) adds a new
+  argument to `SapiStreamEmitter::emit`, `$maxBufferLevel` **between** the
+  `$response` and `$maxBufferLength` arguments. This was done because the
+  `Server::listen()` method passes only the response and `$maxBufferLevel` to
+  emitters; previously, this often meant that streams were being chunked 2 bytes
+  at a time versus the expected default of 8kb.
+
+  If you were calling the `SapiStreamEmitter::emit()` method manually
+  previously, you will need to update your code.
+
+### Deprecated
+
+- Nothing.
+
+### Removed
+
+- [#205](https://github.com/zendframework/zend-diactoros/pull/205) and
+  [#243](https://github.com/zendframework/zend-diactoros/pull/243) **remove
+  support for PHP versions prior to 5.6 as well as HHVM**.
+
+### Fixed
+
+- [#248](https://github.com/zendframework/zend-diactoros/pull/248) fixes how the
+  `Uri` class provides user-info within the URI authority; the value is now
+  correctly percent-encoded , per RFC 3986 Section 3.2.1.
+
+## 1.4.1 - 2017-08-17
+
+### Added
+
+- Nothing.
+
+### Deprecated
+
+- Nothing.
+
+### Removed
+
+- [#260](https://github.com/zendframework/zend-diactoros/pull/260) removes
+  support for HHVM, as tests have failed against it for some time.
+
+### Fixed
+
+- [#247](https://github.com/zendframework/zend-diactoros/pull/247) fixes the
+  `Stream` and `RelativeStream` `__toString()` method implementations to check
+  if the stream `isSeekable()` before attempting to `rewind()` it, ensuring that
+  the method does not raise exceptions (PHP does not allow exceptions in that
+  method). In particular, this fixes an issue when using AWS S3 streams.
+
+- [#252](https://github.com/zendframework/zend-diactoros/pull/252) provides a
+  fix to the `SapiEmitterTrait` to ensure that any `Set-Cookie` headers in the
+  response instance do not override those set by PHP when a session is created
+  and/or regenerated.
+
+- [#257](https://github.com/zendframework/zend-diactoros/pull/257) provides a
+  fix for the `PhpInputStream::read()` method to ensure string content that
+  evaluates as empty (including `0`) is still cached.
+
+- [#258](https://github.com/zendframework/zend-diactoros/pull/258) updates the
+  `Uri::filterPath()` method to allow parens within a URI path, per [RFC 3986
+  section 3.3](https://tools.ietf.org/html/rfc3986#section-3.3) (parens are
+  within the character set "sub-delims").
+
 ## 1.4.0 - 2017-04-06
 
 ### Added
diff --git a/vendor/zendframework/zend-diactoros/composer.json b/vendor/zendframework/zend-diactoros/composer.json
index 12e4a9f33e2fd6ff2fae1fb6163fde8fd8c9e72a..feb9aec2a769bdc506b06b37dc16cd8d19e8b637 100644
--- a/vendor/zendframework/zend-diactoros/composer.json
+++ b/vendor/zendframework/zend-diactoros/composer.json
@@ -13,21 +13,24 @@
     "issues": "https://github.com/zendframework/zend-diactoros/issues",
     "source": "https://github.com/zendframework/zend-diactoros"
   },
+  "config": {
+      "sort-packages": true
+  },
   "extra": {
     "branch-alias": {
-      "dev-master": "1.4-dev",
-      "dev-develop": "1.5-dev"
+      "dev-master": "1.6-dev",
+      "dev-develop": "1.7-dev"
     }
   },
   "require": {
-    "php": "^5.4 || ^7.0",
-    "psr/http-message": "~1.0"
+    "php": "^5.6 || ^7.0",
+    "psr/http-message": "^1.0"
   },
   "require-dev": {
-    "phpunit/phpunit": "^4.6 || ^5.5",
-    "zendframework/zend-coding-standard": "~1.0.0",
     "ext-dom": "*",
-    "ext-libxml": "*"
+    "ext-libxml": "*",
+    "phpunit/phpunit": "^5.7.16 || ^6.0.8",
+    "zendframework/zend-coding-standard": "~1.0"
   },
   "provide": {
     "psr/http-message-implementation": "1.0"
diff --git a/vendor/zendframework/zend-diactoros/src/HeaderSecurity.php b/vendor/zendframework/zend-diactoros/src/HeaderSecurity.php
index ecca716b10013f0de338a8a5a46a0f1dffa15d39..929db97dcb418e7e7e18234d6b09e34e99a33c38 100644
--- a/vendor/zendframework/zend-diactoros/src/HeaderSecurity.php
+++ b/vendor/zendframework/zend-diactoros/src/HeaderSecurity.php
@@ -1,9 +1,7 @@
 <?php
 /**
- * Zend Framework (http://framework.zend.com/)
- *
- * @see       http://github.com/zendframework/zend-diactoros for the canonical source repository
- * @copyright Copyright (c) 2015-2016 Zend Technologies USA Inc. (http://www.zend.com)
+ * @see       https://github.com/zendframework/zend-diactoros for the canonical source repository
+ * @copyright Copyright (c) 2015-2017 Zend Technologies USA Inc. (http://www.zend.com)
  * @license   https://github.com/zendframework/zend-diactoros/blob/master/LICENSE.md New BSD License
  */
 
diff --git a/vendor/zendframework/zend-diactoros/src/MessageTrait.php b/vendor/zendframework/zend-diactoros/src/MessageTrait.php
index 1c9768b54e1a84191d7bc0f0eb25c0bb0986850d..86860573e0cc3c1395c377b9142ae189440eb68d 100644
--- a/vendor/zendframework/zend-diactoros/src/MessageTrait.php
+++ b/vendor/zendframework/zend-diactoros/src/MessageTrait.php
@@ -1,9 +1,7 @@
 <?php
 /**
- * Zend Framework (http://framework.zend.com/)
- *
- * @see       http://github.com/zendframework/zend-diactoros for the canonical source repository
- * @copyright Copyright (c) 2015-2016 Zend Technologies USA Inc. (http://www.zend.com)
+ * @see       https://github.com/zendframework/zend-diactoros for the canonical source repository
+ * @copyright Copyright (c) 2015-2017 Zend Technologies USA Inc. (http://www.zend.com)
  * @license   https://github.com/zendframework/zend-diactoros/blob/master/LICENSE.md New BSD License
  */
 
diff --git a/vendor/zendframework/zend-diactoros/src/PhpInputStream.php b/vendor/zendframework/zend-diactoros/src/PhpInputStream.php
index 58bd1e4729284aca1244644fad1c3722f5b5e228..6dc8783a5b61de0abef449c960a9ebf76ff94862 100644
--- a/vendor/zendframework/zend-diactoros/src/PhpInputStream.php
+++ b/vendor/zendframework/zend-diactoros/src/PhpInputStream.php
@@ -1,9 +1,7 @@
 <?php
 /**
- * Zend Framework (http://framework.zend.com/)
- *
- * @see       http://github.com/zendframework/zend-diactoros for the canonical source repository
- * @copyright Copyright (c) 2015-2016 Zend Technologies USA Inc. (http://www.zend.com)
+ * @see       https://github.com/zendframework/zend-diactoros for the canonical source repository
+ * @copyright Copyright (c) 2015-2017 Zend Technologies USA Inc. (http://www.zend.com)
  * @license   https://github.com/zendframework/zend-diactoros/blob/master/LICENSE.md New BSD License
  */
 
@@ -59,7 +57,7 @@ class PhpInputStream extends Stream
     public function read($length)
     {
         $content = parent::read($length);
-        if ($content && ! $this->reachedEof) {
+        if (! $this->reachedEof) {
             $this->cache .= $content;
         }
 
diff --git a/vendor/zendframework/zend-diactoros/src/RelativeStream.php b/vendor/zendframework/zend-diactoros/src/RelativeStream.php
index 631c41e0fcb366c555697986aaf768284afb1a0d..10a9308af58983cc9f5b76616c02c17b13f279e7 100644
--- a/vendor/zendframework/zend-diactoros/src/RelativeStream.php
+++ b/vendor/zendframework/zend-diactoros/src/RelativeStream.php
@@ -1,9 +1,7 @@
 <?php
 /**
- * Zend Framework (http://framework.zend.com/)
- *
- * @see       http://github.com/zendframework/zend-diactoros for the canonical source repository
- * @copyright Copyright (c) 2015-2016 Zend Technologies USA Inc. (http://www.zend.com)
+ * @see       https://github.com/zendframework/zend-diactoros for the canonical source repository
+ * @copyright Copyright (c) 2015-2017 Zend Technologies USA Inc. (http://www.zend.com)
  * @license   https://github.com/zendframework/zend-diactoros/blob/master/LICENSE.md New BSD License
  */
 
@@ -48,7 +46,9 @@ final class RelativeStream implements StreamInterface
      */
     public function __toString()
     {
-        $this->seek(0);
+        if ($this->isSeekable()) {
+            $this->seek(0);
+        }
         return $this->getContents();
     }
 
diff --git a/vendor/zendframework/zend-diactoros/src/Request.php b/vendor/zendframework/zend-diactoros/src/Request.php
index 7680513602bf032bd5c5ce9c5838ebd4d8755ff8..aacc2dd31d5a4bd4c295d04c13890b6a36b68c44 100644
--- a/vendor/zendframework/zend-diactoros/src/Request.php
+++ b/vendor/zendframework/zend-diactoros/src/Request.php
@@ -1,9 +1,7 @@
 <?php
 /**
- * Zend Framework (http://framework.zend.com/)
- *
- * @see       http://github.com/zendframework/zend-diactoros for the canonical source repository
- * @copyright Copyright (c) 2015-2016 Zend Technologies USA Inc. (http://www.zend.com)
+ * @see       https://github.com/zendframework/zend-diactoros for the canonical source repository
+ * @copyright Copyright (c) 2015-2017 Zend Technologies USA Inc. (http://www.zend.com)
  * @license   https://github.com/zendframework/zend-diactoros/blob/master/LICENSE.md New BSD License
  */
 
diff --git a/vendor/zendframework/zend-diactoros/src/RequestTrait.php b/vendor/zendframework/zend-diactoros/src/RequestTrait.php
index 6117b98a7bbcb8108158e219ace777f6ad6498d3..d8062e9f2c11515bbda7486235b61483dd22b18d 100644
--- a/vendor/zendframework/zend-diactoros/src/RequestTrait.php
+++ b/vendor/zendframework/zend-diactoros/src/RequestTrait.php
@@ -1,9 +1,7 @@
 <?php
 /**
- * Zend Framework (http://framework.zend.com/)
- *
- * @see       http://github.com/zendframework/zend-diactoros for the canonical source repository
- * @copyright Copyright (c) 2015-2016 Zend Technologies USA Inc. (http://www.zend.com)
+ * @see       https://github.com/zendframework/zend-diactoros for the canonical source repository
+ * @copyright Copyright (c) 2015-2017 Zend Technologies USA Inc. (http://www.zend.com)
  * @license   https://github.com/zendframework/zend-diactoros/blob/master/LICENSE.md New BSD License
  */
 
diff --git a/vendor/zendframework/zend-diactoros/src/Response.php b/vendor/zendframework/zend-diactoros/src/Response.php
index cd22b5dbc0c80d6b8c0bbc4c56224c78c1c41d0e..830f90a15014aecdf89b7505ed6e0ca4ee7bc130 100644
--- a/vendor/zendframework/zend-diactoros/src/Response.php
+++ b/vendor/zendframework/zend-diactoros/src/Response.php
@@ -1,9 +1,7 @@
 <?php
 /**
- * Zend Framework (http://framework.zend.com/)
- *
- * @see       http://github.com/zendframework/zend-diactoros for the canonical source repository
- * @copyright Copyright (c) 2015-2016 Zend Technologies USA Inc. (http://www.zend.com)
+ * @see       https://github.com/zendframework/zend-diactoros for the canonical source repository
+ * @copyright Copyright (c) 2015-2017 Zend Technologies USA Inc. (http://www.zend.com)
  * @license   https://github.com/zendframework/zend-diactoros/blob/master/LICENSE.md New BSD License
  */
 
diff --git a/vendor/zendframework/zend-diactoros/src/Response/JsonResponse.php b/vendor/zendframework/zend-diactoros/src/Response/JsonResponse.php
index c8af7c4c2aba23b013456788352e64c6b2b78f2f..b20cbfafde96c9a38649481025a21b9b78c82709 100644
--- a/vendor/zendframework/zend-diactoros/src/Response/JsonResponse.php
+++ b/vendor/zendframework/zend-diactoros/src/Response/JsonResponse.php
@@ -1,9 +1,7 @@
 <?php
 /**
- * Zend Framework (http://framework.zend.com/)
- *
- * @see       http://github.com/zendframework/zend-diactoros for the canonical source repository
- * @copyright Copyright (c) 2015-2016 Zend Technologies USA Inc. (http://www.zend.com)
+ * @see       https://github.com/zendframework/zend-diactoros for the canonical source repository
+ * @copyright Copyright (c) 2015-2017 Zend Technologies USA Inc. (http://www.zend.com)
  * @license   https://github.com/zendframework/zend-diactoros/blob/master/LICENSE.md New BSD License
  */
 
@@ -35,6 +33,16 @@ class JsonResponse extends Response
      */
     const DEFAULT_JSON_FLAGS = 79;
 
+    /**
+     * @var mixed
+     */
+    private $payload;
+
+    /**
+     * @var int
+     */
+    private $encodingOptions;
+
     /**
      * Create a JSON response with the given data.
      *
@@ -59,15 +67,71 @@ class JsonResponse extends Response
         array $headers = [],
         $encodingOptions = self::DEFAULT_JSON_FLAGS
     ) {
-        $body = new Stream('php://temp', 'wb+');
-        $body->write($this->jsonEncode($data, $encodingOptions));
-        $body->rewind();
+        $this->setPayload($data);
+        $this->encodingOptions = $encodingOptions;
+
+        $json = $this->jsonEncode($data, $this->encodingOptions);
+        $body = $this->createBodyFromJson($json);
 
         $headers = $this->injectContentType('application/json', $headers);
 
         parent::__construct($body, $status, $headers);
     }
 
+    /**
+     * @return mixed
+     */
+    public function getPayload()
+    {
+        return $this->payload;
+    }
+
+    /**
+     * @param $data
+     *
+     * @return JsonResponse
+     */
+    public function withPayload($data)
+    {
+        $new = clone $this;
+        $new->setPayload($data);
+        return $this->updateBodyFor($new);
+    }
+
+    /**
+     * @return int
+     */
+    public function getEncodingOptions()
+    {
+        return $this->encodingOptions;
+    }
+
+    /**
+     * @param int $encodingOptions
+     *
+     * @return JsonResponse
+     */
+    public function withEncodingOptions($encodingOptions)
+    {
+        $new = clone $this;
+        $new->encodingOptions = $encodingOptions;
+        return $this->updateBodyFor($new);
+    }
+
+    /**
+     * @param string $json
+     *
+     * @return Stream
+     */
+    private function createBodyFromJson($json)
+    {
+        $body = new Stream('php://temp', 'wb+');
+        $body->write($json);
+        $body->rewind();
+
+        return $body;
+    }
+
     /**
      * Encode the provided data to JSON.
      *
@@ -97,4 +161,29 @@ class JsonResponse extends Response
 
         return $json;
     }
+
+    /**
+     * @param $data
+     */
+    private function setPayload($data)
+    {
+        if (is_object($data)) {
+            $data = clone $data;
+        }
+
+        $this->payload = $data;
+    }
+
+    /**
+     * Update the response body for the given instance.
+     *
+     * @param self $toUpdate Instance to update.
+     * @return JsonResponse Returns a new instance with an updated body.
+     */
+    private function updateBodyFor(self $toUpdate)
+    {
+        $json = $this->jsonEncode($toUpdate->payload, $toUpdate->encodingOptions);
+        $body = $this->createBodyFromJson($json);
+        return $toUpdate->withBody($body);
+    }
 }
diff --git a/vendor/zendframework/zend-diactoros/src/Response/SapiEmitter.php b/vendor/zendframework/zend-diactoros/src/Response/SapiEmitter.php
index a961342935b07a86aa39565ad2ae9e43c41e6a02..111e83be864cecff292ac9b0587a41fda8d48267 100644
--- a/vendor/zendframework/zend-diactoros/src/Response/SapiEmitter.php
+++ b/vendor/zendframework/zend-diactoros/src/Response/SapiEmitter.php
@@ -1,9 +1,7 @@
 <?php
 /**
- * Zend Framework (http://framework.zend.com/)
- *
- * @see       http://github.com/zendframework/zend-diactoros for the canonical source repository
- * @copyright Copyright (c) 2015-2016 Zend Technologies USA Inc. (http://www.zend.com)
+ * @see       https://github.com/zendframework/zend-diactoros for the canonical source repository
+ * @copyright Copyright (c) 2015-2017 Zend Technologies USA Inc. (http://www.zend.com)
  * @license   https://github.com/zendframework/zend-diactoros/blob/master/LICENSE.md New BSD License
  */
 
@@ -23,19 +21,13 @@ class SapiEmitter implements EmitterInterface
      * body content via the output buffer.
      *
      * @param ResponseInterface $response
-     * @param null|int $maxBufferLevel Maximum output buffering level to unwrap.
      */
-    public function emit(ResponseInterface $response, $maxBufferLevel = null)
+    public function emit(ResponseInterface $response)
     {
-        if (headers_sent()) {
-            throw new RuntimeException('Unable to emit response; headers already sent');
-        }
+        $this->assertNoPreviousOutput();
 
-        $response = $this->injectContentLength($response);
-
-        $this->emitStatusLine($response);
         $this->emitHeaders($response);
-        $this->flush($maxBufferLevel);
+        $this->emitStatusLine($response);
         $this->emitBody($response);
     }
 
diff --git a/vendor/zendframework/zend-diactoros/src/Response/SapiEmitterTrait.php b/vendor/zendframework/zend-diactoros/src/Response/SapiEmitterTrait.php
index bbfecfce2454f670fa2ad838570ddb49110b4473..ce9612c823152270658e0bd087bc308afb35bd13 100644
--- a/vendor/zendframework/zend-diactoros/src/Response/SapiEmitterTrait.php
+++ b/vendor/zendframework/zend-diactoros/src/Response/SapiEmitterTrait.php
@@ -1,35 +1,35 @@
 <?php
 /**
- * Zend Framework (http://framework.zend.com/)
- *
- * @see       http://github.com/zendframework/zend-diactoros for the canonical source repository
- * @copyright Copyright (c) 2015-2016 Zend Technologies USA Inc. (http://www.zend.com)
+ * @see       https://github.com/zendframework/zend-diactoros for the canonical source repository
+ * @copyright Copyright (c) 2015-2017 Zend Technologies USA Inc. (http://www.zend.com)
  * @license   https://github.com/zendframework/zend-diactoros/blob/master/LICENSE.md New BSD License
  */
 
 namespace Zend\Diactoros\Response;
 
 use Psr\Http\Message\ResponseInterface;
+use RuntimeException;
 
 trait SapiEmitterTrait
 {
     /**
-     * Inject the Content-Length header if is not already present.
+     * Checks to see if content has previously been sent.
      *
-     * @param ResponseInterface $response
-     * @return ResponseInterface
+     * If either headers have been sent or the output buffer contains content,
+     * raises an exception.
+     *
+     * @throws RuntimeException if headers have already been sent.
+     * @throws RuntimeException if output is present in the output buffer.
      */
-    private function injectContentLength(ResponseInterface $response)
+    private function assertNoPreviousOutput()
     {
-        if (! $response->hasHeader('Content-Length')) {
-            // PSR-7 indicates int OR null for the stream size; for null values,
-            // we will not auto-inject the Content-Length.
-            if (null !== $response->getBody()->getSize()) {
-                return $response->withHeader('Content-Length', (string) $response->getBody()->getSize());
-            }
+        if (headers_sent()) {
+            throw new RuntimeException('Unable to emit response; headers already sent');
         }
 
-        return $response;
+        if (ob_get_level() > 0 && ob_get_length() > 0) {
+            throw new RuntimeException('Output has been emitted previously; cannot emit response');
+        }
     }
 
     /**
@@ -38,17 +38,25 @@ trait SapiEmitterTrait
      * Emits the status line using the protocol version and status code from
      * the response; if a reason phrase is available, it, too, is emitted.
      *
+     * It is important to mention that this method should be called after
+     * `emitHeaders()` in order to prevent PHP from changing the status code of
+     * the emitted response.
+     *
      * @param ResponseInterface $response
+     *
+     * @see \Zend\Diactoros\Response\SapiEmitterTrait::emitHeaders()
      */
     private function emitStatusLine(ResponseInterface $response)
     {
         $reasonPhrase = $response->getReasonPhrase();
+        $statusCode   = $response->getStatusCode();
+
         header(sprintf(
             'HTTP/%s %d%s',
             $response->getProtocolVersion(),
-            $response->getStatusCode(),
+            $statusCode,
             ($reasonPhrase ? ' ' . $reasonPhrase : '')
-        ));
+        ), true, $statusCode);
     }
 
     /**
@@ -63,37 +71,22 @@ trait SapiEmitterTrait
      */
     private function emitHeaders(ResponseInterface $response)
     {
+        $statusCode = $response->getStatusCode();
+
         foreach ($response->getHeaders() as $header => $values) {
             $name  = $this->filterHeader($header);
-            $first = true;
+            $first = $name === 'Set-Cookie' ? false : true;
             foreach ($values as $value) {
                 header(sprintf(
                     '%s: %s',
                     $name,
                     $value
-                ), $first);
+                ), $first, $statusCode);
                 $first = false;
             }
         }
     }
 
-    /**
-     * Loops through the output buffer, flushing each, before emitting
-     * the response.
-     *
-     * @param int|null $maxBufferLevel Flush up to this buffer level.
-     */
-    private function flush($maxBufferLevel = null)
-    {
-        if (null === $maxBufferLevel) {
-            $maxBufferLevel = ob_get_level();
-        }
-
-        while (ob_get_level() > $maxBufferLevel) {
-            ob_end_flush();
-        }
-    }
-
     /**
      * Filter a header name to wordcase
      *
diff --git a/vendor/zendframework/zend-diactoros/src/Response/SapiStreamEmitter.php b/vendor/zendframework/zend-diactoros/src/Response/SapiStreamEmitter.php
index 02095e50b41162806cd57fe06b3746eae9d2aeda..e06c99f2afea3762aecf3674667ae8ac4db006ba 100644
--- a/vendor/zendframework/zend-diactoros/src/Response/SapiStreamEmitter.php
+++ b/vendor/zendframework/zend-diactoros/src/Response/SapiStreamEmitter.php
@@ -1,9 +1,7 @@
 <?php
 /**
- * Zend Framework (http://framework.zend.com/)
- *
- * @see       http://github.com/zendframework/zend-diactoros for the canonical source repository
- * @copyright Copyright (c) 2015-2016 Zend Technologies USA Inc. (http://www.zend.com)
+ * @see       https://github.com/zendframework/zend-diactoros for the canonical source repository
+ * @copyright Copyright (c) 2015-2017 Zend Technologies USA Inc. (http://www.zend.com)
  * @license   https://github.com/zendframework/zend-diactoros/blob/master/LICENSE.md New BSD License
  */
 
@@ -28,15 +26,9 @@ class SapiStreamEmitter implements EmitterInterface
      */
     public function emit(ResponseInterface $response, $maxBufferLength = 8192)
     {
-        if (headers_sent()) {
-            throw new RuntimeException('Unable to emit response; headers already sent');
-        }
-
-        $response = $this->injectContentLength($response);
-
-        $this->emitStatusLine($response);
+        $this->assertNoPreviousOutput();
         $this->emitHeaders($response);
-        $this->flush();
+        $this->emitStatusLine($response);
 
         $range = $this->parseContentRange($response->getHeaderLine('Content-Range'));
 
diff --git a/vendor/zendframework/zend-diactoros/src/Response/Serializer.php b/vendor/zendframework/zend-diactoros/src/Response/Serializer.php
index 1d48dc106a79a5abb950ac77920781c67a0a9a1f..03e6f4e2bcd6c74972450aec90c1f148a8b5f169 100644
--- a/vendor/zendframework/zend-diactoros/src/Response/Serializer.php
+++ b/vendor/zendframework/zend-diactoros/src/Response/Serializer.php
@@ -1,9 +1,7 @@
 <?php
 /**
- * Zend Framework (http://framework.zend.com/)
- *
- * @see       http://github.com/zendframework/zend-diactoros for the canonical source repository
- * @copyright Copyright (c) 2015-2016 Zend Technologies USA Inc. (http://www.zend.com)
+ * @see       https://github.com/zendframework/zend-diactoros for the canonical source repository
+ * @copyright Copyright (c) 2015-2017 Zend Technologies USA Inc. (http://www.zend.com)
  * @license   https://github.com/zendframework/zend-diactoros/blob/master/LICENSE.md New BSD License
  */
 
diff --git a/vendor/zendframework/zend-diactoros/src/Server.php b/vendor/zendframework/zend-diactoros/src/Server.php
index 768d7f38059145a822af11e2d017a8bbd74080e8..dfe84004ecc4cdaaeebcb931b5e8559dad13104e 100644
--- a/vendor/zendframework/zend-diactoros/src/Server.php
+++ b/vendor/zendframework/zend-diactoros/src/Server.php
@@ -1,9 +1,7 @@
 <?php
 /**
- * Zend Framework (http://framework.zend.com/)
- *
- * @see       http://github.com/zendframework/zend-diactoros for the canonical source repository
- * @copyright Copyright (c) 2015-2016 Zend Technologies USA Inc. (http://www.zend.com)
+ * @see       https://github.com/zendframework/zend-diactoros for the canonical source repository
+ * @copyright Copyright (c) 2015-2017 Zend Technologies USA Inc. (http://www.zend.com)
  * @license   https://github.com/zendframework/zend-diactoros/blob/master/LICENSE.md New BSD License
  */
 
@@ -150,24 +148,18 @@ class Server
      * If provided a $finalHandler, that callable will be used for
      * incomplete requests.
      *
-     * Output buffering is enabled prior to invoking the attached
-     * callback; any output buffered will be sent prior to any
-     * response body content.
-     *
      * @param null|callable $finalHandler
      */
     public function listen(callable $finalHandler = null)
     {
         $callback = $this->callback;
 
-        ob_start();
-        $bufferLevel = ob_get_level();
-
         $response = $callback($this->request, $this->response, $finalHandler);
         if (! $response instanceof ResponseInterface) {
             $response = $this->response;
         }
-        $this->getEmitter()->emit($response, $bufferLevel);
+
+        $this->getEmitter()->emit($response);
     }
 
     /**
diff --git a/vendor/zendframework/zend-diactoros/src/ServerRequest.php b/vendor/zendframework/zend-diactoros/src/ServerRequest.php
index ecd52b0dfab21871abf4e9725749bcdd04a4e560..0ac788690c4ba21222396d881619b1d4dd9605c0 100644
--- a/vendor/zendframework/zend-diactoros/src/ServerRequest.php
+++ b/vendor/zendframework/zend-diactoros/src/ServerRequest.php
@@ -1,9 +1,7 @@
 <?php
 /**
- * Zend Framework (http://framework.zend.com/)
- *
- * @see       http://github.com/zendframework/zend-diactoros for the canonical source repository
- * @copyright Copyright (c) 2015-2016 Zend Technologies USA Inc. (http://www.zend.com)
+ * @see       https://github.com/zendframework/zend-diactoros for the canonical source repository
+ * @copyright Copyright (c) 2015-2017 Zend Technologies USA Inc. (http://www.zend.com)
  * @license   https://github.com/zendframework/zend-diactoros/blob/master/LICENSE.md New BSD License
  */
 
diff --git a/vendor/zendframework/zend-diactoros/src/ServerRequestFactory.php b/vendor/zendframework/zend-diactoros/src/ServerRequestFactory.php
index e2ac59b668ea31561a06c4721f2c200437339aa5..3b76722228984b2d9f884e8ecab1c35aec58990d 100644
--- a/vendor/zendframework/zend-diactoros/src/ServerRequestFactory.php
+++ b/vendor/zendframework/zend-diactoros/src/ServerRequestFactory.php
@@ -1,9 +1,7 @@
 <?php
 /**
- * Zend Framework (http://framework.zend.com/)
- *
- * @see       http://github.com/zendframework/zend-diactoros for the canonical source repository
- * @copyright Copyright (c) 2015-2016 Zend Technologies USA Inc. (http://www.zend.com)
+ * @see       https://github.com/zendframework/zend-diactoros for the canonical source repository
+ * @copyright Copyright (c) 2015-2017 Zend Technologies USA Inc. (http://www.zend.com)
  * @license   https://github.com/zendframework/zend-diactoros/blob/master/LICENSE.md New BSD License
  */
 
diff --git a/vendor/zendframework/zend-diactoros/src/Stream.php b/vendor/zendframework/zend-diactoros/src/Stream.php
index 6a04e2b9b1854119f5b16fa8a705e66187cda5a7..8b597f97bf580c330c993d10ecec226c264b452b 100644
--- a/vendor/zendframework/zend-diactoros/src/Stream.php
+++ b/vendor/zendframework/zend-diactoros/src/Stream.php
@@ -1,9 +1,7 @@
 <?php
 /**
- * Zend Framework (http://framework.zend.com/)
- *
- * @see       http://github.com/zendframework/zend-diactoros for the canonical source repository
- * @copyright Copyright (c) 2015-2016 Zend Technologies USA Inc. (http://www.zend.com)
+ * @see       https://github.com/zendframework/zend-diactoros for the canonical source repository
+ * @copyright Copyright (c) 2015-2017 Zend Technologies USA Inc. (http://www.zend.com)
  * @license   https://github.com/zendframework/zend-diactoros/blob/master/LICENSE.md New BSD License
  */
 
@@ -48,7 +46,10 @@ class Stream implements StreamInterface
         }
 
         try {
-            $this->rewind();
+            if ($this->isSeekable()) {
+                $this->rewind();
+            }
+
             return $this->getContents();
         } catch (RuntimeException $e) {
             return '';
diff --git a/vendor/zendframework/zend-diactoros/src/UploadedFile.php b/vendor/zendframework/zend-diactoros/src/UploadedFile.php
index 767724b8a9a9174a340facf8c5db3003a525b7c2..f1f34aec53f8322b2e14b29ba3714416a8c11c58 100644
--- a/vendor/zendframework/zend-diactoros/src/UploadedFile.php
+++ b/vendor/zendframework/zend-diactoros/src/UploadedFile.php
@@ -1,9 +1,7 @@
 <?php
 /**
- * Zend Framework (http://framework.zend.com/)
- *
- * @see       http://github.com/zendframework/zend-diactoros for the canonical source repository
- * @copyright Copyright (c) 2015-2016 Zend Technologies USA Inc. (http://www.zend.com)
+ * @see       https://github.com/zendframework/zend-diactoros for the canonical source repository
+ * @copyright Copyright (c) 2015-2017 Zend Technologies USA Inc. (http://www.zend.com)
  * @license   https://github.com/zendframework/zend-diactoros/blob/master/LICENSE.md New BSD License
  */
 
@@ -16,13 +14,25 @@ use RuntimeException;
 
 class UploadedFile implements UploadedFileInterface
 {
+    const ERROR_MESSAGES = [
+        UPLOAD_ERR_OK         => 'There is no error, the file uploaded with success',
+        UPLOAD_ERR_INI_SIZE   => 'The uploaded file exceeds the upload_max_filesize directive in php.ini',
+        UPLOAD_ERR_FORM_SIZE  => 'The uploaded file exceeds the MAX_FILE_SIZE directive that was '
+            . 'specified in the HTML form',
+        UPLOAD_ERR_PARTIAL    => 'The uploaded file was only partially uploaded',
+        UPLOAD_ERR_NO_FILE    => 'No file was uploaded',
+        UPLOAD_ERR_NO_TMP_DIR => 'Missing a temporary folder',
+        UPLOAD_ERR_CANT_WRITE => 'Failed to write file to disk',
+        UPLOAD_ERR_EXTENSION  => 'A PHP extension stopped the file upload.',
+    ];
+
     /**
-     * @var string
+     * @var string|null
      */
     private $clientFilename;
 
     /**
-     * @var string
+     * @var string|null
      */
     private $clientMediaType;
 
@@ -114,7 +124,10 @@ class UploadedFile implements UploadedFileInterface
     public function getStream()
     {
         if ($this->error !== UPLOAD_ERR_OK) {
-            throw new RuntimeException('Cannot retrieve stream due to upload error');
+            throw new RuntimeException(sprintf(
+                'Cannot retrieve stream due to upload error: %s',
+                self::ERROR_MESSAGES[$this->error]
+            ));
         }
 
         if ($this->moved) {
@@ -147,7 +160,10 @@ class UploadedFile implements UploadedFileInterface
         }
 
         if ($this->error !== UPLOAD_ERR_OK) {
-            throw new RuntimeException('Cannot retrieve stream due to upload error');
+            throw new RuntimeException(sprintf(
+                'Cannot retrieve stream due to upload error: %s',
+                self::ERROR_MESSAGES[$this->error]
+            ));
         }
 
         if (! is_string($targetPath) || empty($targetPath)) {
diff --git a/vendor/zendframework/zend-diactoros/src/Uri.php b/vendor/zendframework/zend-diactoros/src/Uri.php
index 969c99bfa9ef97e821b6815dc5787f8c3d48c397..fdfbcb7cc5820d021e5336c5c5adf5c95951583a 100644
--- a/vendor/zendframework/zend-diactoros/src/Uri.php
+++ b/vendor/zendframework/zend-diactoros/src/Uri.php
@@ -1,9 +1,7 @@
 <?php
 /**
- * Zend Framework (http://framework.zend.com/)
- *
- * @see       http://github.com/zendframework/zend-diactoros for the canonical source repository
- * @copyright Copyright (c) 2015-2016 Zend Technologies USA Inc. (http://www.zend.com)
+ * @see       https://github.com/zendframework/zend-diactoros for the canonical source repository
+ * @copyright Copyright (c) 2015-2017 Zend Technologies USA Inc. (http://www.zend.com)
  * @license   https://github.com/zendframework/zend-diactoros/blob/master/LICENSE.md New BSD License
  */
 
@@ -25,14 +23,14 @@ use Psr\Http\Message\UriInterface;
 class Uri implements UriInterface
 {
     /**
-     * Sub-delimiters used in query strings and fragments.
+     * Sub-delimiters used in user info, query strings and fragments.
      *
      * @const string
      */
     const CHAR_SUB_DELIMS = '!\$&\'\(\)\*\+,;=';
 
     /**
-     * Unreserved characters used in paths, query strings, and fragments.
+     * Unreserved characters used in user info, paths, query strings, and fragments.
      *
      * @const string
      */
@@ -166,6 +164,10 @@ class Uri implements UriInterface
     }
 
     /**
+     * Retrieve the user-info part of the URI.
+     *
+     * This value is percent-encoded, per RFC 3986 Section 3.2.1.
+     *
      * {@inheritdoc}
      */
     public function getUserInfo()
@@ -232,7 +234,7 @@ class Uri implements UriInterface
 
         if ($scheme === $this->scheme) {
             // Do nothing if no change was made.
-            return clone $this;
+            return $this;
         }
 
         $new = clone $this;
@@ -242,6 +244,11 @@ class Uri implements UriInterface
     }
 
     /**
+     * Create and return a new instance containing the provided user credentials.
+     *
+     * The value will be percent-encoded in the new instance, but with measures
+     * taken to prevent double-encoding.
+     *
      * {@inheritdoc}
      */
     public function withUserInfo($user, $password = null)
@@ -261,14 +268,14 @@ class Uri implements UriInterface
             ));
         }
 
-        $info = $user;
+        $info = $this->filterUserInfoPart($user);
         if ($password) {
-            $info .= ':' . $password;
+            $info .= ':' . $this->filterUserInfoPart($password);
         }
 
         if ($info === $this->userInfo) {
             // Do nothing if no change was made.
-            return clone $this;
+            return $this;
         }
 
         $new = clone $this;
@@ -292,7 +299,7 @@ class Uri implements UriInterface
 
         if ($host === $this->host) {
             // Do nothing if no change was made.
-            return clone $this;
+            return $this;
         }
 
         $new = clone $this;
@@ -319,7 +326,7 @@ class Uri implements UriInterface
 
         if ($port === $this->port) {
             // Do nothing if no change was made.
-            return clone $this;
+            return $this;
         }
 
         if ($port !== null && $port < 1 || $port > 65535) {
@@ -362,7 +369,7 @@ class Uri implements UriInterface
 
         if ($path === $this->path) {
             // Do nothing if no change was made.
-            return clone $this;
+            return $this;
         }
 
         $new = clone $this;
@@ -392,7 +399,7 @@ class Uri implements UriInterface
 
         if ($query === $this->query) {
             // Do nothing if no change was made.
-            return clone $this;
+            return $this;
         }
 
         $new = clone $this;
@@ -418,7 +425,7 @@ class Uri implements UriInterface
 
         if ($fragment === $this->fragment) {
             // Do nothing if no change was made.
-            return clone $this;
+            return $this;
         }
 
         $new = clone $this;
@@ -443,7 +450,7 @@ class Uri implements UriInterface
         }
 
         $this->scheme    = isset($parts['scheme']) ? $this->filterScheme($parts['scheme']) : '';
-        $this->userInfo  = isset($parts['user']) ? $parts['user'] : '';
+        $this->userInfo  = isset($parts['user']) ? $this->filterUserInfoPart($parts['user']) : '';
         $this->host      = isset($parts['host']) ? $parts['host'] : '';
         $this->port      = isset($parts['port']) ? $parts['port'] : null;
         $this->path      = isset($parts['path']) ? $this->filterPath($parts['path']) : '';
@@ -547,6 +554,23 @@ class Uri implements UriInterface
         return $scheme;
     }
 
+    /**
+     * Filters a part of user info in a URI to ensure it is properly encoded.
+     *
+     * @param string $part
+     * @return string
+     */
+    private function filterUserInfoPart($part)
+    {
+        // Note the addition of `%` to initial charset; this allows `|` portion
+        // to match and thus prevent double-encoding.
+        return preg_replace_callback(
+            '/(?:[^%' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . ']+|%(?![A-Fa-f0-9]{2}))/u',
+            [$this, 'urlEncodeChar'],
+            $part
+        );
+    }
+
     /**
      * Filters the path of a URI to ensure it is properly encoded.
      *
@@ -556,7 +580,7 @@ class Uri implements UriInterface
     private function filterPath($path)
     {
         $path = preg_replace_callback(
-            '/(?:[^' . self::CHAR_UNRESERVED . ':@&=\+\$,\/;%]+|%(?![A-Fa-f0-9]{2}))/u',
+            '/(?:[^' . self::CHAR_UNRESERVED . ')(:@&=\+\$,\/;%]+|%(?![A-Fa-f0-9]{2}))/u',
             [$this, 'urlEncodeChar'],
             $path
         );
@@ -624,7 +648,7 @@ class Uri implements UriInterface
     /**
      * Filter a fragment value to ensure it is properly encoded.
      *
-     * @param null|string $fragment
+     * @param string $fragment
      * @return string
      */
     private function filterFragment($fragment)
diff --git a/vendor/zendframework/zend-inputfilter/CHANGELOG.md b/vendor/zendframework/zend-inputfilter/CHANGELOG.md
index 0a4ecb39da8eb087e4ad063d5866c2cf95670b32..96dc2cde3ae8c53dbb7186a4f5795e249ac8e409 100644
--- a/vendor/zendframework/zend-inputfilter/CHANGELOG.md
+++ b/vendor/zendframework/zend-inputfilter/CHANGELOG.md
@@ -2,6 +2,42 @@
 
 All notable changes to this project will be documented in this file, in reverse chronological order by release.
 
+## 2.7.5 - 2017-11-07
+
+### Added
+
+- Nothing.
+
+### Deprecated
+
+- Nothing.
+
+### Removed
+
+- Nothing.
+
+### Fixed
+
+- [#151](https://github.com/zendframework/zend-inputfilter/pull/151) fixes an
+  issue in `Factory::createInput()` introduced in
+  [#2](https://github.com/zendframework/zend-inputfilter/pull/2) whereby an
+  input pulled from the input filter manager would be injected with the default
+  filter and validator chains, overwriting any chains that were set during
+  instantiation and/or `init()`. They are now never overwritten.
+
+- [#149](https://github.com/zendframework/zend-inputfilter/pull/149) fixes an
+  issue with how error messages for collection input field items were reported;
+  previously, as soon as one item in the collection failed, the same validation
+  message was propagated to all other items. This is now resolved.
+
+- [#131](https://github.com/zendframework/zend-inputfilter/pull/131) fixes a
+  regression introduced in version 2.2.6 within
+  `BaseInputFilter::setValidatorGroup()` whereby it began emitting exceptions if
+  a given input was not an input filter. This raises issues when mixing input
+  filters and inputs in the same validator group specification, as you will
+  generally provide the input names as keys instead of values. The patch provide
+  ensures both styles work going forwards.
+
 ## 2.7.4 - 2017-05-18
 
 ### Added
diff --git a/vendor/zendframework/zend-inputfilter/src/BaseInputFilter.php b/vendor/zendframework/zend-inputfilter/src/BaseInputFilter.php
index 76765276fcbf29df36e803d07e0d4ff84810b13d..f3c52156da3b9edc53e2c66a2215e02303862067 100644
--- a/vendor/zendframework/zend-inputfilter/src/BaseInputFilter.php
+++ b/vendor/zendframework/zend-inputfilter/src/BaseInputFilter.php
@@ -309,17 +309,10 @@ class BaseInputFilter implements
 
                 $inputs[] = $key;
 
-                if (! $this->inputs[$key] instanceof InputFilterInterface) {
-                    throw new Exception\InvalidArgumentException(
-                        sprintf(
-                            'Input "%s" must implement InputFilterInterface',
-                            $key
-                        )
-                    );
+                if ($this->inputs[$key] instanceof InputFilterInterface) {
+                    // Recursively populate validation groups for sub input filters
+                    $this->inputs[$key]->setValidationGroup($value);
                 }
-
-                // Recursively populate validation groups for sub input filters
-                $this->inputs[$key]->setValidationGroup($value);
             }
         } else {
             $inputs = func_get_args();
diff --git a/vendor/zendframework/zend-inputfilter/src/CollectionInputFilter.php b/vendor/zendframework/zend-inputfilter/src/CollectionInputFilter.php
index 78a938a83f476317bcd55b3694341501df210188..38d425cff04d78a38bdbcc9623f74394aa039272 100644
--- a/vendor/zendframework/zend-inputfilter/src/CollectionInputFilter.php
+++ b/vendor/zendframework/zend-inputfilter/src/CollectionInputFilter.php
@@ -169,6 +169,7 @@ class CollectionInputFilter extends InputFilter
      */
     public function isValid()
     {
+        $this->collectionMessages = [];
         $inputFilter = $this->getInputFilter();
         $valid = true;
 
diff --git a/vendor/zendframework/zend-inputfilter/src/Factory.php b/vendor/zendframework/zend-inputfilter/src/Factory.php
index ca524c06bf9ac116931ed52a9ef58234a129f47b..0a0d38ac18376067352573aeca2062d08e3fcb41 100644
--- a/vendor/zendframework/zend-inputfilter/src/Factory.php
+++ b/vendor/zendframework/zend-inputfilter/src/Factory.php
@@ -189,10 +189,10 @@ class Factory
             ));
         }
 
-        if ($this->defaultFilterChain) {
+        if (! $managerInstance && $this->defaultFilterChain) {
             $input->setFilterChain(clone $this->defaultFilterChain);
         }
-        if ($this->defaultValidatorChain) {
+        if (! $managerInstance && $this->defaultValidatorChain) {
             $input->setValidatorChain(clone $this->defaultValidatorChain);
         }