diff --git a/core/composer.json b/core/composer.json
index eaf5983..e7b5ad8 100644
--- a/core/composer.json
+++ b/core/composer.json
@@ -10,6 +10,7 @@
     "symfony/http-kernel": "2.1.*",
     "symfony/routing": "2.1.*",
     "symfony/serializer": "2.1.*",
+    "symfony/validator": "2.2.x-dev",
     "symfony/yaml": "2.1.*",
     "twig/twig": "1.8.*",
     "doctrine/common": "2.3.*",
diff --git a/core/composer.lock b/core/composer.lock
index 5c8cd01..f23e3aa 100644
--- a/core/composer.lock
+++ b/core/composer.lock
@@ -1,53 +1,752 @@
 {
-    "hash": "be2e79923e2be0777a9f60ec185168a8",
+    "hash": "f5469452a76a6eeb9619f86d3d4a61fa",
     "packages": [
         {
-            "package": "doctrine/common",
-            "version": "2.3.0-RC2"
+            "name": "doctrine/common",
+            "version": "2.3.0-RC2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/common",
+                "reference": "2.3.0-RC2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://github.com/doctrine/common/zipball/2.3.0-RC2",
+                "reference": "2.3.0-RC2",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.2"
+            },
+            "time": "2012-08-29 13:06:32",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.3.x-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-0": {
+                    "Doctrine\\Common": "lib/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jonathan Wage",
+                    "email": "jonwage@gmail.com",
+                    "homepage": "http://www.jwage.com/",
+                    "role": null
+                },
+                {
+                    "name": "Guilherme Blanco",
+                    "email": "guilhermeblanco@gmail.com",
+                    "homepage": null,
+                    "role": null
+                },
+                {
+                    "name": "Roman Borschel",
+                    "email": "roman@code-factory.org",
+                    "homepage": null,
+                    "role": null
+                },
+                {
+                    "name": "Benjamin Eberlei",
+                    "email": "kontakt@beberlei.de",
+                    "homepage": null,
+                    "role": null
+                },
+                {
+                    "name": "Johannes Schmitt",
+                    "email": "schmittjoh@gmail.com",
+                    "homepage": "http://jmsyst.com",
+                    "role": "Developer of wrapped JMSSerializerBundle"
+                }
+            ],
+            "description": "Common Library for Doctrine projects",
+            "homepage": "http://www.doctrine-project.org",
+            "keywords": [
+                "collections",
+                "spl",
+                "eventmanager",
+                "annotations",
+                "persistence"
+            ]
         },
         {
-            "package": "symfony/class-loader",
-            "version": "v2.1.0-RC2"
+            "name": "kriswallsmith/assetic",
+            "version": "v1.1.0-alpha1",
+            "source": {
+                "type": "git",
+                "url": "http://github.com/kriswallsmith/assetic.git",
+                "reference": "v1.1.0-alpha1"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://github.com/kriswallsmith/assetic/zipball/v1.1.0-alpha1",
+                "reference": "v1.1.0-alpha1",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.1",
+                "symfony/process": "2.1.*"
+            },
+            "require-dev": {
+                "twig/twig": ">=1.6.0,<2.0",
+                "leafo/lessphp": "*",
+                "leafo/scssphp": "*",
+                "ptachoire/cssembed": "*"
+            },
+            "suggest": {
+                "twig/twig": "Assetic provides the integration with the Twig templating engine",
+                "leafo/lessphp": "Assetic provides the integration with the lessphp LESS compiler",
+                "leafo/scssphp": "Assetic provides the integration with the scssphp SCSS compiler",
+                "ptachoire/cssembed": "Assetic provides the integration with phpcssembed to embed data uris"
+            },
+            "time": "2012-08-28 05:33:44",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-0": {
+                    "Assetic": "src/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Kris Wallsmith",
+                    "email": "kris.wallsmith@gmail.com",
+                    "homepage": "http://kriswallsmith.net/"
+                }
+            ],
+            "description": "Asset Management for PHP",
+            "homepage": "https://github.com/kriswallsmith/assetic",
+            "keywords": [
+                "assets",
+                "compression",
+                "minification"
+            ]
         },
         {
-            "package": "symfony/dependency-injection",
-            "version": "v2.1.0-RC2"
+            "name": "symfony/class-loader",
+            "version": "v2.1.0-RC2",
+            "target-dir": "Symfony/Component/ClassLoader",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/ClassLoader",
+                "reference": "v2.1.0-RC2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://github.com/symfony/ClassLoader/zipball/v2.1.0-RC2",
+                "reference": "v2.1.0-RC2",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "symfony/finder": "2.1.*"
+            },
+            "time": "2012-08-27 14:51:49",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.1-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\ClassLoader": ""
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com",
+                    "homepage": null,
+                    "role": null
+                },
+                {
+                    "name": "Symfony Community",
+                    "email": null,
+                    "homepage": "http://symfony.com/contributors",
+                    "role": null
+                }
+            ],
+            "description": "Symfony ClassLoader Component",
+            "homepage": "http://symfony.com"
         },
         {
-            "package": "symfony/event-dispatcher",
-            "version": "v2.1.0-RC2"
+            "name": "symfony/dependency-injection",
+            "version": "v2.1.0-RC2",
+            "target-dir": "Symfony/Component/DependencyInjection",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/DependencyInjection",
+                "reference": "v2.1.0-RC2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://github.com/symfony/DependencyInjection/zipball/v2.1.0-RC2",
+                "reference": "v2.1.0-RC2",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "symfony/yaml": "2.1.*",
+                "symfony/config": "2.1.*"
+            },
+            "suggest": {
+                "symfony/yaml": "v2.1.0-RC2",
+                "symfony/config": "v2.1.0-RC2"
+            },
+            "time": "2012-08-28 06:54:42",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.1-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\DependencyInjection": ""
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com",
+                    "homepage": null,
+                    "role": null
+                },
+                {
+                    "name": "Symfony Community",
+                    "email": null,
+                    "homepage": "http://symfony.com/contributors",
+                    "role": null
+                }
+            ],
+            "description": "Symfony DependencyInjection Component",
+            "homepage": "http://symfony.com"
         },
         {
-            "package": "symfony/http-foundation",
-            "version": "v2.1.0-RC2"
+            "name": "symfony/event-dispatcher",
+            "version": "v2.1.0-RC2",
+            "target-dir": "Symfony/Component/EventDispatcher",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/EventDispatcher",
+                "reference": "v2.1.0-RC2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://github.com/symfony/EventDispatcher/zipball/v2.1.0-RC2",
+                "reference": "v2.1.0-RC2",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "symfony/dependency-injection": "2.1.*"
+            },
+            "suggest": {
+                "symfony/dependency-injection": "v2.1.0-RC2",
+                "symfony/http-kernel": "v2.1.0-RC2"
+            },
+            "time": "2012-08-22 12:48:41",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.1-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\EventDispatcher": ""
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com",
+                    "homepage": null,
+                    "role": null
+                },
+                {
+                    "name": "Symfony Community",
+                    "email": null,
+                    "homepage": "http://symfony.com/contributors",
+                    "role": null
+                }
+            ],
+            "description": "Symfony EventDispatcher Component",
+            "homepage": "http://symfony.com"
         },
         {
-            "package": "symfony/http-kernel",
-            "version": "v2.1.0-RC2"
+            "name": "symfony/http-foundation",
+            "version": "v2.1.0-RC2",
+            "target-dir": "Symfony/Component/HttpFoundation",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/HttpFoundation",
+                "reference": "v2.1.0-RC2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://github.com/symfony/HttpFoundation/zipball/v2.1.0-RC2",
+                "reference": "v2.1.0-RC2",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "time": "2012-08-22 12:48:41",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.1-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\HttpFoundation": "",
+                    "SessionHandlerInterface": "Symfony/Component/HttpFoundation/Resources/stubs"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com",
+                    "homepage": null,
+                    "role": null
+                },
+                {
+                    "name": "Symfony Community",
+                    "email": null,
+                    "homepage": "http://symfony.com/contributors",
+                    "role": null
+                }
+            ],
+            "description": "Symfony HttpFoundation Component",
+            "homepage": "http://symfony.com"
         },
         {
-            "package": "symfony/process",
-            "version": "v2.1.0-RC2"
+            "name": "symfony/http-kernel",
+            "version": "v2.1.0-RC2",
+            "target-dir": "Symfony/Component/HttpKernel",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/HttpKernel",
+                "reference": "v2.1.0-RC2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://github.com/symfony/HttpKernel/zipball/v2.1.0-RC2",
+                "reference": "v2.1.0-RC2",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "symfony/event-dispatcher": "2.1.*",
+                "symfony/http-foundation": "2.1.*"
+            },
+            "require-dev": {
+                "symfony/browser-kit": "2.1.*",
+                "symfony/class-loader": "2.1.*",
+                "symfony/config": "2.1.*",
+                "symfony/console": "2.1.*",
+                "symfony/dependency-injection": "2.1.*",
+                "symfony/finder": "2.1.*",
+                "symfony/process": "2.1.*",
+                "symfony/routing": "2.1.*"
+            },
+            "suggest": {
+                "symfony/browser-kit": "v2.1.0-RC2",
+                "symfony/class-loader": "v2.1.0-RC2",
+                "symfony/config": "v2.1.0-RC2",
+                "symfony/console": "v2.1.0-RC2",
+                "symfony/dependency-injection": "v2.1.0-RC2",
+                "symfony/finder": "v2.1.0-RC2"
+            },
+            "time": "2012-08-28 07:00:18",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.1-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\HttpKernel": ""
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com",
+                    "homepage": null,
+                    "role": null
+                },
+                {
+                    "name": "Symfony Community",
+                    "email": null,
+                    "homepage": "http://symfony.com/contributors",
+                    "role": null
+                }
+            ],
+            "description": "Symfony HttpKernel Component",
+            "homepage": "http://symfony.com"
         },
         {
-            "package": "symfony/routing",
-            "version": "v2.1.0-RC2"
+            "name": "symfony/process",
+            "version": "v2.1.0-RC2",
+            "target-dir": "Symfony/Component/Process",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/Process",
+                "reference": "v2.1.0-RC2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://github.com/symfony/Process/zipball/v2.1.0-RC2",
+                "reference": "v2.1.0-RC2",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "time": "2012-08-26 06:13:51",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.1-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\Process": ""
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Process Component",
+            "homepage": "http://symfony.com"
         },
         {
-            "package": "symfony/serializer",
-            "version": "v2.1.2"
+            "name": "symfony/routing",
+            "version": "v2.1.0-RC2",
+            "target-dir": "Symfony/Component/Routing",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/Routing",
+                "reference": "v2.1.0-RC2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://github.com/symfony/Routing/zipball/v2.1.0-RC2",
+                "reference": "v2.1.0-RC2",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "symfony/config": "2.1.*",
+                "symfony/yaml": "2.1.*",
+                "symfony/http-kernel": "2.1.*",
+                "doctrine/common": ">=2.2,<2.4-dev"
+            },
+            "suggest": {
+                "symfony/config": "v2.1.0-RC2",
+                "symfony/yaml": "v2.1.0-RC2",
+                "doctrine/common": ">=2.2,<2.4-dev"
+            },
+            "time": "2012-08-28 06:54:42",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.1-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\Routing": ""
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com",
+                    "homepage": null,
+                    "role": null
+                },
+                {
+                    "name": "Symfony Community",
+                    "email": null,
+                    "homepage": "http://symfony.com/contributors",
+                    "role": null
+                }
+            ],
+            "description": "Symfony Routing Component",
+            "homepage": "http://symfony.com"
         },
         {
-            "package": "symfony/yaml",
-            "version": "v2.1.0-RC2"
+            "name": "symfony/serializer",
+            "version": "v2.1.2",
+            "target-dir": "Symfony/Component/Serializer",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/Serializer",
+                "reference": "v2.1.2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://github.com/symfony/Serializer/zipball/v2.1.2",
+                "reference": "v2.1.2",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "time": "2012-08-28 00:54:42",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.1-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\Serializer": ""
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Serializer Component",
+            "homepage": "http://symfony.com"
         },
         {
-            "package": "twig/twig",
-            "version": "v1.8.3"
+            "name": "symfony/validator",
+            "version": "dev-master",
+            "target-dir": "Symfony/Component/Validator",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/Validator",
+                "reference": "0c335f22c8d25de7bb68e56f3927e775640822dd"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://github.com/symfony/Validator/archive/0c335f22c8d25de7bb68e56f3927e775640822dd.zip",
+                "reference": "0c335f22c8d25de7bb68e56f3927e775640822dd",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "symfony/http-foundation": "2.2.*",
+                "symfony/locale": "2.2.*",
+                "symfony/yaml": "2.2.*"
+            },
+            "suggest": {
+                "doctrine/common": ">=2.1,<2.4-dev",
+                "symfony/http-foundation": "2.2.*",
+                "symfony/yaml": "2.2.*"
+            },
+            "time": "2012-11-24 12:18:53",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.2-dev"
+                }
+            },
+            "installation-source": "source",
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\Validator\\": ""
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Validator Component",
+            "homepage": "http://symfony.com"
         },
         {
-            "package": "kriswallsmith/assetic",
-            "version": "v1.1.0-alpha1"
+            "name": "symfony/yaml",
+            "version": "v2.1.0-RC2",
+            "target-dir": "Symfony/Component/Yaml",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/Yaml",
+                "reference": "v2.1.0-RC2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://github.com/symfony/Yaml/zipball/v2.1.0-RC2",
+                "reference": "v2.1.0-RC2",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "time": "2012-08-22 12:48:41",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.1-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\Yaml": ""
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com",
+                    "homepage": null,
+                    "role": null
+                },
+                {
+                    "name": "Symfony Community",
+                    "email": null,
+                    "homepage": "http://symfony.com/contributors",
+                    "role": null
+                }
+            ],
+            "description": "Symfony Yaml Component",
+            "homepage": "http://symfony.com"
+        },
+        {
+            "name": "twig/twig",
+            "version": "v1.8.3",
+            "source": {
+                "type": "git",
+                "url": "git://github.com/fabpot/Twig.git",
+                "reference": "v1.8.3"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://github.com/fabpot/Twig/zipball/v1.8.3",
+                "reference": "v1.8.3",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.2.4"
+            },
+            "time": "2012-06-18 18:48:16",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.8-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-0": {
+                    "Twig_": "lib/"
+                }
+            },
+            "license": [
+                "BSD-3"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com",
+                    "homepage": null,
+                    "role": null
+                },
+                {
+                    "name": "Armin Ronacher",
+                    "email": "armin.ronacher@active-4.com",
+                    "homepage": null,
+                    "role": null
+                }
+            ],
+            "description": "Twig, the flexible, fast, and secure template language for PHP",
+            "homepage": "http://twig.sensiolabs.org",
+            "keywords": [
+                "templating"
+            ]
         }
     ],
     "packages-dev": null,
@@ -55,7 +754,7 @@
 
     ],
     "minimum-stability": "alpha",
-    "stability-flags": [
-
-    ]
+    "stability-flags": {
+        "symfony/validator": 20
+    }
 }
diff --git a/core/lib/Drupal/Core/CoreBundle.php b/core/lib/Drupal/Core/CoreBundle.php
index 71ef37b..1176d32 100644
--- a/core/lib/Drupal/Core/CoreBundle.php
+++ b/core/lib/Drupal/Core/CoreBundle.php
@@ -104,6 +104,8 @@ public function build(ContainerBuilder $container) {
       ->setFactoryMethod('getConnection')
       ->addArgument('slave');
     $container->register('typed_data', 'Drupal\Core\TypedData\TypedDataManager');
+    $container->register('validation.constraint', 'Drupal\Core\Validation\ConstraintManager');
+
     // Add the user's storage for temporary, non-cache data.
     $container->register('lock', 'Drupal\Core\Lock\DatabaseLockBackend');
     $container->register('user.tempstore', 'Drupal\user\TempStoreFactory')
diff --git a/core/lib/Drupal/Core/Entity/EntityNG.php b/core/lib/Drupal/Core/Entity/EntityNG.php
index 35ef89d..6c1baeb 100644
--- a/core/lib/Drupal/Core/Entity/EntityNG.php
+++ b/core/lib/Drupal/Core/Entity/EntityNG.php
@@ -164,8 +164,8 @@ public function getPropertyDefinition($name) {
    */
   public function getPropertyDefinitions() {
     return entity_get_controller($this->entityType)->getFieldDefinitions(array(
-      'entity type' => $this->entityType,
-      'bundle' => $this->bundle(),
+      'EntityType' => $this->entityType,
+      'Bundle' => $this->bundle(),
     ));
   }
 
diff --git a/core/lib/Drupal/Core/Entity/EntityStorageControllerInterface.php b/core/lib/Drupal/Core/Entity/EntityStorageControllerInterface.php
index f5a596d..c1977ed 100644
--- a/core/lib/Drupal/Core/Entity/EntityStorageControllerInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityStorageControllerInterface.php
@@ -125,8 +125,8 @@ public function save(EntityInterface $entity);
    *   'bundle' key. For example:
    *   @code
    *   array(
-   *     'entity type' => 'node',
-   *     'bundle' => 'article',
+   *     'EntityType' => 'node',
+   *     'Bundle' => 'article',
    *   )
    *   @endcode
    *
diff --git a/core/lib/Drupal/Core/Entity/Field/FieldItemBase.php b/core/lib/Drupal/Core/Entity/Field/FieldItemBase.php
index 5c71aa3..9b51629 100644
--- a/core/lib/Drupal/Core/Entity/Field/FieldItemBase.php
+++ b/core/lib/Drupal/Core/Entity/Field/FieldItemBase.php
@@ -121,13 +121,6 @@ public function getString() {
   }
 
   /**
-   * Implements TypedDataInterface::validate().
-   */
-  public function validate() {
-    // @todo implement
-  }
-
-  /**
    * Implements ComplexDataInterface::get().
    */
   public function get($property_name) {
diff --git a/core/lib/Drupal/Core/Entity/Field/Type/EntityReferenceItem.php b/core/lib/Drupal/Core/Entity/Field/Type/EntityReferenceItem.php
index a60e65e..99e9c6b 100644
--- a/core/lib/Drupal/Core/Entity/Field/Type/EntityReferenceItem.php
+++ b/core/lib/Drupal/Core/Entity/Field/Type/EntityReferenceItem.php
@@ -39,11 +39,14 @@ public function getPropertyDefinitions() {
         // @todo: Lookup the entity type's ID data type and use it here.
         'type' => 'integer',
         'label' => t('Entity ID'),
+        'constraints' => array(
+          'Min' => array('limit' => 0),
+        ),
       );
       self::$propertyDefinitions[$entity_type]['entity'] = array(
         'type' => 'entity',
         'constraints' => array(
-          'entity type' => $entity_type,
+          'EntityType' => $entity_type,
         ),
         'label' => t('Entity'),
         'description' => t('The referenced entity'),
diff --git a/core/lib/Drupal/Core/Entity/Field/Type/EntityTranslation.php b/core/lib/Drupal/Core/Entity/Field/Type/EntityTranslation.php
index 280fca9..4a08987 100644
--- a/core/lib/Drupal/Core/Entity/Field/Type/EntityTranslation.php
+++ b/core/lib/Drupal/Core/Entity/Field/Type/EntityTranslation.php
@@ -237,11 +237,4 @@ public function access($operation = 'view', \Drupal\user\Plugin\Core\Entity\User
     $method = $operation . 'Access';
     return entity_access_controller($this->parent->entityType())->$method($this->parent, $this->langcode, $account);
   }
-
-  /**
-   * Implements TypedDataInterface::validate().
-   */
-  public function validate($value = NULL) {
-    // @todo implement
-  }
 }
diff --git a/core/lib/Drupal/Core/Entity/Field/Type/EntityWrapper.php b/core/lib/Drupal/Core/Entity/Field/Type/EntityWrapper.php
index 97449e7..c712868 100644
--- a/core/lib/Drupal/Core/Entity/Field/Type/EntityWrapper.php
+++ b/core/lib/Drupal/Core/Entity/Field/Type/EntityWrapper.php
@@ -29,8 +29,8 @@
  * an 'entity type' constraint is specified.
  *
  * Supported constraints (below the definition's 'constraints' key) are:
- *  - entity type: The entity type.
- *  - bundle: The bundle or an array of possible bundles.
+ *  - EntityType: The entity type.
+ *  - Bundle: The bundle or an array of possible bundles.
  *
  * Supported settings (below the definition's 'settings' key) are:
  *  - id source: If used as computed property, the ID property used to load
@@ -71,7 +71,7 @@ class EntityWrapper extends TypedData implements IteratorAggregate, ComplexDataI
    */
   public function __construct(array $definition) {
     $this->definition = $definition + array('constraints' => array());
-    $this->entityType = isset($this->definition['constraints']['entity type']) ? $this->definition['constraints']['entity type'] : NULL;
+    $this->entityType = isset($this->definition['constraints']['EntityType']) ? $this->definition['constraints']['EntityType'] : NULL;
   }
 
   /**
@@ -103,7 +103,7 @@ public function setValue($value) {
       $this->entityType = $value->entityType();
       $value = $value->id();
     }
-    elseif (isset($value) && !(is_scalar($value) && !empty($this->definition['constraints']['entity type']))) {
+    elseif (isset($value) && !(is_scalar($value) && !empty($this->definition['constraints']['EntityType']))) {
       throw new InvalidArgumentException('Value is no valid entity.');
     }
 
@@ -125,18 +125,12 @@ public function getString() {
   }
 
   /**
-   * Implements TypedDataInterface::validate().
-   */
-  public function validate($value = NULL) {
-    // TODO: Implement validate() method.
-  }
-
-  /**
    * Implements IteratorAggregate::getIterator().
    */
   public function getIterator() {
     $entity = $this->getValue();
-    return $entity ? $entity->getIterator() : new ArrayIterator(array());
+    // @todo: Remove check for EntityNG once all entity types are converted.
+    return $entity && $entity instanceof \Drupal\Core\Entity\EntityNG ? $entity->getIterator() : new ArrayIterator(array());
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Entity/Field/Type/Field.php b/core/lib/Drupal/Core/Entity/Field/Type/Field.php
index cc5951c..9d2448a 100644
--- a/core/lib/Drupal/Core/Entity/Field/Type/Field.php
+++ b/core/lib/Drupal/Core/Entity/Field/Type/Field.php
@@ -114,10 +114,11 @@ public function getString() {
   }
 
   /**
-   * Implements TypedDataInterface::validate().
+   * Implements TypedDataInterface::getConstraints().
    */
-  public function validate() {
-    // @todo implement
+  public function getConstraints() {
+    // Apply the constraints to the list items only.
+    return array();
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Plugin/Validation/Constraint/EntityTypeConstraint.php b/core/lib/Drupal/Core/Plugin/Validation/Constraint/EntityTypeConstraint.php
new file mode 100644
index 0000000..e763525
--- /dev/null
+++ b/core/lib/Drupal/Core/Plugin/Validation/Constraint/EntityTypeConstraint.php
@@ -0,0 +1,52 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\Core\Validation\Constraint\EntityTypeConstraint.
+ */
+
+namespace Drupal\Core\Plugin\Validation\Constraint;
+
+use Symfony\Component\Validator\Constraint;
+use Drupal\Core\Annotation\Plugin;
+use Drupal\Core\Annotation\Translation;
+
+
+/**
+ * Checks if a value is a valid entity type.
+ *
+ * @Plugin(
+ *   id = "EntityType",
+ *   label = @Translation("Entity type", context = "Validation"),
+ *   type = "entity"
+ * )
+ */
+class EntityTypeConstraint extends Constraint {
+
+  /**
+   * The default violation message.
+   *
+   * @var string
+   */
+  public $message = 'The entity must be of type {{ type }}.';
+
+  /**
+   * The entity type option.
+   *
+   * @var string
+   */
+  public $type;
+
+  /**
+   * Overrides Constraint::getDefaultOption().
+   */
+  public function getDefaultOption() {
+    return 'type';
+  }
+
+  /**
+   * Overrides Constraint::getRequiredOptions().
+   */
+  public function getRequiredOptions() {
+    return array('type');
+  }
+}
diff --git a/core/lib/Drupal/Core/Plugin/Validation/Constraint/EntityTypeConstraintValidator.php b/core/lib/Drupal/Core/Plugin/Validation/Constraint/EntityTypeConstraintValidator.php
new file mode 100644
index 0000000..65bb373
--- /dev/null
+++ b/core/lib/Drupal/Core/Plugin/Validation/Constraint/EntityTypeConstraintValidator.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\Core\Plugin\Validation\Constraint\EntityTypeConstraintValidator.
+ */
+
+namespace Drupal\Core\Plugin\Validation\Constraint;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+
+/**
+ * Validates the EntityType constraint.
+ */
+class EntityTypeConstraintValidator extends ConstraintValidator {
+
+  /**
+   * Implements \Symfony\Component\Validator\ConstraintValidatorInterface::validate().
+   */
+  public function validate($typed_data, Constraint $constraint) {
+    $entity = $typed_data->getValue();
+
+    if (!empty($entity) && $entity->entityType() != $constraint->type) {
+      $this->context->addViolation($constraint->message, array('{ type }', $constraint->type));
+    }
+  }
+}
diff --git a/core/lib/Drupal/Core/Plugin/Validation/Constraint/NotNullConstraint.php b/core/lib/Drupal/Core/Plugin/Validation/Constraint/NotNullConstraint.php
new file mode 100644
index 0000000..cff6928
--- /dev/null
+++ b/core/lib/Drupal/Core/Plugin/Validation/Constraint/NotNullConstraint.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\Core\Plugin\Validation\Constraint\NotNullConstraint.
+ */
+
+namespace Drupal\Core\Plugin\Validation\Constraint;
+
+use Drupal\Core\Annotation\Plugin;
+use Drupal\Core\Annotation\Translation;
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Plugin(
+ *   id = "NotNull",
+ *   label = @Translation("Not null", context = "Validation")
+ * )
+ */
+class NotNullConstraint extends Constraint {
+
+  public $message = 'This value should not be null.';
+}
diff --git a/core/lib/Drupal/Core/Plugin/Validation/Constraint/NotNullConstraintValidator.php b/core/lib/Drupal/Core/Plugin/Validation/Constraint/NotNullConstraintValidator.php
new file mode 100644
index 0000000..705bba0
--- /dev/null
+++ b/core/lib/Drupal/Core/Plugin/Validation/Constraint/NotNullConstraintValidator.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\Core\Plugin\Validation\Constraint\NotNullConstraintValidator.
+ */
+
+namespace Drupal\Core\Plugin\Validation\Constraint;
+
+use Drupal\Core\TypedData\ComplexDataInterface;
+use Drupal\Core\TypedData\ListInterface;
+use Drupal\Core\TypedData\TypedDataInterface;
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+
+/**
+ * Validates the NotNull constraint.
+ */
+class NotNullConstraintValidator extends ConstraintValidator {
+
+  /**
+   * Implements \Symfony\Component\Validator\ConstraintValidatorInterface::validate().
+   */
+  public function validate($value, Constraint $constraint) {
+    $fail = !isset($value);
+
+    // Support passing in typed data objects.
+    if (isset($value) && $value instanceof TypedDataInterface) {
+      if ($value instanceof ListInterface || $value instanceof ComplexDataInterface) {
+        $fail = $value->isEmpty();
+      }
+      else {
+        $fail = $value->getValue() === NULL;
+      }
+    }
+
+    if ($fail) {
+      $this->context->addViolation($constraint->message);
+    }
+  }
+}
diff --git a/core/lib/Drupal/Core/Plugin/Validation/Constraint/NullConstraint.php b/core/lib/Drupal/Core/Plugin/Validation/Constraint/NullConstraint.php
new file mode 100644
index 0000000..e67be73
--- /dev/null
+++ b/core/lib/Drupal/Core/Plugin/Validation/Constraint/NullConstraint.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\Core\Plugin\Validation\Constraint\NullConstraint.
+ */
+
+namespace Drupal\Core\Plugin\Validation\Constraint;
+
+use Drupal\Core\Annotation\Plugin;
+use Drupal\Core\Annotation\Translation;
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Plugin(
+ *   id = "Null",
+ *   label = @Translation("Null", context = "Validation")
+ * )
+ */
+class NullConstraint extends Constraint {
+
+  public $message = 'This value should be null.';
+}
diff --git a/core/lib/Drupal/Core/Plugin/Validation/Constraint/NullConstraintValidator.php b/core/lib/Drupal/Core/Plugin/Validation/Constraint/NullConstraintValidator.php
new file mode 100644
index 0000000..17b3e3d
--- /dev/null
+++ b/core/lib/Drupal/Core/Plugin/Validation/Constraint/NullConstraintValidator.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\Core\Plugin\Validation\Constraint\NullConstraintValidator.
+ */
+
+namespace Drupal\Core\Plugin\Validation\Constraint;
+
+use Drupal\Core\TypedData\ComplexDataInterface;
+use Drupal\Core\TypedData\ListInterface;
+use Drupal\Core\TypedData\TypedDataInterface;
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+
+/**
+ * Validates the Null constraint.
+ */
+class NullConstraintValidator extends ConstraintValidator {
+
+  /**
+   * Implements \Symfony\Component\Validator\ConstraintValidatorInterface::validate().
+   */
+  public function validate($value, Constraint $constraint) {
+    $fail = isset($value);
+
+    // Support passing in typed data objects.
+    if (isset($value) && $value instanceof TypedDataInterface) {
+      if ($value instanceof ListInterface || $value instanceof ComplexDataInterface) {
+        $fail = !$value->isEmpty();
+      }
+      else {
+        $fail = $value->getValue() !== NULL;
+      }
+    }
+
+    if ($fail) {
+      $this->context->addViolation($constraint->message);
+    }
+  }
+}
diff --git a/core/lib/Drupal/Core/Plugin/Validation/Constraint/PrimitiveTypeConstraint.php b/core/lib/Drupal/Core/Plugin/Validation/Constraint/PrimitiveTypeConstraint.php
new file mode 100644
index 0000000..55590f0
--- /dev/null
+++ b/core/lib/Drupal/Core/Plugin/Validation/Constraint/PrimitiveTypeConstraint.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\Core\Plugin\Validation\Constraint\PrimitiveTypeConstraint.
+ */
+
+namespace Drupal\Core\Plugin\Validation\Constraint;
+
+use Drupal\Core\Annotation\Plugin;
+use Drupal\Core\Annotation\Translation;
+use Symfony\Component\Validator\Constraints\Type as SymfonyConstraint;
+
+/**
+ * Supports validating all primitive types.
+ *
+ * @Plugin(
+ *   id = "PrimitiveType",
+ *   label = @Translation("Primitive type", context = "Validation")
+ * )
+ */
+class PrimitiveTypeConstraint extends SymfonyConstraint {
+}
diff --git a/core/lib/Drupal/Core/Plugin/Validation/Constraint/PrimitiveTypeConstraintValidator.php b/core/lib/Drupal/Core/Plugin/Validation/Constraint/PrimitiveTypeConstraintValidator.php
new file mode 100644
index 0000000..2198390
--- /dev/null
+++ b/core/lib/Drupal/Core/Plugin/Validation/Constraint/PrimitiveTypeConstraintValidator.php
@@ -0,0 +1,68 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\Core\Plugin\Validation\Constraint\PrimitiveTypeConstraintValidator.
+ */
+
+namespace Drupal\Core\Plugin\Validation\Constraint;
+
+use DateInterval;
+use Drupal\Core\TypedData\Primitive;
+use Drupal\Core\Datetime\DrupalDateTime;
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+
+/**
+ * Validates the PrimitiveType constraint.
+ */
+class PrimitiveTypeConstraintValidator extends ConstraintValidator {
+
+  /**
+   * Implements \Symfony\Component\Validator\ConstraintValidatorInterface::validate().
+   */
+  public function validate($value, Constraint $constraint) {
+
+    if (!isset($value)) {
+      return;
+    }
+
+    switch ($constraint->type) {
+      case Primitive::BINARY:
+        $valid = is_resource($value);
+        break;
+      case Primitive::BOOLEAN:
+        $valid = is_bool($value) || $value === 0 || $value === '0' || $value === 1 || $value == '1';
+        break;
+      case Primitive::DATE:
+        $valid = $value instanceOf DrupalDateTime && !$value->hasErrors();
+        break;
+      case Primitive::DURATION:
+        $valid = $value instanceof DateInterval;
+        break;
+      case Primitive::FLOAT:
+        $valid = is_numeric($value);
+        break;
+      case Primitive::INTEGER:
+        // Also consider integer values represented as PHP string as valid.
+        $valid = ((string) (int) $value === (string) $value);
+        break;
+      case Primitive::STRING:
+        $valid = is_scalar($value);
+        break;
+      case Primitive::URI:
+        // @todo: Support any URI which is valid according to rfc2396.
+        $valid = is_scalar($value) && valid_url($value, TRUE);
+        break;
+      default:
+        $valid = FALSE;
+        break;
+    }
+
+    if (!$valid) {
+      $this->context->addViolation($constraint->message, array(
+        '{{ value }}' => is_object($value) ? get_class($value) : (is_array($value) ? 'Array' : (string) $value),
+        '{{ type }}'  => $constraint->type,
+      ));
+    }
+  }
+}
diff --git a/core/lib/Drupal/Core/TypedData/Type/Binary.php b/core/lib/Drupal/Core/TypedData/Type/Binary.php
index 7ec5e6b..ef9b295 100644
--- a/core/lib/Drupal/Core/TypedData/Type/Binary.php
+++ b/core/lib/Drupal/Core/TypedData/Type/Binary.php
@@ -38,7 +38,7 @@ class Binary extends TypedData implements TypedDataInterface {
    */
   public function getValue() {
     if (!isset($this->handle) && isset($this->uri)) {
-      $this->handle = fopen($this->uri, 'rb');
+      $this->handle = is_readable($this->uri) ? fopen($this->uri, 'rb') : FALSE;
     }
     return $this->handle;
   }
@@ -51,16 +51,14 @@ public function setValue($value) {
       $this->handle = NULL;
       $this->uri = NULL;
     }
-    elseif (is_resource($value)) {
-      $this->handle = $value;
-    }
     elseif (is_string($value)) {
       // Note: For performance reasons we store the given URI and access the
       // resource upon request. See Binary::getValue()
       $this->uri = $value;
+      $this->handle = NULL;
     }
     else {
-      throw new InvalidArgumentException("Invalid value for binary data given.");
+      $this->handle = $value;
     }
   }
 
@@ -74,11 +72,4 @@ public function getString() {
     }
     return $contents;
   }
-
-  /**
-   * Implements TypedDataInterface::validate().
-   */
-  public function validate() {
-    // TODO: Implement validate() method.
-  }
 }
diff --git a/core/lib/Drupal/Core/TypedData/Type/Boolean.php b/core/lib/Drupal/Core/TypedData/Type/Boolean.php
index 5714599..10ebad8 100644
--- a/core/lib/Drupal/Core/TypedData/Type/Boolean.php
+++ b/core/lib/Drupal/Core/TypedData/Type/Boolean.php
@@ -23,18 +23,4 @@ class Boolean extends TypedData implements TypedDataInterface {
    * @var boolean
    */
   protected $value;
-
-  /**
-   * Implements TypedDataInterface::setValue().
-   */
-  public function setValue($value) {
-    $this->value = isset($value) ? (bool) $value : $value;
-  }
-
-  /**
-   * Implements TypedDataInterface::validate().
-   */
-  public function validate() {
-    // TODO: Implement validate() method.
-  }
 }
diff --git a/core/lib/Drupal/Core/TypedData/Type/Date.php b/core/lib/Drupal/Core/TypedData/Type/Date.php
index 3c0f3a9..37253ca 100644
--- a/core/lib/Drupal/Core/TypedData/Type/Date.php
+++ b/core/lib/Drupal/Core/TypedData/Type/Date.php
@@ -40,9 +40,6 @@ public function setValue($value) {
     }
     else {
       $this->value = $value instanceOf DrupalDateTime ? $value : new DrupalDateTime($value);
-      if ($this->value->hasErrors()) {
-        throw new InvalidArgumentException("Invalid date format given.");
-      }
     }
   }
 
@@ -52,11 +49,4 @@ public function setValue($value) {
   public function getString() {
     return (string) $this->getValue();
   }
-
-  /**
-   * Implements TypedDataInterface::validate().
-   */
-  public function validate() {
-    // TODO: Implement validate() method.
-  }
 }
diff --git a/core/lib/Drupal/Core/TypedData/Type/Duration.php b/core/lib/Drupal/Core/TypedData/Type/Duration.php
index 9fd8ceb..537af0f 100644
--- a/core/lib/Drupal/Core/TypedData/Type/Duration.php
+++ b/core/lib/Drupal/Core/TypedData/Type/Duration.php
@@ -32,21 +32,29 @@ class Duration extends TypedData implements TypedDataInterface {
    * Implements TypedDataInterface::setValue().
    */
   public function setValue($value) {
-    if ($value instanceof DateInterval || !isset($value)) {
-      $this->value = $value;
+    try {
+      if ($value instanceof DateInterval || !isset($value)) {
+        $this->value = $value;
+      }
+      // Treat integer values as time spans in seconds, even if supplied as PHP
+      // string.
+      elseif ((string) (int) $value === (string) $value) {
+        $this->value = new DateInterval('PT' . $value . 'S');
+      }
+      elseif (is_string($value)) {
+        // @todo: Add support for negative intervals on top of the DateInterval
+        // constructor.
+        $this->value = new DateInterval($value);
+      }
+      else {
+        // Unknown value given.
+        $this->value = $value;
+      }
     }
-    // Treat integer values as time spans in seconds, even if supplied as PHP
-    // string.
-    elseif ((string) (int) $value === (string) $value) {
-      $this->value = new DateInterval('PT' . $value . 'S');
-    }
-    elseif (is_string($value)) {
-      // @todo: Add support for negative intervals on top of the DateInterval
-      // constructor.
-      $this->value = new DateInterval($value);
-    }
-    else {
-      throw new InvalidArgumentException("Invalid duration format given.");
+    catch (\Exception $e) {
+      // An invalid value has been given. Setting any invalid value will let
+      // validation fail.
+      $this->value = $e;
     }
   }
 
@@ -58,11 +66,4 @@ public function getString() {
     // DateInterval::__construct() and setValue().
     return (string) $this->getValue()->format('%rP%yY%mM%dDT%hH%mM%sS');
   }
-
-  /**
-   * Implements TypedDataInterface::validate().
-   */
-  public function validate() {
-    // TODO: Implement validate() method.
-  }
 }
diff --git a/core/lib/Drupal/Core/TypedData/Type/Float.php b/core/lib/Drupal/Core/TypedData/Type/Float.php
index 798499c..8c3fedc 100644
--- a/core/lib/Drupal/Core/TypedData/Type/Float.php
+++ b/core/lib/Drupal/Core/TypedData/Type/Float.php
@@ -23,18 +23,4 @@ class Float extends TypedData implements TypedDataInterface {
    * @var float
    */
   protected $value;
-
-  /**
-   * Implements TypedDataInterface::setValue().
-   */
-  public function setValue($value) {
-    $this->value = isset($value) ? (float) $value : $value;
-  }
-
-  /**
-   * Implements TypedDataInterface::validate().
-   */
-  public function validate() {
-    // TODO: Implement validate() method.
-  }
 }
diff --git a/core/lib/Drupal/Core/TypedData/Type/Integer.php b/core/lib/Drupal/Core/TypedData/Type/Integer.php
index 4e9b59a..5c814f5 100644
--- a/core/lib/Drupal/Core/TypedData/Type/Integer.php
+++ b/core/lib/Drupal/Core/TypedData/Type/Integer.php
@@ -23,18 +23,4 @@ class Integer extends TypedData implements TypedDataInterface {
    * @var integer
    */
   protected $value;
-
-  /**
-   * Implements TypedDataInterface::setValue().
-   */
-  public function setValue($value) {
-    $this->value = isset($value) ? (int) $value : $value;
-  }
-
-  /**
-   * Implements TypedDataInterface::validate().
-   */
-  public function validate() {
-    // TODO: Implement validate() method.
-  }
 }
diff --git a/core/lib/Drupal/Core/TypedData/Type/Language.php b/core/lib/Drupal/Core/TypedData/Type/Language.php
index 67f4df8..483bbc9 100644
--- a/core/lib/Drupal/Core/TypedData/Type/Language.php
+++ b/core/lib/Drupal/Core/TypedData/Type/Language.php
@@ -124,11 +124,4 @@ public function getString() {
     $language = $this->getValue();
     return $language ? $language->name : '';
   }
-
-  /**
-   * Implements TypedDataInterface::validate().
-   */
-  public function validate() {
-    // TODO: Implement validate() method.
-  }
 }
diff --git a/core/lib/Drupal/Core/TypedData/Type/String.php b/core/lib/Drupal/Core/TypedData/Type/String.php
index fef3248..3f6670d 100644
--- a/core/lib/Drupal/Core/TypedData/Type/String.php
+++ b/core/lib/Drupal/Core/TypedData/Type/String.php
@@ -23,18 +23,4 @@ class String extends TypedData implements TypedDataInterface {
    * @var string
    */
   protected $value;
-
-  /**
-   * Implements TypedDataInterface::setValue().
-   */
-  public function setValue($value) {
-    $this->value = isset($value) ? (string) $value : $value;
-  }
-
-  /**
-   * Implements TypedDataInterface::validate().
-   */
-  public function validate() {
-    // TODO: Implement validate() method.
-  }
 }
diff --git a/core/lib/Drupal/Core/TypedData/Type/TypedData.php b/core/lib/Drupal/Core/TypedData/Type/TypedData.php
index 1e70c53..346c3c0 100644
--- a/core/lib/Drupal/Core/TypedData/Type/TypedData.php
+++ b/core/lib/Drupal/Core/TypedData/Type/TypedData.php
@@ -70,4 +70,20 @@ public function setValue($value) {
   public function getString() {
     return (string) $this->getValue();
   }
+
+  /**
+   * Implements TypedDataInterface::getConstraints().
+   */
+  public function getConstraints() {
+    // @todo: Add the typed data manager as proper dependency.
+    return typed_data()->getConstraints($this->definition);
+  }
+
+  /**
+   * Implements TypedDataInterface::validate().
+   */
+  public function validate() {
+    // @todo: Add the typed data manager as proper dependency.
+    return typed_data()->getValidator()->validate($this);
+  }
 }
diff --git a/core/lib/Drupal/Core/TypedData/Type/Uri.php b/core/lib/Drupal/Core/TypedData/Type/Uri.php
index 010fa03..64b665d 100644
--- a/core/lib/Drupal/Core/TypedData/Type/Uri.php
+++ b/core/lib/Drupal/Core/TypedData/Type/Uri.php
@@ -22,18 +22,4 @@ class Uri extends TypedData implements TypedDataInterface {
    * @var string
    */
   protected $value;
-
-  /**
-   * Implements TypedDataInterface::setValue().
-   */
-  public function setValue($value) {
-    $this->value = isset($value) ? (string) $value : $value;
-  }
-
-  /**
-   * Implements TypedDataInterface::validate().
-   */
-  public function validate() {
-    // TODO: Implement validate() method.
-  }
 }
diff --git a/core/lib/Drupal/Core/TypedData/TypedDataInterface.php b/core/lib/Drupal/Core/TypedData/TypedDataInterface.php
index 1a8ffe7..4f83c76 100644
--- a/core/lib/Drupal/Core/TypedData/TypedDataInterface.php
+++ b/core/lib/Drupal/Core/TypedData/TypedDataInterface.php
@@ -57,7 +57,20 @@ public function setValue($value);
   public function getString();
 
   /**
+   * Gets a list of validation constraints.
+   *
+   * @return array
+   *   Array of constraints, each being an instance of
+   *   \Symfony\Component\Validator\Constraint.
+   */
+  public function getConstraints();
+
+  /**
    * Validates the currently set data value.
+   *
+   * @return \Symfony\Component\Validator\ConstraintViolationListInterface
+   *   A list of constraint violations. If the list is empty, validation
+   *   succeeded.
    */
   public function validate();
 }
diff --git a/core/lib/Drupal/Core/TypedData/TypedDataManager.php b/core/lib/Drupal/Core/TypedData/TypedDataManager.php
index a1522d8..79da8c9 100644
--- a/core/lib/Drupal/Core/TypedData/TypedDataManager.php
+++ b/core/lib/Drupal/Core/TypedData/TypedDataManager.php
@@ -10,12 +10,32 @@
 use Drupal\Component\Plugin\PluginManagerBase;
 use Drupal\Core\Plugin\Discovery\CacheDecorator;
 use Drupal\Core\Plugin\Discovery\HookDiscovery;
+use Drupal\Core\TypedData\Validation\MetadataFactory;
+use Drupal\Core\Validation\ConstraintManager;
+use Drupal\Core\Validation\Validator;
+use Symfony\Component\Validator\ConstraintValidatorFactory;
+use Symfony\Component\Validator\ValidatorInterface;
 
 /**
  * Manages data type plugins.
  */
 class TypedDataManager extends PluginManagerBase {
 
+  /**
+   * The validator used for validating typed data.
+   *
+   * @var \Symfony\Component\Validator\ValidatorInterface
+   */
+  protected $validator;
+
+  /**
+   * The validation constraint manager to use for instantiating constraints.
+   *
+   * @var \Drupal\Core\Validation\ConstraintManager
+   */
+  protected $constraintManager;
+
+
   public function __construct() {
     $this->discovery = new CacheDecorator(new HookDiscovery('data_type_info'), 'typed_data:types');
     $this->factory = new TypedDataFactory($this->discovery);
@@ -60,9 +80,8 @@ public function createInstance($plugin_id, array $configuration) {
    *   - list settings: An array of settings as required by the used
    *     'list class'. See the documentation of the list class for support or
    *     required settings.
-   *   - constraints: An array of type specific value constraints, e.g. for data
-   *     of type 'entity' the 'entity type' and 'bundle' may be specified. See
-   *     the documentation of the data type 'class' for supported constraints.
+   *   - constraints: An array of validation constraints. See
+   *     \Drupal\Core\TypedData\TypedDataManager::getConstraints() for details.
    *   - required: A boolean specifying whether a non-NULL value is mandatory.
    *   Further keys may be supported in certain usages, e.g. for further keys
    *   supported for entity field definitions see
@@ -108,4 +127,145 @@ function create(array $definition, $value = NULL, array $context = array()) {
     }
     return $wrapper;
   }
+
+  /**
+   * Sets the validator for validating typed data.
+   *
+   * @param \Symfony\Component\Validator\ValidatorInterface $validator
+   *   The validator object to set.
+   */
+  public function setValidator(ValidatorInterface $validator) {
+    $this->validator = $validator;
+  }
+
+  /**
+   * Gets the validator for validating typed data.
+   *
+   * @return \Symfony\Component\Validator\ValidatorInterface
+   *   The validator object.
+   */
+  public function getValidator() {
+    if (!isset($this->validator)) {
+      $this->validator = new Validator(new MetadataFactory(), new ConstraintValidatorFactory());
+    }
+    return $this->validator;
+  }
+
+  /**
+   * Sets the validation constraint manager.
+   *
+   * The validation constraint manager is used to instantiate validation
+   * constraint plugins.
+   *
+   * @param \Drupal\Core\Validation\ConstraintManager
+   *   The constraint manager to set.
+   */
+  public function setValidationConstraintManager(ConstraintManager $constraintManager) {
+    $this->constraintManager = $constraintManager;
+  }
+
+  /**
+   * Gets the validation constraint manager.
+   *
+   * @return \Drupal\Core\Validation\ConstraintManager
+   *   The constraint manager.
+   */
+  public function getValidationConstraintManager() {
+    if (!isset($this->constraintManager)) {
+      $this->constraintManager = drupal_container()->get('validation.constraint');
+    }
+    return $this->constraintManager;
+  }
+
+  /**
+   * Creates a validation constraint plugin.
+   *
+   * @param string $name
+   *   The name or plugin id of the constraint.
+   * @param mixed $options
+   *   The options to pass to the constraint class. Required and supported
+   *   options depend on the class.
+   *
+   * @return \Symfony\Component\Validator\Constraint
+   *   A validation constraint plugin.
+   */
+  public function createValidationConstraint($name, $options) {
+    if (!is_array($options)) {
+      // Plugins need an array as configuration, so make sure we have one.
+      // The constraint classes support passing the options as part of the
+      // 'value' key also.
+      $options = array('value' => $options);
+    }
+    // Support specifying constraint via the 'constraint' and 'value' keys.
+    elseif (isset($options['value']) && isset($options['constraint']) && count($options) == 2) {
+      $name = $options['constraint'];
+      unset($options['constraint']);
+    }
+    return $this->getValidationConstraintManager()->createInstance($name, $options);
+  }
+
+  /**
+   * Gets configured constraints from a data definition.
+   *
+   * Any constraints defined for the data type, i.e. below the 'constraint' key
+   * of the type's plugin definition, or constraints defined below the data
+   * definition's constraint' key are taken into account.
+   *
+   * Constraints care defined via an array, having constraint plugin IDs as key
+   * and constraint options as values, e.g.
+   * @code
+   * $constraints = array(
+   *   'Min' => array('limit' => 5),
+   * );
+   * @endcode
+   *
+   * Alternatively, the constraint can be defined using an arbitrary key if
+   * the constraint plugin ID is passed as part below a 'constraint' sub-key and
+   * the options below a 'value' sub-key, e.g.
+   * @code
+   * $constraints = array(
+   *   array('constraint' => 'Min', 'value' => array('limit' => 5)),
+   * );
+   * @endcode
+   * The latter notation allows specifying constraints of the same plugin
+   * multiple times, whereas the former is commonly used and easier to
+   * read.
+   *
+   * Note that the specified constraints must be compatible with the data type,
+   * e.g. for data of type 'entity' the 'EntityType' and 'Bundle' constraints
+   * may be specified.
+   *
+   * @see \Drupal\Core\Validation\ConstraintManager
+   *
+   * @param array $definition
+   *   A data definition array.
+   *
+   * @return array
+   *   Array of constraints, each being an instance of
+   *   \Symfony\Component\Validator\Constraint.
+   */
+  public function getConstraints($definition) {
+    $constraints = array();
+    // @todo: Figure out how to handle nested constraint structures as
+    // collections.
+    $type_definition = $this->getDefinition($definition['type']);
+    // Auto-generate a constraint for the primitive type if we have a mapping.
+    if (isset($type_definition['primitive type'])) {
+      $constraints[] = $this->getValidationConstraintManager()->
+        createInstance('PrimitiveType', array('type' => $type_definition['primitive type']));
+    }
+    // Add in constraints specified by the data type.
+    if (isset($type_definition['constraints'])) {
+      foreach ($type_definition['constraints'] as $name => $options) {
+        $constraints[] = $this->createValidationConstraint($name, $options);
+      }
+    }
+    // Add any constraints specified as part of the data definition.
+    if (isset($definition['constraints'])) {
+      foreach ($definition['constraints'] as $name => $options) {
+        $constraints[] = $this->createValidationConstraint($name, $options);
+      }
+    }
+    return $constraints;
+  }
 }
diff --git a/core/lib/Drupal/Core/TypedData/Validation/Metadata.php b/core/lib/Drupal/Core/TypedData/Validation/Metadata.php
new file mode 100644
index 0000000..e520253
--- /dev/null
+++ b/core/lib/Drupal/Core/TypedData/Validation/Metadata.php
@@ -0,0 +1,93 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\Core\TypedData\Validation\Metadata.
+ */
+
+namespace Drupal\Core\TypedData\Validation;
+
+use Drupal\Core\TypedData\TypedDataInterface;
+use Symfony\Component\Validator\ValidationVisitorInterface;
+use Symfony\Component\Validator\PropertyMetadataInterface;
+
+/**
+ * Typed data implementation of the validator MetadataInterface.
+ */
+class Metadata implements PropertyMetadataInterface {
+
+  /**
+   * The name of the property, or empty if this is the root.
+   *
+   * @var string
+   */
+  protected $name;
+
+  /**
+   * The typed data object the metadata is about.
+   *
+   * @var \Drupal\Core\TypedData\TypedDataInterface
+   */
+  protected $typedData;
+
+  /**
+   * The metadata factory used.
+   *
+   * @var \Drupal\Core\TypedData\Validation\MetadataFactory
+   */
+  protected $factory;
+
+  /**
+   * Constructs the object.
+   *
+   * @param \Drupal\Core\TypedData\TypedDataInterface $typed_data
+   *   The typed data object the metadata is about.
+   * @param $name
+   *   The name of the property to get metadata for. Leave empty, if
+   *   the data is the root of the typed data tree.
+   * @param \Drupal\Core\TypedData\Validation\MetadataFactory $factory
+   *   The factory to use for instantiating property metadata.
+   */
+  public function __construct(TypedDataInterface $typed_data, $name = '', MetadataFactory $factory) {
+    $this->typedData = $typed_data;
+    $this->name = $name;
+    $this->factory = $factory;
+  }
+
+  /**
+   * Implements MetadataInterface::accept().
+   */
+  public function accept(ValidationVisitorInterface $visitor, $typed_data, $group, $propertyPath) {
+
+    // @todo: Do we have to care about groups? Symfony class metadata has
+    // $propagatedGroup.
+
+    $visitor->visit($this, $typed_data->getValue(), $group, $propertyPath);
+  }
+
+  /**
+   * Implements MetadataInterface::findConstraints().
+   */
+  public function findConstraints($group) {
+    return $this->typedData->getConstraints();
+  }
+
+  /**
+   * Returns the name of the property.
+   *
+   * @return string The property name.
+   */
+  public function getPropertyName() {
+    return $this->name;
+  }
+
+  /**
+   * Extracts the value of the property from the given container.
+   *
+   * @param mixed $container The container to extract the property value from.
+   *
+   * @return mixed The value of the property.
+   */
+  public function getPropertyValue($container) {
+    return $this->typedData->getValue();
+  }
+}
\ No newline at end of file
diff --git a/core/lib/Drupal/Core/TypedData/Validation/MetadataFactory.php b/core/lib/Drupal/Core/TypedData/Validation/MetadataFactory.php
new file mode 100644
index 0000000..989119d
--- /dev/null
+++ b/core/lib/Drupal/Core/TypedData/Validation/MetadataFactory.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\Core\TypedData\Validation\MetadataFactory.
+ */
+
+namespace Drupal\Core\TypedData\Validation;
+
+use Drupal\Core\TypedData\ComplexDataInterface;
+use Drupal\Core\TypedData\ListInterface;
+use Drupal\Core\TypedData\TypedDataInterface;
+use Symfony\Component\Validator\MetadataFactoryInterface;
+
+/**
+ * Typed data implementation of the validator MetadataFactoryInterface.
+ */
+class MetadataFactory implements MetadataFactoryInterface {
+
+  /**
+   * Implements MetadataFactoryInterface::getMetadataFor().
+   *
+   * @param \Drupal\Core\TypedData\TypedDataInterface $typed_data
+   *   Some typed data object containing the value to validate.
+   * @param $name
+   *   (optional) The name of the property to get metadata for. Leave empty, if
+   *   the data is the root of the typed data tree.
+   */
+  public function getMetadataFor($typed_data, $name = '') {
+    if (!$typed_data instanceof TypedDataInterface) {
+      throw new \InvalidArgumentException('The passed value must be a typed data object.');
+    }
+    $is_container = $typed_data instanceof ComplexDataInterface || $typed_data instanceof ListInterface;
+    $class = '\Drupal\Core\TypedData\Validation\\' . ($is_container ? 'PropertyContainerMetadata' : 'Metadata');
+    return new $class($typed_data, $name, $this);
+  }
+
+  /**
+   * Implements MetadataFactoryInterface::hasMetadataFor().
+   */
+  public function hasMetadataFor($value) {
+    return $value instanceof TypedDataInterface;
+  }
+}
diff --git a/core/lib/Drupal/Core/TypedData/Validation/PropertyContainerMetadata.php b/core/lib/Drupal/Core/TypedData/Validation/PropertyContainerMetadata.php
new file mode 100644
index 0000000..fff3bfe
--- /dev/null
+++ b/core/lib/Drupal/Core/TypedData/Validation/PropertyContainerMetadata.php
@@ -0,0 +1,47 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\Core\TypedData\Validation\PropertyContainerMetadata.
+ */
+
+namespace Drupal\Core\TypedData\Validation;
+
+use Drupal\Core\TypedData\ComplexDataInterface;
+use Drupal\Core\TypedData\ListInterface;
+use Symfony\Component\Validator\PropertyMetadataContainerInterface;
+use Symfony\Component\Validator\ValidationVisitorInterface;
+
+/**
+ * Typed data implementation of the validator MetadataInterface.
+ */
+class PropertyContainerMetadata extends Metadata implements PropertyMetadataContainerInterface {
+
+  /**
+   * Overrides Metadata::accept().
+   */
+  public function accept(ValidationVisitorInterface $visitor, $typed_data, $group, $propertyPath) {
+
+    $visitor->visit($this, $typed_data, $group, $propertyPath);
+    $pathPrefix = empty($propertyPath) ? '' : $propertyPath . '.';
+
+    foreach ($this->typedData as $name => $data) {
+      $metadata = $this->factory->getMetadataFor($data, $name);
+      $metadata->accept($visitor, $data, $group, $pathPrefix . $name);
+    }
+  }
+
+  /**
+   * Implements PropertyMetadataContainerInterface::getPropertyMetadata().
+   */
+  public function getPropertyMetadata($property_name) {
+    if ($this->typedData instanceof ListInterface) {
+      return array(new PropertyMetadata($this->typedData[$property_name], $property_name));
+    }
+    elseif ($this->typedData instanceof ComplexDataInterface) {
+      return array(new PropertyMetadata($this->typedData->get($property_name), $property_name));
+    }
+    else {
+      throw new \LogicException("There are no known properties.");
+    }
+  }
+}
\ No newline at end of file
diff --git a/core/lib/Drupal/Core/Validation/ConstraintManager.php b/core/lib/Drupal/Core/Validation/ConstraintManager.php
new file mode 100644
index 0000000..54abd65
--- /dev/null
+++ b/core/lib/Drupal/Core/Validation/ConstraintManager.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\Core\Validation\ConstraintManager.
+ */
+
+namespace Drupal\Core\Validation;
+
+use Drupal\Component\Plugin\Factory\DefaultFactory;
+use Drupal\Component\Plugin\PluginManagerBase;
+use Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator;
+use Drupal\Core\Plugin\Discovery\AlterDecorator;
+use Drupal\Core\Plugin\Discovery\AnnotatedClassDiscovery;
+
+/**
+ * Constraint plugin manager.
+ *
+ * Manages validation constraints based upon
+ * \Symfony\Component\Validator\Constraint, whereas Symfony constraints are
+ * added in via the SymfonyDiscoveryDecorator class. Constraint options are
+ * passed on as plugin configuration during plugin instantiation.
+ *
+ * While core does not prefix constraint plugins, modules have to prefix them
+ * with the module name in order to avoid any naming conflicts. E.g. a "profile"
+ * module would have to prefix any constraints with "Profile".
+ */
+class ConstraintManager extends PluginManagerBase {
+
+  /**
+   * Overrides \Drupal\Component\Plugin\PluginManagerBase::__construct().
+   */
+  public function __construct() {
+    $discovery = new SymfonyDiscoveryDecorator(new AnnotatedClassDiscovery('Validation', 'Constraint'));
+    $this->discovery = new AlterDecorator(new DerivativeDiscoveryDecorator($discovery), 'validation_constraint');
+    $this->factory = new DefaultFactory($this->discovery);
+  }
+
+  /**
+   * Returns a list of Constraints that apply to a certain type.
+   *
+   * @param string $type
+   *   The type to filter on.
+   * @param boolean $include_general
+   *   Whether or not to include the ones with an empty type.
+   */
+  public function getList($type = NULL, $include_general = TRUE) {
+    $constraints = array();
+    $definitions = $this->getDefinitions();
+    foreach ($definitions as $plugin_id => $definition) {
+      if ($type === NULL || $definition['type'] == $type) {
+        $constraints[$plugin_id] = $definition;
+      }
+      elseif ($type === '' && $include_general) {
+        $constraints[$plugin_id] = $definition;
+      }
+    }
+    return $constraints;
+  }
+}
diff --git a/core/lib/Drupal/Core/Validation/ConstraintViolation.php b/core/lib/Drupal/Core/Validation/ConstraintViolation.php
new file mode 100644
index 0000000..ed59545
--- /dev/null
+++ b/core/lib/Drupal/Core/Validation/ConstraintViolation.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\Core\Validation\ConstraintViolation.
+ */
+
+namespace Drupal\Core\Validation;
+
+use Symfony\Component\Validator\ConstraintViolation as SymfonyConstraintViolation;
+
+/**
+ * Typed data implementation of the ConstraintViolationInterface.
+ */
+class ConstraintViolation extends SymfonyConstraintViolation {
+
+  /**
+   * Overrides SymfonyConstraintViolation::getMessage() to translate messages.
+   */
+  public function getMessage() {
+    $parameters = $this->getMessageParameters();
+
+    foreach ($parameters as $i => $parameter) {
+      if (is_array($parameter)) {
+        $parameters[$i] = 'Array';
+      }
+    }
+    // t() will escape Symfony message replacements like '{ limit }' as
+    // placeholder. See format_string().
+    return t($this->getMessageTemplate(), $parameters);
+  }
+}
\ No newline at end of file
diff --git a/core/lib/Drupal/Core/Validation/ExecutionContext.php b/core/lib/Drupal/Core/Validation/ExecutionContext.php
new file mode 100644
index 0000000..360cbda
--- /dev/null
+++ b/core/lib/Drupal/Core/Validation/ExecutionContext.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\Core\Validation\ExecutionContext.
+ */
+
+namespace Drupal\Core\Validation;
+
+use Symfony\Component\Validator\ExecutionContext as SymfonyExecutionContext;
+
+/**
+ * Typed data implementation of the ExecutionContextInterface.
+ */
+class ExecutionContext extends SymfonyExecutionContext {
+
+  /**
+   * Overrides SymfonyExecutionContext::addViolation().
+   */
+  public function addViolation($message, array $params = array(), $invalidValue = NULL, $pluralization = NULL, $code = NULL) {
+    $this->globalContext->getViolations()->add(new ConstraintViolation(
+      $message,
+      $params,
+      $this->globalContext->getRoot(),
+      $this->getPropertyPath(),
+      // check using func_num_args() to allow passing NULL values
+      func_num_args() >= 3 ? $invalidValue : $this->getValue(),
+      $pluralization,
+      $code
+    ));
+  }
+}
\ No newline at end of file
diff --git a/core/lib/Drupal/Core/Validation/SymfonyDiscoveryDecorator.php b/core/lib/Drupal/Core/Validation/SymfonyDiscoveryDecorator.php
new file mode 100644
index 0000000..8c8a4bc
--- /dev/null
+++ b/core/lib/Drupal/Core/Validation/SymfonyDiscoveryDecorator.php
@@ -0,0 +1,87 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Plugin\Discovery\SymfonyDiscoveryDecorator.
+*/
+
+namespace Drupal\Core\Validation;
+
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
+
+/**
+ * Adds definitions for constraints shipped with Symfony.
+ */
+class SymfonyDiscoveryDecorator implements DiscoveryInterface {
+
+  /**
+   * The Discovery object being decorated.
+   *
+   * @var \Drupal\Component\Plugin\Discovery\DiscoveryInterface
+   */
+  protected $decorated;
+
+  /**
+   * Constructs the decorator object.
+   *
+   * It uses the DiscoveryInterface object it should decorate.
+   *
+   * @param \Drupal\Component\Plugin\Discovery\DiscoveryInterface $decorated
+   *   The object implementing DiscoveryInterface that is being decorated.
+   */
+  public function __construct(DiscoveryInterface $decorated) {
+    $this->decorated = $decorated;
+  }
+
+  /**
+   * Implements \Drupal\Component\Plugin\Discovery\DiscoveryInterface::getDefinition().
+   */
+  public function getDefinition($plugin_id) {
+    $definitions = $this->getDefinitions();
+    if (isset($definitions[$plugin_id])) {
+      return $definitions[$plugin_id];
+    }
+  }
+
+  /**
+   * Implements \Drupal\Component\Plugin\Discovery\DiscoveryInterface::getDefinitions().
+   */
+  public function getDefinitions() {
+    $definitions = $this->decorated->getDefinitions();
+    // @todo: Care about types.
+
+    $definitions['Min'] = array(
+      'label' => t('Minimum value'),
+      'class' => '\Symfony\Component\Validator\Constraints\Min'
+    );
+    $definitions['MinLength'] = array(
+      'label' => t('Minimum length'),
+      'class' => '\Symfony\Component\Validator\Constraints\MinLength'
+    );
+    $definitions['Max'] = array(
+      'label' => t('Maximum value'),
+      'class' => '\Symfony\Component\Validator\Constraints\Max'
+    );
+    $definitions['MaxLength'] = array(
+      'label' => t('Maximum length'),
+      'class' => '\Symfony\Component\Validator\Constraints\MaxLength'
+    );
+    $definitions['Blank'] = array(
+      'label' => t('Blank'),
+      'class' => '\Symfony\Component\Validator\Constraints\Blank'
+    );
+    $definitions['NotBlank'] = array(
+      'label' => t('Not blank'),
+      'class' => '\Symfony\Component\Validator\Constraints\NotBlank'
+    );
+
+    return $definitions;
+  }
+
+  /**
+   * Passes through all unknown calls onto the decorated object
+   */
+  public function __call($method, $args) {
+    return call_user_func_array(array($this->decorated, $method), $args);
+  }
+}
diff --git a/core/lib/Drupal/Core/Validation/ValidationVisitor.php b/core/lib/Drupal/Core/Validation/ValidationVisitor.php
new file mode 100644
index 0000000..ffef0cf
--- /dev/null
+++ b/core/lib/Drupal/Core/Validation/ValidationVisitor.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\Core\Validation\ValidationVisitor.
+ */
+
+namespace Drupal\Core\Validation;
+
+use Symfony\Component\Validator\MetadataInterface;
+use Symfony\Component\Validator\ValidationVisitor as SymfonyValidationVisitor;
+
+/**
+ * Typed data implementation of the ValidationVisitorInterface.
+ */
+class ValidationVisitor extends SymfonyValidationVisitor {
+
+  /**
+   * Overrides SymfonyValidationVisitor::visit().
+   */
+  public function visit(MetadataInterface $metadata, $value, $group, $propertyPath) {
+    $context = new ExecutionContext(
+      $this,
+      $metadata,
+      $value,
+      $group,
+      $propertyPath
+    );
+
+    $context->validateValue($value, $metadata->findConstraints($group));
+  }
+}
\ No newline at end of file
diff --git a/core/lib/Drupal/Core/Validation/Validator.php b/core/lib/Drupal/Core/Validation/Validator.php
new file mode 100644
index 0000000..84e9db3
--- /dev/null
+++ b/core/lib/Drupal/Core/Validation/Validator.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\Core\Validation\Validator.
+ */
+
+namespace Drupal\Core\Validation;
+
+use Symfony\Component\Validator\Validator as SymfonyValidator;
+
+/**
+ * Typed data implementation of the ValidatorInterface.
+ */
+class Validator extends SymfonyValidator {
+
+  /**
+   * @var MetadataFactoryInterface
+   */
+  protected $metadataFactory;
+
+  /**
+   * @var ConstraintValidatorFactoryInterface
+   */
+  protected $validatorFactory;
+
+  /**
+   * @var array
+   */
+  protected $objectInitializers;
+
+  /**
+   * Overrides SymfonyValidator::createVisitor().
+   */
+  protected function createVisitor($root) {
+    return new ValidationVisitor($root, $this->metadataFactory, $this->validatorFactory, $this->objectInitializers);
+  }
+}
\ No newline at end of file
diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityFieldTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityFieldTest.php
index a152bfa..a6caffe 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityFieldTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityFieldTest.php
@@ -280,7 +280,7 @@ public function testIntrospection() {
     $definition = array(
       'type' => 'entity',
       'constraints' => array(
-        'entity type' => 'entity_test',
+        'EntityType' => 'entity_test',
       ),
       'label' => t('Test entity'),
     );
@@ -342,23 +342,23 @@ public function testIterator() {
   }
 
   /**
-   * Tests working with entity properties based upon data structure and data
-   * list interfaces.
+   * Tests working with the entity based upon the TypedData API.
    */
-  public function testDataStructureInterfaces() {
+  public function testTypedDataAPI() {
     $entity = $this->createTestEntity();
     $entity->save();
     $entity_definition = array(
       'type' => 'entity',
       'constraints' => array(
-        'entity type' => 'entity_test',
+        'EntityType' => 'entity_test',
       ),
       'label' => t('Test entity'),
     );
     $wrapped_entity = typed_data()->create($entity_definition, $entity);
 
-    // For the test we navigate through the tree of contained properties and get
-    // all contained strings, limited by a certain depth.
+    // Test using the whole tree of typed data by navigating through the tree of
+    // contained properties and getting all contained strings, limited by a
+    // certain depth.
     $strings = array();
     $this->getContainedStrings($wrapped_entity, 0, $strings);
 
@@ -373,6 +373,16 @@ public function testDataStructureInterfaces() {
       NULL,
     );
     $this->assertEqual($strings, $target_strings, 'All contained strings found.');
+
+    // Test validation the typed data object.
+    $violations = $wrapped_entity->validate();
+    $this->assertEqual($violations->count(), 0);
+
+    // Test validating an entity of the wrong type.
+    $node = $this->drupalCreateNode();
+    $wrapped_entity->setValue($node);
+    $violations = $wrapped_entity->validate();
+    $this->assertEqual($violations->count(), 1);
   }
 
   /**
diff --git a/core/modules/system/lib/Drupal/system/Tests/TypedData/TypedDataTest.php b/core/modules/system/lib/Drupal/system/Tests/TypedData/TypedDataTest.php
index 00e4c95..e1f62a6 100644
--- a/core/modules/system/lib/Drupal/system/Tests/TypedData/TypedDataTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/TypedData/TypedDataTest.php
@@ -16,6 +16,13 @@
  */
 class TypedDataTest extends WebTestBase {
 
+  /**
+   * The typed data manager to use.
+   *
+   * @var \Drupal\Core\TypedData\TypedDataManager
+   */
+  protected $typedData;
+
   public static function getInfo() {
     return array(
       'name' => 'Test typed data objects',
@@ -24,107 +31,240 @@ public static function getInfo() {
     );
   }
 
+  public function setUp() {
+    parent::setup();
+    $this->typedData = typed_data();
+  }
+
   /**
-   * Tests the basics around constructing and working with data wrappers.
+   * Tests the basics around constructing and working with typed data objects.
    */
   public function testGetAndSet() {
     // Boolean type.
-    $wrapper = $this->createTypedData(array('type' => 'boolean'), TRUE);
-    $this->assertTrue($wrapper->getValue() === TRUE, 'Boolean value was fetched.');
-    $wrapper->setValue(FALSE);
-    $this->assertTrue($wrapper->getValue() === FALSE, 'Boolean value was changed.');
-    $this->assertTrue(is_string($wrapper->getString()), 'Boolean value was converted to string');
-    $wrapper->setValue(NULL);
-    $this->assertNull($wrapper->getValue(), 'Boolean wrapper is null-able.');
+    $typed_data = $this->createTypedData(array('type' => 'boolean'), TRUE);
+    $this->assertTrue($typed_data->getValue() === TRUE, 'Boolean value was fetched.');
+    $this->assertEqual($typed_data->validate()->count(), 0);
+    $typed_data->setValue(FALSE);
+    $this->assertTrue($typed_data->getValue() === FALSE, 'Boolean value was changed.');
+    $this->assertEqual($typed_data->validate()->count(), 0);
+    $this->assertTrue(is_string($typed_data->getString()), 'Boolean value was converted to string');
+    $typed_data->setValue(NULL);
+    $this->assertNull($typed_data->getValue(), 'Boolean wrapper is null-able.');
+    $this->assertEqual($typed_data->validate()->count(), 0);
+    $typed_data->setValue('invalid');
+    $this->assertEqual($typed_data->validate()->count(), 1, 'Validation detected invalid value.');
 
     // String type.
     $value = $this->randomString();
-    $wrapper = $this->createTypedData(array('type' => 'string'), $value);
-    $this->assertTrue($wrapper->getValue() === $value, 'String value was fetched.');
+    $typed_data = $this->createTypedData(array('type' => 'string'), $value);
+    $this->assertTrue($typed_data->getValue() === $value, 'String value was fetched.');
+    $this->assertEqual($typed_data->validate()->count(), 0);
     $new_value = $this->randomString();
-    $wrapper->setValue($new_value);
-    $this->assertTrue($wrapper->getValue() === $new_value, 'String value was changed.');
+    $typed_data->setValue($new_value);
+    $this->assertTrue($typed_data->getValue() === $new_value, 'String value was changed.');
+    $this->assertEqual($typed_data->validate()->count(), 0);
     // Funky test.
-    $this->assertTrue(is_string($wrapper->getString()), 'String value was converted to string');
-    $wrapper->setValue(NULL);
-    $this->assertNull($wrapper->getValue(), 'String wrapper is null-able.');
+    $this->assertTrue(is_string($typed_data->getString()), 'String value was converted to string');
+    $typed_data->setValue(NULL);
+    $this->assertNull($typed_data->getValue(), 'String wrapper is null-able.');
+    $this->assertEqual($typed_data->validate()->count(), 0);
+    $typed_data->setValue(array('no string'));
+    $this->assertEqual($typed_data->validate()->count(), 1, 'Validation detected invalid value.');
 
     // Integer type.
     $value = rand();
-    $wrapper = $this->createTypedData(array('type' => 'integer'), $value);
-    $this->assertTrue($wrapper->getValue() === $value, 'Integer value was fetched.');
+    $typed_data = $this->createTypedData(array('type' => 'integer'), $value);
+    $this->assertTrue($typed_data->getValue() === $value, 'Integer value was fetched.');
+    $this->assertEqual($typed_data->validate()->count(), 0);
     $new_value = rand();
-    $wrapper->setValue($new_value);
-    $this->assertTrue($wrapper->getValue() === $new_value, 'Integer value was changed.');
-    $this->assertTrue(is_string($wrapper->getString()), 'Integer value was converted to string');
-    $wrapper->setValue(NULL);
-    $this->assertNull($wrapper->getValue(), 'Integer wrapper is null-able.');
+    $typed_data->setValue($new_value);
+    $this->assertTrue($typed_data->getValue() === $new_value, 'Integer value was changed.');
+    $this->assertTrue(is_string($typed_data->getString()), 'Integer value was converted to string');
+    $this->assertEqual($typed_data->validate()->count(), 0);
+    $typed_data->setValue(NULL);
+    $this->assertNull($typed_data->getValue(), 'Integer wrapper is null-able.');
+    $this->assertEqual($typed_data->validate()->count(), 0);
+    $typed_data->setValue('invalid');
+    $this->assertEqual($typed_data->validate()->count(), 1, 'Validation detected invalid value.');
 
     // Float type.
     $value = 123.45;
-    $wrapper = $this->createTypedData(array('type' => 'float'), $value);
-    $this->assertTrue($wrapper->getValue() === $value, 'Float value was fetched.');
+    $typed_data = $this->createTypedData(array('type' => 'float'), $value);
+    $this->assertTrue($typed_data->getValue() === $value, 'Float value was fetched.');
+    $this->assertEqual($typed_data->validate()->count(), 0);
     $new_value = 678.90;
-    $wrapper->setValue($new_value);
-    $this->assertTrue($wrapper->getValue() === $new_value, 'Float value was changed.');
-    $this->assertTrue(is_string($wrapper->getString()), 'Float value was converted to string');
-    $wrapper->setValue(NULL);
-    $this->assertNull($wrapper->getValue(), 'Float wrapper is null-able.');
+    $typed_data->setValue($new_value);
+    $this->assertTrue($typed_data->getValue() === $new_value, 'Float value was changed.');
+    $this->assertTrue(is_string($typed_data->getString()), 'Float value was converted to string');
+    $this->assertEqual($typed_data->validate()->count(), 0);
+    $typed_data->setValue(NULL);
+    $this->assertNull($typed_data->getValue(), 'Float wrapper is null-able.');
+    $this->assertEqual($typed_data->validate()->count(), 0);
+    $typed_data->setValue('invalid');
+    $this->assertEqual($typed_data->validate()->count(), 1, 'Validation detected invalid value.');
 
     // Date type.
     $value = new DrupalDateTime(REQUEST_TIME);
-    $wrapper = $this->createTypedData(array('type' => 'date'), $value);
-    $this->assertTrue($wrapper->getValue() === $value, 'Date value was fetched.');
+    $typed_data = $this->createTypedData(array('type' => 'date'), $value);
+    $this->assertTrue($typed_data->getValue() === $value, 'Date value was fetched.');
+    $this->assertEqual($typed_data->validate()->count(), 0);
     $new_value = REQUEST_TIME + 1;
-    $wrapper->setValue($new_value);
-    $this->assertTrue($wrapper->getValue()->getTimestamp() === $new_value, 'Date value was changed and set by timestamp.');
-    $wrapper->setValue('2000-01-01');
-    $this->assertTrue($wrapper->getValue()->format('Y-m-d') == '2000-01-01', 'Date value was changed and set by date string.');
-    $this->assertTrue(is_string($wrapper->getString()), 'Date value was converted to string');
-    $wrapper->setValue(NULL);
-    $this->assertNull($wrapper->getValue(), 'Date wrapper is null-able.');
+    $typed_data->setValue($new_value);
+    $this->assertTrue($typed_data->getValue()->getTimestamp() === $new_value, 'Date value was changed and set by timestamp.');
+    $this->assertEqual($typed_data->validate()->count(), 0);
+    $typed_data->setValue('2000-01-01');
+    $this->assertTrue($typed_data->getValue()->format('Y-m-d') == '2000-01-01', 'Date value was changed and set by date string.');
+    $this->assertTrue(is_string($typed_data->getString()), 'Date value was converted to string');
+    $this->assertEqual($typed_data->validate()->count(), 0);
+    $typed_data->setValue(NULL);
+    $this->assertNull($typed_data->getValue(), 'Date wrapper is null-able.');
+    $this->assertEqual($typed_data->validate()->count(), 0);
+    $typed_data->setValue('invalid');
+    $this->assertEqual($typed_data->validate()->count(), 1, 'Validation detected invalid value.');
 
     // Duration type.
     $value = new DateInterval('PT20S');
-    $wrapper = $this->createTypedData(array('type' => 'duration'), $value);
-    $this->assertTrue($wrapper->getValue() === $value, 'Duration value was fetched.');
-    $wrapper->setValue(10);
-    $this->assertTrue($wrapper->getValue()->s == 10, 'Duration value was changed and set by time span in seconds.');
-    $wrapper->setValue('P40D');
-    $this->assertTrue($wrapper->getValue()->d == 40, 'Duration value was changed and set by duration string.');
-    $this->assertTrue(is_string($wrapper->getString()), 'Duration value was converted to string');
+    $typed_data = $this->createTypedData(array('type' => 'duration'), $value);
+    $this->assertTrue($typed_data->getValue() === $value, 'Duration value was fetched.');
+    $this->assertEqual($typed_data->validate()->count(), 0);
+    $typed_data->setValue(10);
+    $this->assertTrue($typed_data->getValue()->s == 10, 'Duration value was changed and set by time span in seconds.');
+    $this->assertEqual($typed_data->validate()->count(), 0);
+    $typed_data->setValue('P40D');
+    $this->assertTrue($typed_data->getValue()->d == 40, 'Duration value was changed and set by duration string.');
+    $this->assertTrue(is_string($typed_data->getString()), 'Duration value was converted to string');
+    $this->assertEqual($typed_data->validate()->count(), 0);
     // Test getting the string and passing it back as value.
-    $duration = $wrapper->getString();
-    $wrapper->setValue($duration);
-    $this->assertEqual($wrapper->getString(), $duration, 'Duration formatted as string can be used to set the duration value.');
-    $wrapper->setValue(NULL);
-    $this->assertNull($wrapper->getValue(), 'Duration wrapper is null-able.');
-
-    // Generate some files that will be used to test the URI and the binary
-    // data types.
-    $files = $this->drupalGetTestFiles('image');
+    $duration = $typed_data->getString();
+    $typed_data->setValue($duration);
+    $this->assertEqual($typed_data->getString(), $duration, 'Duration formatted as string can be used to set the duration value.');
+    $this->assertEqual($typed_data->validate()->count(), 0);
+    $typed_data->setValue(NULL);
+    $this->assertNull($typed_data->getValue(), 'Duration wrapper is null-able.');
+    $this->assertEqual($typed_data->validate()->count(), 0);
+    $typed_data->setValue('invalid');
+    $this->assertEqual($typed_data->validate()->count(), 1, 'Validation detected invalid value.');
 
     // URI type.
-    $wrapper = $this->createTypedData(array('type' => 'uri'), $files[0]->uri);
-    $this->assertTrue($wrapper->getValue() === $files[0]->uri, 'URI value was fetched.');
-    $wrapper->setValue($files[1]->uri);
-    $this->assertTrue($wrapper->getValue() === $files[1]->uri, 'URI value was changed.');
-    $this->assertTrue(is_string($wrapper->getString()), 'URI value was converted to string');
-    $wrapper->setValue(NULL);
-    $this->assertNull($wrapper->getValue(), 'URI wrapper is null-able.');
+    $uri = 'http://example.com/foo/';
+    $typed_data = $this->createTypedData(array('type' => 'uri'), $uri);
+    $this->assertTrue($typed_data->getValue() === $uri, 'URI value was fetched.');
+    $this->assertEqual($typed_data->validate()->count(), 0);
+    $typed_data->setValue($uri . 'bar.txt');
+    $this->assertTrue($typed_data->getValue() === $uri . 'bar.txt', 'URI value was changed.');
+    $this->assertTrue(is_string($typed_data->getString()), 'URI value was converted to string');
+    $this->assertEqual($typed_data->validate()->count(), 0);
+    $typed_data->setValue(NULL);
+    $this->assertNull($typed_data->getValue(), 'URI wrapper is null-able.');
+    $this->assertEqual($typed_data->validate()->count(), 0);
+    $typed_data->setValue('invalid');
+    $this->assertEqual($typed_data->validate()->count(), 1, 'Validation detected invalid value.');
+
+    // Generate some files that will be used to test the binary data type.
+    $files = $this->drupalGetTestFiles('image');
 
     // Binary type.
-    $wrapper = $this->createTypedData(array('type' => 'binary'), $files[0]->uri);
-    $this->assertTrue(is_resource($wrapper->getValue()), 'Binary value was fetched.');
+    $typed_data = $this->createTypedData(array('type' => 'binary'), $files[0]->uri);
+    $this->assertTrue(is_resource($typed_data->getValue()), 'Binary value was fetched.');
+    $this->assertEqual($typed_data->validate()->count(), 0);
     // Try setting by URI.
-    $wrapper->setValue($files[1]->uri);
-    $this->assertEqual(is_resource($wrapper->getValue()), fopen($files[1]->uri, 'r'), 'Binary value was changed.');
-    $this->assertTrue(is_string($wrapper->getString()), 'Binary value was converted to string');
+    $typed_data->setValue($files[1]->uri);
+    $this->assertEqual(is_resource($typed_data->getValue()), fopen($files[1]->uri, 'r'), 'Binary value was changed.');
+    $this->assertTrue(is_string($typed_data->getString()), 'Binary value was converted to string');
+    $this->assertEqual($typed_data->validate()->count(), 0);
     // Try setting by resource.
-    $wrapper->setValue(fopen($files[2]->uri, 'r'));
-    $this->assertEqual(is_resource($wrapper->getValue()), fopen($files[2]->uri, 'r'), 'Binary value was changed.');
-    $this->assertTrue(is_string($wrapper->getString()), 'Binary value was converted to string');
-    $wrapper->setValue(NULL);
-    $this->assertNull($wrapper->getValue(), 'Binary wrapper is null-able.');
+    $typed_data->setValue(fopen($files[2]->uri, 'r'));
+    $this->assertEqual(is_resource($typed_data->getValue()), fopen($files[2]->uri, 'r'), 'Binary value was changed.');
+    $this->assertTrue(is_string($typed_data->getString()), 'Binary value was converted to string');
+    $this->assertEqual($typed_data->validate()->count(), 0);
+    $typed_data->setValue(NULL);
+    $this->assertNull($typed_data->getValue(), 'Binary wrapper is null-able.');
+    $this->assertEqual($typed_data->validate()->count(), 0);
+    $typed_data->setValue('invalid');
+    $this->assertEqual($typed_data->validate()->count(), 1, 'Validation detected invalid value.');
+  }
+
+  /**
+   * Tests typed data validation.
+   */
+  public function testTypedDataValidation() {
+    $definition = array(
+      'type' => 'integer',
+      'constraints' => array(
+        'Min' => array('limit' => 5),
+      ),
+    );
+    $violations = $this->typedData->create($definition, 10)->validate();
+    $this->assertEqual($violations->count(), 0);
+
+    $integer = $this->typedData->create($definition, 1);
+    $violations = $integer->validate();
+    $this->assertEqual($violations->count(), 1);
+
+    $message = t('This value should be {{ limit }} or more.', array('{{ limit }}' => 5));
+    $this->assertEqual($violations[0]->getMessage(), $message, 'Translated violation message retrieved.');
+    $this->assertEqual($violations[0]->getPropertyPath(), '');
+    $this->assertEqual($violations[0]->getPropertyPath(), '');
+    $this->assertIdentical($violations[0]->getRoot(), $integer, 'Root object returned.');
+
+    // Test having multiple violations.
+    $definition = array(
+      'type' => 'integer',
+      'constraints' => array(
+        'Min' => array('limit' => 5),
+        'Null' => array(),
+      ),
+    );
+    $violations = $this->typedData->create($definition, 10)->validate();
+    $this->assertEqual($violations->count(), 1);
+    $violations = $this->typedData->create($definition, 1)->validate();
+    $this->assertEqual($violations->count(), 2);
+
+    // Test validating property containers and make sure the NotNull and Null
+    // constraints work with typed data containers.
+    $definition = array(
+      'type' => 'integer_field',
+      'constraints' => array(
+        'NotNull' => array(),
+      ),
+    );
+    $field_item = $this->typedData->create($definition, array('value' => 10));
+    $violations = $field_item->validate();
+    $this->assertEqual($violations->count(), 0);
+
+    $field_item = $this->typedData->create($definition, array('value' => 'no integer'));
+    $violations = $field_item->validate();
+    $this->assertEqual($violations->count(), 1);
+    $this->assertEqual($violations[0]->getPropertyPath(), 'value');
+
+    // Test that the field item may not be empty.
+    $field_item = $this->typedData->create($definition);
+    $violations = $field_item->validate();
+    $this->assertEqual($violations->count(), 1);
+
+    // Test the Null constraint with typed data containers.
+    $definition = array(
+      'type' => 'integer_field',
+      'constraints' => array(
+        'Null' => array(),
+      ),
+    );
+    $field_item = $this->typedData->create($definition, array('value' => 10));
+    $violations = $field_item->validate();
+    $this->assertEqual($violations->count(), 1);
+    $field_item = $this->typedData->create($definition);
+    $violations = $field_item->validate();
+    $this->assertEqual($violations->count(), 0);
+
+    // Test specifying the same constraint plugin multiple times.
+    $definition = array(
+      'type' => 'integer',
+      'constraints' => array(
+        array('constraint' => 'Min', 'value' => array('limit' => 5)),
+        array('constraint' => 'Min', 'value' => array('limit' => 10)),
+      ),
+    );
+    $violations = $this->typedData->create($definition, 1)->validate();
+    $this->assertEqual($violations->count(), 2, 'Both constraints are violated.');
   }
 }
diff --git a/core/modules/system/system.api.php b/core/modules/system/system.api.php
index 239d3a2..68e6d2f 100644
--- a/core/modules/system/system.api.php
+++ b/core/modules/system/system.api.php
@@ -178,6 +178,8 @@ function hook_cron() {
  *     primitive types in \Drupal\Core\TypedData\Primitive. If set, it must be
  *     a constant defined by \Drupal\Core\TypedData\Primitive such as
  *     \Drupal\Core\TypedData\Primitive::String.
+ *   - constraints: An array of validation constraints for this type. See
+ *     \Drupal\Core\TypedData\TypedDataManager::getConstraints() for details.
  *
  * @see typed_data()
  * @see Drupal\Core\TypedData\TypedDataManager::create()
diff --git a/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationUITest.php b/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationUITest.php
index 934ed62..b7ffed4 100644
--- a/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationUITest.php
+++ b/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationUITest.php
@@ -156,7 +156,7 @@ function testTranslationUI() {
       $stored_value = $this->getValue($translation, $property, $default_langcode);
       $value = is_array($value) ? $value[0]['value'] : $value;
       $message = format_string('@property correctly stored in the default language.', array('@property' => $property));
-      $this->assertIdentical($stored_value, $value, $message);
+      $this->assertEqual($stored_value, $value, $message);
     }
 
     // Add an entity translation.
diff --git a/core/vendor/autoload.php b/core/vendor/autoload.php
index 004ba3a..ae9be26 100644
--- a/core/vendor/autoload.php
+++ b/core/vendor/autoload.php
@@ -4,4 +4,4 @@
 
 require_once __DIR__ . '/composer' . '/autoload_real.php';
 
-return ComposerAutoloaderInit::getLoader();
+return ComposerAutoloaderInit15d5b5237cf1ded139ea5b9975be2b6d::getLoader();
diff --git a/core/vendor/composer/ClassLoader.php b/core/vendor/composer/ClassLoader.php
index 00623e3..a4a0dc5 100644
--- a/core/vendor/composer/ClassLoader.php
+++ b/core/vendor/composer/ClassLoader.php
@@ -162,14 +162,14 @@ public function loadClass($class)
      */
     public function findFile($class)
     {
-        if (isset($this->classMap[$class])) {
-            return $this->classMap[$class];
-        }
-
         if ('\\' == $class[0]) {
             $class = substr($class, 1);
         }
 
+        if (isset($this->classMap[$class])) {
+            return $this->classMap[$class];
+        }
+
         if (false !== $pos = strrpos($class, '\\')) {
             // namespaced class name
             $classPath = str_replace('\\', DIRECTORY_SEPARATOR, substr($class, 0, $pos)) . DIRECTORY_SEPARATOR;
@@ -202,6 +202,6 @@ public function findFile($class)
             return $file;
         }
 
-        $this->classMap[$class] = false;
+        return $this->classMap[$class] = false;
     }
 }
diff --git a/core/vendor/composer/autoload_namespaces.php b/core/vendor/composer/autoload_namespaces.php
index c278de2..956352b 100644
--- a/core/vendor/composer/autoload_namespaces.php
+++ b/core/vendor/composer/autoload_namespaces.php
@@ -8,6 +8,7 @@
 return array(
     'Twig_' => $vendorDir . '/twig/twig/lib/',
     'Symfony\\Component\\Yaml' => $vendorDir . '/symfony/yaml/',
+    'Symfony\\Component\\Validator' => $vendorDir . '/symfony/validator/',
     'Symfony\\Component\\Serializer' => $vendorDir . '/symfony/serializer/',
     'Symfony\\Component\\Routing' => $vendorDir . '/symfony/routing/',
     'Symfony\\Component\\Process' => $vendorDir . '/symfony/process/',
diff --git a/core/vendor/composer/autoload_real.php b/core/vendor/composer/autoload_real.php
index 7d64f49..387cc33 100644
--- a/core/vendor/composer/autoload_real.php
+++ b/core/vendor/composer/autoload_real.php
@@ -2,13 +2,27 @@
 
 // autoload_real.php generated by Composer
 
-require __DIR__ . '/ClassLoader.php';
-
-class ComposerAutoloaderInit
+class ComposerAutoloaderInit15d5b5237cf1ded139ea5b9975be2b6d
 {
+    private static $loader;
+
+    public static function loadClassLoader($class)
+    {
+        if ('Composer\Autoload\ClassLoader' === $class) {
+            require __DIR__ . '/ClassLoader.php';
+        }
+    }
+
     public static function getLoader()
     {
-        $loader = new \Composer\Autoload\ClassLoader();
+        if (null !== static::$loader) {
+            return static::$loader;
+        }
+
+        spl_autoload_register(array('ComposerAutoloaderInit15d5b5237cf1ded139ea5b9975be2b6d', 'loadClassLoader'));
+        static::$loader = $loader = new \Composer\Autoload\ClassLoader();
+        spl_autoload_unregister(array('ComposerAutoloaderInit15d5b5237cf1ded139ea5b9975be2b6d', 'loadClassLoader'));
+
         $vendorDir = dirname(__DIR__);
         $baseDir = dirname($vendorDir);
 
diff --git a/core/vendor/composer/installed.json b/core/vendor/composer/installed.json
index 3fe9a18..b9ecce5 100644
--- a/core/vendor/composer/installed.json
+++ b/core/vendor/composer/installed.json
@@ -3,7 +3,6 @@
         "name": "twig/twig",
         "version": "v1.8.3",
         "version_normalized": "1.8.3.0",
-        "time": "2012-06-18 18:48:16",
         "source": {
             "type": "git",
             "url": "git://github.com/fabpot/Twig.git",
@@ -18,6 +17,7 @@
         "require": {
             "php": ">=5.2.4"
         },
+        "time": "2012-06-18 18:48:16",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -25,6 +25,11 @@
             }
         },
         "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Twig_": "lib/"
+            }
+        },
         "license": [
             "BSD-3"
         ],
@@ -46,19 +51,13 @@
         "homepage": "http://twig.sensiolabs.org",
         "keywords": [
             "templating"
-        ],
-        "autoload": {
-            "psr-0": {
-                "Twig_": "lib/"
-            }
-        }
+        ]
     },
     {
         "name": "symfony/class-loader",
         "version": "v2.1.0-RC2",
         "version_normalized": "2.1.0.0-RC2",
         "target-dir": "Symfony/Component/ClassLoader",
-        "time": "2012-08-27 14:51:49",
         "source": {
             "type": "git",
             "url": "https://github.com/symfony/ClassLoader",
@@ -76,6 +75,7 @@
         "require-dev": {
             "symfony/finder": "2.1.*"
         },
+        "time": "2012-08-27 14:51:49",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -83,6 +83,11 @@
             }
         },
         "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Symfony\\Component\\ClassLoader": ""
+            }
+        },
         "license": [
             "MIT"
         ],
@@ -101,19 +106,13 @@
             }
         ],
         "description": "Symfony ClassLoader Component",
-        "homepage": "http://symfony.com",
-        "autoload": {
-            "psr-0": {
-                "Symfony\\Component\\ClassLoader": ""
-            }
-        }
+        "homepage": "http://symfony.com"
     },
     {
         "name": "symfony/dependency-injection",
         "version": "v2.1.0-RC2",
         "version_normalized": "2.1.0.0-RC2",
         "target-dir": "Symfony/Component/DependencyInjection",
-        "time": "2012-08-28 06:54:42",
         "source": {
             "type": "git",
             "url": "https://github.com/symfony/DependencyInjection",
@@ -136,6 +135,7 @@
             "symfony/yaml": "v2.1.0-RC2",
             "symfony/config": "v2.1.0-RC2"
         },
+        "time": "2012-08-28 06:54:42",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -143,6 +143,11 @@
             }
         },
         "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Symfony\\Component\\DependencyInjection": ""
+            }
+        },
         "license": [
             "MIT"
         ],
@@ -161,18 +166,12 @@
             }
         ],
         "description": "Symfony DependencyInjection Component",
-        "homepage": "http://symfony.com",
-        "autoload": {
-            "psr-0": {
-                "Symfony\\Component\\DependencyInjection": ""
-            }
-        }
+        "homepage": "http://symfony.com"
     },
     {
         "name": "doctrine/common",
         "version": "2.3.0-RC2",
         "version_normalized": "2.3.0.0-RC2",
-        "time": "2012-08-29 13:06:32",
         "source": {
             "type": "git",
             "url": "https://github.com/doctrine/common",
@@ -187,6 +186,7 @@
         "require": {
             "php": ">=5.3.2"
         },
+        "time": "2012-08-29 13:06:32",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -194,6 +194,11 @@
             }
         },
         "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Doctrine\\Common": "lib/"
+            }
+        },
         "license": [
             "MIT"
         ],
@@ -237,19 +242,13 @@
             "eventmanager",
             "annotations",
             "persistence"
-        ],
-        "autoload": {
-            "psr-0": {
-                "Doctrine\\Common": "lib/"
-            }
-        }
+        ]
     },
     {
         "name": "symfony/http-foundation",
         "version": "v2.1.0-RC2",
         "version_normalized": "2.1.0.0-RC2",
         "target-dir": "Symfony/Component/HttpFoundation",
-        "time": "2012-08-22 12:48:41",
         "source": {
             "type": "git",
             "url": "https://github.com/symfony/HttpFoundation",
@@ -264,6 +263,7 @@
         "require": {
             "php": ">=5.3.3"
         },
+        "time": "2012-08-22 12:48:41",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -271,6 +271,12 @@
             }
         },
         "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Symfony\\Component\\HttpFoundation": "",
+                "SessionHandlerInterface": "Symfony/Component/HttpFoundation/Resources/stubs"
+            }
+        },
         "license": [
             "MIT"
         ],
@@ -289,20 +295,13 @@
             }
         ],
         "description": "Symfony HttpFoundation Component",
-        "homepage": "http://symfony.com",
-        "autoload": {
-            "psr-0": {
-                "Symfony\\Component\\HttpFoundation": "",
-                "SessionHandlerInterface": "Symfony/Component/HttpFoundation/Resources/stubs"
-            }
-        }
+        "homepage": "http://symfony.com"
     },
     {
         "name": "symfony/event-dispatcher",
         "version": "v2.1.0-RC2",
         "version_normalized": "2.1.0.0-RC2",
         "target-dir": "Symfony/Component/EventDispatcher",
-        "time": "2012-08-22 12:48:41",
         "source": {
             "type": "git",
             "url": "https://github.com/symfony/EventDispatcher",
@@ -324,6 +323,7 @@
             "symfony/dependency-injection": "v2.1.0-RC2",
             "symfony/http-kernel": "v2.1.0-RC2"
         },
+        "time": "2012-08-22 12:48:41",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -331,6 +331,11 @@
             }
         },
         "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Symfony\\Component\\EventDispatcher": ""
+            }
+        },
         "license": [
             "MIT"
         ],
@@ -349,19 +354,13 @@
             }
         ],
         "description": "Symfony EventDispatcher Component",
-        "homepage": "http://symfony.com",
-        "autoload": {
-            "psr-0": {
-                "Symfony\\Component\\EventDispatcher": ""
-            }
-        }
+        "homepage": "http://symfony.com"
     },
     {
         "name": "symfony/http-kernel",
         "version": "v2.1.0-RC2",
         "version_normalized": "2.1.0.0-RC2",
         "target-dir": "Symfony/Component/HttpKernel",
-        "time": "2012-08-28 07:00:18",
         "source": {
             "type": "git",
             "url": "https://github.com/symfony/HttpKernel",
@@ -396,6 +395,7 @@
             "symfony/dependency-injection": "v2.1.0-RC2",
             "symfony/finder": "v2.1.0-RC2"
         },
+        "time": "2012-08-28 07:00:18",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -403,6 +403,11 @@
             }
         },
         "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Symfony\\Component\\HttpKernel": ""
+            }
+        },
         "license": [
             "MIT"
         ],
@@ -421,19 +426,13 @@
             }
         ],
         "description": "Symfony HttpKernel Component",
-        "homepage": "http://symfony.com",
-        "autoload": {
-            "psr-0": {
-                "Symfony\\Component\\HttpKernel": ""
-            }
-        }
+        "homepage": "http://symfony.com"
     },
     {
         "name": "symfony/routing",
         "version": "v2.1.0-RC2",
         "version_normalized": "2.1.0.0-RC2",
         "target-dir": "Symfony/Component/Routing",
-        "time": "2012-08-28 06:54:42",
         "source": {
             "type": "git",
             "url": "https://github.com/symfony/Routing",
@@ -459,6 +458,7 @@
             "symfony/yaml": "v2.1.0-RC2",
             "doctrine/common": ">=2.2,<2.4-dev"
         },
+        "time": "2012-08-28 06:54:42",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -466,6 +466,11 @@
             }
         },
         "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Symfony\\Component\\Routing": ""
+            }
+        },
         "license": [
             "MIT"
         ],
@@ -484,19 +489,13 @@
             }
         ],
         "description": "Symfony Routing Component",
-        "homepage": "http://symfony.com",
-        "autoload": {
-            "psr-0": {
-                "Symfony\\Component\\Routing": ""
-            }
-        }
+        "homepage": "http://symfony.com"
     },
     {
         "name": "symfony/yaml",
         "version": "v2.1.0-RC2",
         "version_normalized": "2.1.0.0-RC2",
         "target-dir": "Symfony/Component/Yaml",
-        "time": "2012-08-22 12:48:41",
         "source": {
             "type": "git",
             "url": "https://github.com/symfony/Yaml",
@@ -511,6 +510,7 @@
         "require": {
             "php": ">=5.3.3"
         },
+        "time": "2012-08-22 12:48:41",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -518,6 +518,11 @@
             }
         },
         "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Symfony\\Component\\Yaml": ""
+            }
+        },
         "license": [
             "MIT"
         ],
@@ -536,19 +541,13 @@
             }
         ],
         "description": "Symfony Yaml Component",
-        "homepage": "http://symfony.com",
-        "autoload": {
-            "psr-0": {
-                "Symfony\\Component\\Yaml": ""
-            }
-        }
+        "homepage": "http://symfony.com"
     },
     {
         "name": "symfony/process",
         "version": "v2.1.0-RC2",
         "version_normalized": "2.1.0.0-RC2",
         "target-dir": "Symfony/Component/Process",
-        "time": "2012-08-26 06:13:51",
         "source": {
             "type": "git",
             "url": "https://github.com/symfony/Process",
@@ -563,6 +562,7 @@
         "require": {
             "php": ">=5.3.3"
         },
+        "time": "2012-08-26 06:13:51",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -570,6 +570,11 @@
             }
         },
         "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Symfony\\Component\\Process": ""
+            }
+        },
         "license": [
             "MIT"
         ],
@@ -584,18 +589,12 @@
             }
         ],
         "description": "Symfony Process Component",
-        "homepage": "http://symfony.com",
-        "autoload": {
-            "psr-0": {
-                "Symfony\\Component\\Process": ""
-            }
-        }
+        "homepage": "http://symfony.com"
     },
     {
         "name": "kriswallsmith/assetic",
         "version": "v1.1.0-alpha1",
         "version_normalized": "1.1.0.0-alpha1",
-        "time": "2012-08-28 05:33:44",
         "source": {
             "type": "git",
             "url": "http://github.com/kriswallsmith/assetic.git",
@@ -623,6 +622,7 @@
             "leafo/scssphp": "Assetic provides the integration with the scssphp SCSS compiler",
             "ptachoire/cssembed": "Assetic provides the integration with phpcssembed to embed data uris"
         },
+        "time": "2012-08-28 05:33:44",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -630,6 +630,11 @@
             }
         },
         "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Assetic": "src/"
+            }
+        },
         "license": [
             "MIT"
         ],
@@ -646,11 +651,112 @@
             "assets",
             "compression",
             "minification"
+        ]
+    },
+    {
+        "name": "symfony/serializer",
+        "version": "v2.1.2",
+        "version_normalized": "2.1.2.0",
+        "target-dir": "Symfony/Component/Serializer",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/Serializer",
+            "reference": "v2.1.2"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://github.com/symfony/Serializer/zipball/v2.1.2",
+            "reference": "v2.1.2",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.3"
+        },
+        "time": "2012-08-28 00:54:42",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "2.1-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Symfony\\Component\\Serializer": ""
+            }
+        },
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Fabien Potencier",
+                "email": "fabien@symfony.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "http://symfony.com/contributors"
+            }
         ],
+        "description": "Symfony Serializer Component",
+        "homepage": "http://symfony.com"
+    },
+    {
+        "name": "symfony/validator",
+        "version": "dev-master",
+        "version_normalized": "9999999-dev",
+        "target-dir": "Symfony/Component/Validator",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/Validator",
+            "reference": "0c335f22c8d25de7bb68e56f3927e775640822dd"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://github.com/symfony/Validator/archive/0c335f22c8d25de7bb68e56f3927e775640822dd.zip",
+            "reference": "0c335f22c8d25de7bb68e56f3927e775640822dd",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.3"
+        },
+        "require-dev": {
+            "symfony/http-foundation": "2.2.*",
+            "symfony/locale": "2.2.*",
+            "symfony/yaml": "2.2.*"
+        },
+        "suggest": {
+            "doctrine/common": ">=2.1,<2.4-dev",
+            "symfony/http-foundation": "2.2.*",
+            "symfony/yaml": "2.2.*"
+        },
+        "time": "2012-11-24 12:18:53",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "2.2-dev"
+            }
+        },
+        "installation-source": "source",
         "autoload": {
             "psr-0": {
-                "Assetic": "src/"
+                "Symfony\\Component\\Validator\\": ""
+            }
+        },
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Fabien Potencier",
+                "email": "fabien@symfony.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "http://symfony.com/contributors"
             }
-        }
+        ],
+        "description": "Symfony Validator Component",
+        "homepage": "http://symfony.com"
     }
 ]
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/CHANGELOG.md b/core/vendor/symfony/validator/Symfony/Component/Validator/CHANGELOG.md
new file mode 100644
index 0000000..41f311c
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/CHANGELOG.md
@@ -0,0 +1,57 @@
+CHANGELOG
+=========
+
+2.2.0
+-----
+
+ * added a CardScheme validator
+ * added a Luhn validator
+ * moved @api-tags from `Validator` to `ValidatorInterface`
+ * moved @api-tags from `ConstraintViolation` to the new `ConstraintViolationInterface`
+ * moved @api-tags from `ConstraintViolationList` to the new `ConstraintViolationListInterface`
+ * moved @api-tags from `ExecutionContext` to the new `ExecutionContextInterface`
+ * [BC BREAK] `ConstraintValidatorInterface::initialize` is now type hinted against `ExecutionContextInterface` instead of `ExecutionContext`
+ * [BC BREAK] changed the visibility of the properties in `Validator` from protected to private
+ * deprecated `ClassMetadataFactoryInterface` in favor of the new `MetadataFactoryInterface`
+ * deprecated `ClassMetadataFactory::getClassMetadata` in favor of `getMetadataFor`
+ * created `MetadataInterface`, `PropertyMetadataInterface`, `ClassBasedInterface` and `PropertyMetadataContainerInterface`
+ * deprecated `GraphWalker` in favor of the new `ValidationVisitorInterface`
+ * deprecated `ExecutionContext::addViolationAtPath`
+ * deprecated `ExecutionContext::addViolationAtSubPath` in favor of `ExecutionContextInterface::addViolationAt`
+ * deprecated `ExecutionContext::getCurrentClass` in favor of `ExecutionContextInterface::getClassName`
+ * deprecated `ExecutionContext::getCurrentProperty` in favor of `ExecutionContextInterface::getPropertyName`
+ * deprecated `ExecutionContext::getCurrentValue` in favor of `ExecutionContextInterface::getValue`
+ * deprecated `ExecutionContext::getGraphWalker` in favor of `ExecutionContextInterface::validate` and `ExecutionContextInterface::validateValue`
+ * deprecated `ExecutionContext::getMetadataFactory` in favor of `ExecutionContextInterface::getMetadataFor`
+ * improved `ValidatorInterface::validateValue` to accept arrays of constraints
+ * changed `ValidatorInterface::getMetadataFactory` to return a `MetadataFactoryInterface` instead of a `ClassMetadataFactoryInterface`
+ * removed `ClassMetadataFactoryInterface` type hint from `ValidatorBuilderInterface::setMetadataFactory`.
+   As of Symfony 2.3, this method will be typed against `MetadataFactoryInterface` instead.
+
+2.1.0
+-----
+
+ * added support for `ctype_*` assertions in `TypeValidator`
+ * improved the ImageValidator with min width, max width, min height, and max height constraints
+ * added support for MIME with wildcard in FileValidator
+ * changed Collection validator to add "missing" and "extra" errors to
+   individual fields
+ * changed default value for `extraFieldsMessage` and `missingFieldsMessage`
+   in Collection constraint
+ * made ExecutionContext immutable
+ * deprecated Constraint methods `setMessage`, `getMessageTemplate` and
+   `getMessageParameters`
+ * added support for dynamic group sequences with the GroupSequenceProvider pattern
+ * [BC BREAK] ConstraintValidatorInterface method `isValid` has been renamed to
+   `validate`, its return value was dropped. ConstraintValidator still contains
+   `isValid` for BC
+ * [BC BREAK] collections in fields annotated with `Valid` are not traversed
+   recursively anymore by default. `Valid` contains a new property `deep`
+   which enables the BC behavior.
+ * added Count constraint
+ * added Length constraint
+ * added Range constraint
+ * deprecated the Min and Max constraints
+ * deprecated the MinLength and MaxLength constraints
+ * added Validation and ValidatorBuilderInterface
+ * deprecated ValidatorContext, ValidatorContextInterface and ValidatorFactory
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/ClassBasedInterface.php b/core/vendor/symfony/validator/Symfony/Component/Validator/ClassBasedInterface.php
new file mode 100644
index 0000000..c8fa25d
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/ClassBasedInterface.php
@@ -0,0 +1,27 @@
+<?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;
+
+/**
+ * An object backed by a PHP class.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+interface ClassBasedInterface
+{
+    /**
+     * Returns the name of the backing PHP class.
+     *
+     * @return string The name of the backing class.
+     */
+    public function getClassName();
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraint.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraint.php
new file mode 100644
index 0000000..6c568aa
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraint.php
@@ -0,0 +1,220 @@
+<?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;
+
+use Symfony\Component\Validator\Exception\InvalidOptionsException;
+use Symfony\Component\Validator\Exception\MissingOptionsException;
+use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
+
+/**
+ * Contains the properties of a constraint definition.
+ *
+ * A constraint can be defined on a class, an option or a getter method.
+ * The Constraint class encapsulates all the configuration required for
+ * validating this class, option or getter result successfully.
+ *
+ * Constraint instances are immutable and serializable.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+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';
+
+    /**
+     * @var array
+     */
+    public $groups = array(self::DEFAULT_GROUP);
+
+    /**
+     * Initializes the constraint with options.
+     *
+     * You should pass an associative array. The keys should be the names of
+     * existing properties in this class. The values should be the value for these
+     * properties.
+     *
+     * Alternatively you can override the method getDefaultOption() to return the
+     * name of an existing property. If no associative array is passed, this
+     * property is set instead.
+     *
+     * You can force that certain options are set by overriding
+     * getRequiredOptions() to return the names of these options. If any
+     * option is not set here, an exception is thrown.
+     *
+     * @param mixed $options The options (as associative array)
+     *                       or the value for the default
+     *                       option (any other type)
+     *
+     * @throws InvalidOptionsException       When you pass the names of non-existing
+     *                                       options
+     * @throws MissingOptionsException       When you don't pass any of the options
+     *                                       returned by getRequiredOptions()
+     * @throws ConstraintDefinitionException When you don't pass an associative
+     *                                       array, but getDefaultOption() returns
+     *                                       NULL
+     *
+     * @api
+     */
+    public function __construct($options = null)
+    {
+        $invalidOptions = array();
+        $missingOptions = array_flip((array) $this->getRequiredOptions());
+
+        if (is_array($options) && count($options) == 1 && isset($options['value'])) {
+            $options = $options['value'];
+        }
+
+        if (is_array($options) && count($options) > 0 && is_string(key($options))) {
+            foreach ($options as $option => $value) {
+                if (property_exists($this, $option)) {
+                    $this->$option = $value;
+                    unset($missingOptions[$option]);
+                } else {
+                    $invalidOptions[] = $option;
+                }
+            }
+        } elseif (null !== $options && ! (is_array($options) && count($options) === 0)) {
+            $option = $this->getDefaultOption();
+
+            if (null === $option) {
+                throw new ConstraintDefinitionException(
+                    sprintf('No default option is configured for constraint %s', get_class($this))
+                );
+            }
+
+            if (property_exists($this, $option)) {
+                $this->$option = $options;
+                unset($missingOptions[$option]);
+            } else {
+                $invalidOptions[] = $option;
+            }
+        }
+
+        if (count($invalidOptions) > 0) {
+            throw new InvalidOptionsException(
+                sprintf('The options "%s" do not exist in constraint %s', implode('", "', $invalidOptions), get_class($this)),
+                $invalidOptions
+            );
+        }
+
+        if (count($missingOptions) > 0) {
+            throw new MissingOptionsException(
+                sprintf('The options "%s" must be set for constraint %s', implode('", "', array_keys($missingOptions)), get_class($this)),
+                array_keys($missingOptions)
+            );
+        }
+
+        $this->groups = (array) $this->groups;
+    }
+
+    /**
+     * Unsupported operation.
+     */
+    public function __set($option, $value)
+    {
+        throw new InvalidOptionsException(sprintf('The option "%s" does not exist in constraint %s', $option, get_class($this)), array($option));
+    }
+
+    /**
+     * Adds the given group if this constraint is in the Default group
+     *
+     * @param string $group
+     *
+     * @api
+     */
+    public function addImplicitGroupName($group)
+    {
+        if (in_array(Constraint::DEFAULT_GROUP, $this->groups) && !in_array($group, $this->groups)) {
+            $this->groups[] = $group;
+        }
+    }
+
+    /**
+     * Returns the name of the default option
+     *
+     * Override this method to define a default option.
+     *
+     * @return string
+     * @see __construct()
+     *
+     * @api
+     */
+    public function getDefaultOption()
+    {
+        return null;
+    }
+
+    /**
+     * Returns the name of the required options
+     *
+     * Override this method if you want to define required options.
+     *
+     * @return array
+     * @see __construct()
+     *
+     * @api
+     */
+    public function getRequiredOptions()
+    {
+        return array();
+    }
+
+    /**
+     * Returns the name of the class that validates this constraint
+     *
+     * By default, this is the fully qualified name of the constraint class
+     * suffixed with "Validator". You can override this method to change that
+     * behaviour.
+     *
+     * @return string
+     *
+     * @api
+     */
+    public function validatedBy()
+    {
+        return get_class($this).'Validator';
+    }
+
+    /**
+     * Returns whether the constraint can be put onto classes, properties or
+     * both
+     *
+     * This method should return one or more of the constants
+     * Constraint::CLASS_CONSTRAINT and Constraint::PROPERTY_CONSTRAINT.
+     *
+     * @return string|array  One or more constant values
+     *
+     * @api
+     */
+    public function getTargets()
+    {
+        return self::PROPERTY_CONSTRAINT;
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/ConstraintValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/ConstraintValidator.php
new file mode 100644
index 0000000..cf58c70
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/ConstraintValidator.php
@@ -0,0 +1,111 @@
+<?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;
+
+use Symfony\Component\Validator\Exception\ValidatorException;
+
+/**
+ * Base class for constraint validators
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+abstract class ConstraintValidator implements ConstraintValidatorInterface
+{
+    /**
+     * @var ExecutionContextInterface
+     */
+    protected $context;
+
+    /**
+     * @var string
+     *
+     * @deprecated
+     */
+    private $messageTemplate;
+
+    /**
+     * @var array
+     *
+     * @deprecated
+     */
+    private $messageParameters;
+
+    /**
+     * {@inheritDoc}
+     */
+    public function initialize(ExecutionContextInterface $context)
+    {
+        $this->context = $context;
+        $this->messageTemplate = '';
+        $this->messageParameters = array();
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @deprecated Deprecated since version 2.1, to be removed in 2.3.
+     */
+    public function getMessageTemplate()
+    {
+        return $this->messageTemplate;
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @deprecated Deprecated since version 2.1, to be removed in 2.3.
+     */
+    public function getMessageParameters()
+    {
+        return $this->messageParameters;
+    }
+
+    /**
+     * Wrapper for $this->context->addViolation()
+     *
+     * @deprecated Deprecated since version 2.1, to be removed in 2.3.
+     */
+    protected function setMessage($template, array $parameters = array())
+    {
+        $this->messageTemplate = $template;
+        $this->messageParameters = $parameters;
+
+        if (!$this->context instanceof ExecutionContext) {
+            throw new ValidatorException('ConstraintValidator::initialize() must be called before setting violation messages');
+        }
+
+        $this->context->addViolation($template, $parameters);
+    }
+
+    /**
+     * Stub implementation delegating to the deprecated isValid method.
+     *
+     * This stub exists for BC and will be dropped in Symfony 2.3.
+     *
+     * @see ConstraintValidatorInterface::validate
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        return $this->isValid($value, $constraint);
+    }
+
+    /**
+     * BC variant of validate.
+     *
+     * @deprecated Deprecated since version 2.1, to be removed in 2.3.
+     */
+    protected function isValid($value, Constraint $constraint)
+    {
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/ConstraintValidatorFactory.php b/core/vendor/symfony/validator/Symfony/Component/Validator/ConstraintValidatorFactory.php
new file mode 100644
index 0000000..f297cc8
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/ConstraintValidatorFactory.php
@@ -0,0 +1,41 @@
+<?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;
+
+use Symfony\Component\Validator\ConstraintValidatorFactoryInterface;
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * Default implementation of the ConstraintValidatorFactoryInterface.
+ *
+ * This enforces the convention that the validatedBy() method on any
+ * Constrain will return the class name of the ConstraintValidator that
+ * should validate the Constraint.
+ */
+class ConstraintValidatorFactory implements ConstraintValidatorFactoryInterface
+{
+    protected $validators = array();
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getInstance(Constraint $constraint)
+    {
+        $className = $constraint->validatedBy();
+
+        if (!isset($this->validators[$className])) {
+            $this->validators[$className] = new $className();
+        }
+
+        return $this->validators[$className];
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/ConstraintValidatorFactoryInterface.php b/core/vendor/symfony/validator/Symfony/Component/Validator/ConstraintValidatorFactoryInterface.php
new file mode 100644
index 0000000..584f980
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/ConstraintValidatorFactoryInterface.php
@@ -0,0 +1,31 @@
+<?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;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * Specifies an object able to return the correct ConstraintValidatorInterface
+ * instance given a Constrain object.
+ */
+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/core/vendor/symfony/validator/Symfony/Component/Validator/ConstraintValidatorInterface.php b/core/vendor/symfony/validator/Symfony/Component/Validator/ConstraintValidatorInterface.php
new file mode 100644
index 0000000..f7538a1
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/ConstraintValidatorInterface.php
@@ -0,0 +1,37 @@
+<?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;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+interface ConstraintValidatorInterface
+{
+    /**
+     * Initializes the constraint validator.
+     *
+     * @param ExecutionContextInterface $context The current validation context
+     */
+    public function initialize(ExecutionContextInterface $context);
+
+    /**
+     * Checks if the passed value is valid.
+     *
+     * @param mixed      $value      The value that should be validated
+     * @param Constraint $constraint The constraint for the validation
+     *
+     * @api
+     */
+    public function validate($value, Constraint $constraint);
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/ConstraintViolation.php b/core/vendor/symfony/validator/Symfony/Component/Validator/ConstraintViolation.php
new file mode 100644
index 0000000..7b6f1e1
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/ConstraintViolation.php
@@ -0,0 +1,177 @@
+<?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;
+
+/**
+ * Default implementation of {@ConstraintViolationInterface}.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class ConstraintViolation implements ConstraintViolationInterface
+{
+    /**
+     * @var string
+     */
+    private $messageTemplate;
+
+    /**
+     * @var array
+     */
+    private $messageParameters;
+
+    /**
+     * @var integer|null
+     */
+    private $messagePluralization;
+
+    /**
+     * @var mixed
+     */
+    private $root;
+
+    /**
+     * @var string
+     */
+    private $propertyPath;
+
+    /**
+     * @var mixed
+     */
+    private $invalidValue;
+
+    /**
+     * @var mixed
+     */
+    private $code;
+
+    /**
+     * Creates a new constraint violation.
+     *
+     * @param string       $messageTemplate       The raw violation message.
+     * @param array        $messageParameters     The parameters to substitute
+     *                                            in the raw message.
+     * @param mixed        $root                  The value originally passed
+     *                                            to the validator.
+     * @param string       $propertyPath          The property path from the
+     *                                            root value to the invalid
+     *                                            value.
+     * @param mixed        $invalidValue          The invalid value causing the
+     *                                            violation.
+     * @param integer|null $messagePluralization  The pluralization parameter.
+     * @param mixed        $code                  The error code of the
+     *                                            violation, if any.
+     */
+    public function __construct($messageTemplate, array $messageParameters, $root, $propertyPath, $invalidValue, $messagePluralization = null, $code = null)
+    {
+        $this->messageTemplate = $messageTemplate;
+        $this->messageParameters = $messageParameters;
+        $this->messagePluralization = $messagePluralization;
+        $this->root = $root;
+        $this->propertyPath = $propertyPath;
+        $this->invalidValue = $invalidValue;
+        $this->code = $code;
+    }
+
+    /**
+     * Converts the violation into a string for debugging purposes.
+     *
+     * @return string The violation as string.
+     */
+    public function __toString()
+    {
+        $class = (string) (is_object($this->root) ? get_class($this->root) : $this->root);
+        $propertyPath = (string) $this->propertyPath;
+        $code = $this->code;
+
+        if ('' !== $propertyPath && '[' !== $propertyPath[0] && '' !== $class) {
+            $class .= '.';
+        }
+
+        if (!empty($code)) {
+            $code = ' (code ' . $code . ')';
+        }
+
+        return $class . $propertyPath . ":\n    " . $this->getMessage() . $code;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getMessageTemplate()
+    {
+        return $this->messageTemplate;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getMessageParameters()
+    {
+        return $this->messageParameters;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getMessagePluralization()
+    {
+        return $this->messagePluralization;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getMessage()
+    {
+        $parameters = $this->messageParameters;
+
+        foreach ($parameters as $i => $parameter) {
+            if (is_array($parameter)) {
+                $parameters[$i] = 'Array';
+            }
+        }
+
+        return strtr($this->messageTemplate, $parameters);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getRoot()
+    {
+        return $this->root;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getPropertyPath()
+    {
+        return $this->propertyPath;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getInvalidValue()
+    {
+        return $this->invalidValue;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getCode()
+    {
+        return $this->code;
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/ConstraintViolationInterface.php b/core/vendor/symfony/validator/Symfony/Component/Validator/ConstraintViolationInterface.php
new file mode 100644
index 0000000..cf1d5b9
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/ConstraintViolationInterface.php
@@ -0,0 +1,136 @@
+<?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;
+
+/**
+ * A violation of a constraint that happened during validation.
+ *
+ * For each constraint that fails during validation one or more violations are
+ * created. The violations store the violation message, the path to the failing
+ * element in the validation graph and the root element that was originally
+ * passed to the validator. For example, take the following graph:
+ *
+ * <pre>
+ * (Person)---(firstName: string)
+ *      \
+ *   (address: Address)---(street: string)
+ * </pre>
+ *
+ * If the <tt>Person</tt> object is validated and validation fails for the
+ * "firstName" property, the generated violation has the <tt>Person</tt>
+ * instance as root and the property path "firstName". If validation fails
+ * for the "street" property of the related <tt>Address</tt> instance, the root
+ * element is still the person, but the property path is "address.street".
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+interface ConstraintViolationInterface
+{
+    /**
+     * Returns the violation message.
+     *
+     * @return string The violation message.
+     *
+     * @api
+     */
+    public function getMessage();
+
+    /**
+     * Returns the raw violation message.
+     *
+     * The raw violation message contains placeholders for the parameters
+     * returned by {@link getMessageParameters}. Typically you'll pass the
+     * message template and parameters to a translation engine.
+     *
+     * @return string The raw violation message.
+     *
+     * @api
+     */
+    public function getMessageTemplate();
+
+    /**
+     * 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.
+     *
+     * @see getMessageTemplate
+     *
+     * @api
+     */
+    public function getMessageParameters();
+
+    /**
+     * Returns a number for pluralizing the violation message.
+     *
+     * For example, the message template could have different translation based
+     * on a parameter "choices":
+     *
+     * <ul>
+     * <li>Please select exactly one entry. (choices=1)</li>
+     * <li>Please select two entries. (choices=2)</li>
+     * </ul>
+     *
+     * This method returns the value of the parameter for choosing the right
+     * pluralization form (in this case "choices").
+     *
+     * @return integer|null The number to use to pluralize of the message.
+     */
+    public function getMessagePluralization();
+
+    /**
+     * Returns the root element of the validation.
+     *
+     * @return mixed The value that was passed originally to the validator when
+     *               the validation was started. Because the validator traverses
+     *               the object graph, the value at which the violation occurs
+     *               is not necessarily the value that was originally validated.
+     *
+     * @api
+     */
+    public function getRoot();
+
+    /**
+     * Returns the property path from the root element to the violation.
+     *
+     * @return string The property path indicates how the validator reached
+     *                the invalid value from the root element. If the root
+     *                element is a <tt>Person</tt> instance with a property
+     *                "address" that contains an <tt>Address</tt> instance
+     *                with an invalid property "street", the generated property
+     *                path is "address.street". Property access is denoted by
+     *                dots, while array access is denoted by square brackets,
+     *                for example "addresses[1].street".
+     *
+     * @api
+     */
+    public function getPropertyPath();
+
+    /**
+     * Returns the value that caused the violation.
+     *
+     * @return mixed The invalid value that caused the validated constraint to
+     *               fail.
+     *
+     * @api
+     */
+    public function getInvalidValue();
+
+    /**
+     * Returns a machine-digestible error code for the violation.
+     *
+     * @return mixed The error code.
+     */
+    public function getCode();
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/ConstraintViolationList.php b/core/vendor/symfony/validator/Symfony/Component/Validator/ConstraintViolationList.php
new file mode 100644
index 0000000..ef5a196
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/ConstraintViolationList.php
@@ -0,0 +1,159 @@
+<?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;
+
+/**
+ * Default implementation of {@ConstraintViolationListInterface}.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class ConstraintViolationList implements \IteratorAggregate, ConstraintViolationListInterface
+{
+    /**
+     * @var ConstraintViolationInterface[]
+     */
+    private $violations = array();
+
+    /**
+     * Creates a new constraint violation list.
+     *
+     * @param ConstraintViolationInterface[] $violations The constraint violations to add to the list
+     */
+    public function __construct(array $violations = array())
+    {
+        foreach ($violations as $violation) {
+            $this->add($violation);
+        }
+    }
+
+    /**
+     * Converts the violation into a string for debugging purposes.
+     *
+     * @return string The violation as string.
+     */
+    public function __toString()
+    {
+        $string = '';
+
+        foreach ($this->violations as $violation) {
+            $string .= $violation . "\n";
+        }
+
+        return $string;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function add(ConstraintViolationInterface $violation)
+    {
+        $this->violations[] = $violation;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function addAll(ConstraintViolationListInterface $otherList)
+    {
+        foreach ($otherList as $violation) {
+            $this->violations[] = $violation;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function get($offset)
+    {
+        if (!isset($this->violations[$offset])) {
+            throw new \OutOfBoundsException(sprintf('The offset "%s" does not exist.', $offset));
+        }
+
+        return $this->violations[$offset];
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function has($offset)
+    {
+        return isset($this->violations[$offset]);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function set($offset, ConstraintViolationInterface $violation)
+    {
+        $this->violations[$offset] = $violation;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function remove($offset)
+    {
+        unset($this->violations[$offset]);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getIterator()
+    {
+        return new \ArrayIterator($this->violations);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function count()
+    {
+        return count($this->violations);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function offsetExists($offset)
+    {
+        return $this->has($offset);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function offsetGet($offset)
+    {
+        return $this->get($offset);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function offsetSet($offset, $violation)
+    {
+        if (null === $offset) {
+            $this->add($violation);
+        } else {
+            $this->set($offset, $violation);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function offsetUnset($offset)
+    {
+        $this->remove($offset);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/ConstraintViolationListInterface.php b/core/vendor/symfony/validator/Symfony/Component/Validator/ConstraintViolationListInterface.php
new file mode 100644
index 0000000..21b857e
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/ConstraintViolationListInterface.php
@@ -0,0 +1,83 @@
+<?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;
+
+/**
+ * A list of constraint violations.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+interface ConstraintViolationListInterface extends \Traversable, \Countable, \ArrayAccess
+{
+    /**
+     * Adds a constraint violation to this list.
+     *
+     * @param ConstraintViolationInterface $violation The violation to add.
+     *
+     * @api
+     */
+    public function add(ConstraintViolationInterface $violation);
+
+    /**
+     * Merges an existing violation list into this list.
+     *
+     * @param ConstraintViolationListInterface $otherList The list to merge.
+     *
+     * @api
+     */
+    public function addAll(ConstraintViolationListInterface $otherList);
+
+    /**
+     * Returns the violation at a given offset.
+     *
+     * @param  integer $offset The offset of the violation.
+     *
+     * @return ConstraintViolationInterface The violation.
+     *
+     * @throws \OutOfBoundsException If the offset does not exist.
+     *
+     * @api
+     */
+    public function get($offset);
+
+    /**
+     * Returns whether the given offset exists.
+     *
+     * @param  integer $offset The violation offset.
+     *
+     * @return Boolean Whether the offset exists.
+     *
+     * @api
+     */
+    public function has($offset);
+
+    /**
+     * Sets a violation at a given offset.
+     *
+     * @param integer                      $offset    The violation offset.
+     * @param ConstraintViolationInterface $violation The violation.
+     *
+     * @api
+     */
+    public function set($offset, ConstraintViolationInterface $violation);
+
+    /**
+     * Removes a violation at a given offset.
+     *
+     * @param integer $offset The offset to remove.
+     *
+     * @api
+     */
+    public function remove($offset);
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/All.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/All.php
new file mode 100644
index 0000000..612aaf2
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/All.php
@@ -0,0 +1,57 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
+
+/**
+ * @Annotation
+ *
+ * @api
+ */
+class All extends Constraint
+{
+    public $constraints = array();
+
+    /**
+     * {@inheritDoc}
+     */
+    public function __construct($options = null)
+    {
+        parent::__construct($options);
+
+        if (!is_array($this->constraints)) {
+            $this->constraints = array($this->constraints);
+        }
+
+        foreach ($this->constraints as $constraint) {
+            if (!$constraint instanceof Constraint) {
+                throw new ConstraintDefinitionException('The value ' . $constraint . ' is not an instance of Constraint in constraint ' . __CLASS__);
+            }
+
+            if ($constraint instanceof Valid) {
+                throw new ConstraintDefinitionException('The constraint Valid cannot be nested inside constraint ' . __CLASS__ . '. You can only declare the Valid constraint directly on a field or method.');
+            }
+        }
+    }
+
+    public function getDefaultOption()
+    {
+        return 'constraints';
+    }
+
+    public function getRequiredOptions()
+    {
+        return array('constraints');
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/AllValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/AllValidator.php
new file mode 100644
index 0000000..622a90b
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/AllValidator.php
@@ -0,0 +1,48 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+class AllValidator extends ConstraintValidator
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if (null === $value) {
+            return;
+        }
+
+        if (!is_array($value) && !$value instanceof \Traversable) {
+            throw new UnexpectedTypeException($value, 'array or Traversable');
+        }
+
+        $walker = $this->context->getGraphWalker();
+        $group = $this->context->getGroup();
+        $propertyPath = $this->context->getPropertyPath();
+
+        foreach ($value as $key => $element) {
+            foreach ($constraint->constraints as $constr) {
+                $walker->walkConstraint($constr, $element, $group, $propertyPath.'['.$key.']');
+            }
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Blank.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Blank.php
new file mode 100644
index 0000000..b6db62a
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Blank.php
@@ -0,0 +1,24 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Annotation
+ *
+ * @api
+ */
+class Blank extends Constraint
+{
+    public $message = 'This value should be blank.';
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/BlankValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/BlankValidator.php
new file mode 100644
index 0000000..0a67358
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/BlankValidator.php
@@ -0,0 +1,33 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+class BlankValidator extends ConstraintValidator
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if ('' !== $value && null !== $value) {
+            $this->context->addViolation($constraint->message, array('{{ value }}' => $value));
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Callback.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Callback.php
new file mode 100644
index 0000000..4470b70
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Callback.php
@@ -0,0 +1,48 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Annotation
+ *
+ * @api
+ */
+class Callback extends Constraint
+{
+    public $methods;
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getRequiredOptions()
+    {
+        return array('methods');
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getDefaultOption()
+    {
+        return 'methods';
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getTargets()
+    {
+        return self::CLASS_CONSTRAINT;
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CallbackValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CallbackValidator.php
new file mode 100644
index 0000000..ab3c56f
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CallbackValidator.php
@@ -0,0 +1,61 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
+
+/**
+ * Validator for Callback constraint
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+class CallbackValidator extends ConstraintValidator
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($object, Constraint $constraint)
+    {
+        if (null === $object) {
+            return;
+        }
+
+        // has to be an array so that we can differentiate between callables
+        // and method names
+        if (!is_array($constraint->methods)) {
+            throw new UnexpectedTypeException($constraint->methods, 'array');
+        }
+
+        $methods = $constraint->methods;
+
+        foreach ($methods as $method) {
+            if (is_array($method) || $method instanceof \Closure) {
+                if (!is_callable($method)) {
+                    throw new ConstraintDefinitionException(sprintf('"%s::%s" targeted by Callback constraint is not a valid callable', $method[0], $method[1]));
+                }
+
+                call_user_func($method, $object, $this->context);
+            } else {
+                if (!method_exists($object, $method)) {
+                    throw new ConstraintDefinitionException(sprintf('Method "%s" targeted by Callback constraint does not exist', $method));
+                }
+
+                $object->$method($this->context);
+            }
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CardScheme.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CardScheme.php
new file mode 100644
index 0000000..356cad9
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CardScheme.php
@@ -0,0 +1,35 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * Metadata for the CardSchemeValidator.
+ *
+ * @Annotation
+ */
+class CardScheme extends Constraint
+{
+    public $message = 'Unsupported card type or invalid card number';
+    public $schemes;
+
+    public function getDefaultOption()
+    {
+        return 'schemes';
+    }
+
+    public function getRequiredOptions()
+    {
+        return array('schemes');
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CardSchemeValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CardSchemeValidator.php
new file mode 100644
index 0000000..97b4567
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CardSchemeValidator.php
@@ -0,0 +1,92 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+
+/**
+ * Validates that a card number belongs to a specified scheme.
+ *
+ * @see http://en.wikipedia.org/wiki/Bank_card_number
+ * @author Tim Nagel <t.nagel@infinite.net.au>
+ */
+class CardSchemeValidator extends ConstraintValidator
+{
+    protected $schemes = array(
+        'AMEX' => array(
+            '/^(3[47])([0-9]{13})/'
+        ),
+        'CHINA_UNIONPAY' => array(
+            '/^(62)([0-9]{16,19}/'
+        ),
+        'DINERS' => array(
+            '/^(36)([0-9]{12})/',
+            '/^(30[0-5])([0-9]{11})/',
+            '/^(5[45])([0-9]{14})/'
+        ),
+        'DISCOVER' => array(
+            '/^(6011)([0-9]{12})/',
+            '/^(64[4-9])([0-9]{13})/',
+            '/^(65)([0-9]{14})/',
+            '/^(622)(12[6-9]|1[3-9][0-9]|[2-8][0-9][0-9]|91[0-9]|92[0-5])([0-9]{10})/'
+        ),
+        'INSTAPAYMENT' => array(
+            '/^(63[7-9])([0-9]{13})/'
+        ),
+        'JCB' => array(
+            '/^(352[8-9]|35[3-8][0-9])([0-9]{12})/'
+        ),
+        'LASER' => array(
+            '/^(6304|670[69]|6771)([0-9]{12, 15})/'
+        ),
+        'MAESTRO' => array(
+            '/^(5018|5020|5038|6304|6759|6761|676[23]|0604)([0-9]{8, 15})/'
+        ),
+        'MASTERCARD' => array(
+            '/^(5[1-5])([0-9]{14})/'
+        ),
+        'VISA' => array(
+            '/^(4)([0-9]{12})/'
+        ),
+    );
+
+    /**
+     * Validates a creditcard belongs to a specified scheme.
+     *
+     * @param mixed $value
+     * @param Constraint $constraint
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if (null === $value || '' === $value) {
+            return;
+        }
+
+        if (!is_numeric($value)) {
+            $this->context->addViolation($constraint->message);
+        }
+
+        $schemes = array_flip($constraint->schemes);
+        $schemeRegexes = array_intersect_key($this->schemes, $schemes);
+
+        foreach ($schemeRegexes as $regexes) {
+            foreach ($regexes as $regex) {
+                if (preg_match($regex, $value)) {
+                    return;
+                }
+            }
+        }
+
+        $this->context->addViolation($constraint->message);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Choice.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Choice.php
new file mode 100644
index 0000000..b73bd77
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Choice.php
@@ -0,0 +1,41 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Annotation
+ *
+ * @api
+ */
+class Choice extends Constraint
+{
+    public $choices;
+    public $callback;
+    public $multiple = false;
+    public $strict = false;
+    public $min = null;
+    public $max = null;
+    public $message = 'The value you selected is not a valid choice.';
+    public $multipleMessage = 'One or more of the given values is invalid.';
+    public $minMessage = 'You must select at least {{ limit }} choices.';
+    public $maxMessage = 'You must select at most {{ limit }} choices.';
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getDefaultOption()
+    {
+        return 'choices';
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/ChoiceValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/ChoiceValidator.php
new file mode 100644
index 0000000..96e2833
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/ChoiceValidator.php
@@ -0,0 +1,83 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * ChoiceValidator validates that the value is one of the expected values.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Florian Eckerstorfer <florian@eckerstorfer.org>
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+class ChoiceValidator extends ConstraintValidator
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if (!$constraint->choices && !$constraint->callback) {
+            throw new ConstraintDefinitionException('Either "choices" or "callback" must be specified on constraint Choice');
+        }
+
+        if (null === $value) {
+            return;
+        }
+
+        if ($constraint->multiple && !is_array($value)) {
+            throw new UnexpectedTypeException($value, 'array');
+        }
+
+        if ($constraint->callback) {
+            if (is_callable(array($this->context->getCurrentClass(), $constraint->callback))) {
+                $choices = call_user_func(array($this->context->getCurrentClass(), $constraint->callback));
+            } elseif (is_callable($constraint->callback)) {
+                $choices = call_user_func($constraint->callback);
+            } else {
+                throw new ConstraintDefinitionException('The Choice constraint expects a valid callback');
+            }
+        } else {
+            $choices = $constraint->choices;
+        }
+
+        if ($constraint->multiple) {
+            foreach ($value as $_value) {
+                if (!in_array($_value, $choices, $constraint->strict)) {
+                    $this->context->addViolation($constraint->multipleMessage, array('{{ value }}' => $_value));
+                }
+            }
+
+            $count = count($value);
+
+            if ($constraint->min !== null && $count < $constraint->min) {
+                $this->context->addViolation($constraint->minMessage, array('{{ limit }}' => $constraint->min), null, (int) $constraint->min);
+
+                return;
+            }
+
+            if ($constraint->max !== null && $count > $constraint->max) {
+                $this->context->addViolation($constraint->maxMessage, array('{{ limit }}' => $constraint->max), null, (int) $constraint->max);
+
+                return;
+            }
+        } elseif (!in_array($value, $choices, $constraint->strict)) {
+            $this->context->addViolation($constraint->message, array('{{ value }}' => $value));
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Collection.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Collection.php
new file mode 100644
index 0000000..b618b41
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Collection.php
@@ -0,0 +1,74 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\Constraints\Collection\Required;
+use Symfony\Component\Validator\Constraints\Collection\Optional;
+use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
+
+/**
+ * @Annotation
+ *
+ * @api
+ */
+class Collection extends Constraint
+{
+    public $fields;
+    public $allowExtraFields = false;
+    public $allowMissingFields = false;
+    public $extraFieldsMessage = 'This field was not expected.';
+    public $missingFieldsMessage = 'This field is missing.';
+
+    /**
+     * {@inheritDoc}
+     */
+    public function __construct($options = null)
+    {
+        // no known options set? $options is the fields array
+        if (is_array($options)
+            && !array_intersect(array_keys($options), array('groups', 'fields', 'allowExtraFields', 'allowMissingFields', 'extraFieldsMessage', 'missingFieldsMessage'))) {
+            $options = array('fields' => $options);
+        }
+
+        parent::__construct($options);
+
+        if (!is_array($this->fields)) {
+            throw new ConstraintDefinitionException('The option "fields" is expected to be an array in constraint ' . __CLASS__);
+        }
+
+        foreach ($this->fields as $fieldName => $field) {
+            if (!$field instanceof Optional && !$field instanceof Required) {
+                $this->fields[$fieldName] = $field = new Required($field);
+            }
+
+            if (!is_array($field->constraints)) {
+                $field->constraints = array($field->constraints);
+            }
+
+            foreach ($field->constraints as $constraint) {
+                if (!$constraint instanceof Constraint) {
+                    throw new ConstraintDefinitionException('The value ' . $constraint . ' of the field ' . $fieldName . ' is not an instance of Constraint in constraint ' . __CLASS__);
+                }
+
+                if ($constraint instanceof Valid) {
+                    throw new ConstraintDefinitionException('The constraint Valid cannot be nested inside constraint ' . __CLASS__ . '. You can only declare the Valid constraint directly on a field or method.');
+                }
+            }
+        }
+    }
+
+    public function getRequiredOptions()
+    {
+        return array('fields');
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Collection/Optional.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Collection/Optional.php
new file mode 100644
index 0000000..8d4c774
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Collection/Optional.php
@@ -0,0 +1,27 @@
+<?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\Constraints\Collection;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Annotation
+ */
+class Optional extends Constraint
+{
+    public $constraints = array();
+
+    public function getDefaultOption()
+    {
+        return 'constraints';
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Collection/Required.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Collection/Required.php
new file mode 100644
index 0000000..5dda743
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Collection/Required.php
@@ -0,0 +1,27 @@
+<?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\Constraints\Collection;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Annotation
+ */
+class Required extends Constraint
+{
+    public $constraints = array();
+
+    public function getDefaultOption()
+    {
+        return 'constraints';
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CollectionValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CollectionValidator.php
new file mode 100644
index 0000000..13551f4
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CollectionValidator.php
@@ -0,0 +1,69 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+use Symfony\Component\Validator\Constraints\Collection\Optional;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+class CollectionValidator extends ConstraintValidator
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if (null === $value) {
+            return;
+        }
+
+        if (!is_array($value) && !($value instanceof \Traversable && $value instanceof \ArrayAccess)) {
+            throw new UnexpectedTypeException($value, 'array or Traversable and ArrayAccess');
+        }
+
+        $walker = $this->context->getGraphWalker();
+        $group = $this->context->getGroup();
+        $propertyPath = $this->context->getPropertyPath();
+
+        foreach ($constraint->fields as $field => $fieldConstraint) {
+            if (
+                // bug fix issue #2779
+                (is_array($value) && array_key_exists($field, $value)) ||
+                ($value instanceof \ArrayAccess && $value->offsetExists($field))
+            ) {
+                foreach ($fieldConstraint->constraints as $constr) {
+                    $walker->walkConstraint($constr, $value[$field], $group, $propertyPath.'['.$field.']');
+                }
+            } elseif (!$fieldConstraint instanceof Optional && !$constraint->allowMissingFields) {
+                $this->context->addViolationAtSubPath('['.$field.']', $constraint->missingFieldsMessage, array(
+                    '{{ field }}' => $field
+                ), null);
+            }
+        }
+
+        if (!$constraint->allowExtraFields) {
+            foreach ($value as $field => $fieldValue) {
+                if (!isset($constraint->fields[$field])) {
+                    $this->context->addViolationAtSubPath('['.$field.']', $constraint->extraFieldsMessage, array(
+                        '{{ field }}' => $field
+                    ), $fieldValue);
+                }
+            }
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Count.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Count.php
new file mode 100644
index 0000000..db0661d
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Count.php
@@ -0,0 +1,45 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\Exception\MissingOptionsException;
+
+/**
+ * @Annotation
+ *
+ * @api
+ */
+class Count extends Constraint
+{
+    public $minMessage = 'This collection should contain {{ limit }} elements or more.';
+    public $maxMessage = 'This collection should contain {{ limit }} elements or less.';
+    public $exactMessage = 'This collection should contain exactly {{ limit }} elements.';
+    public $min;
+    public $max;
+
+    public function __construct($options = null)
+    {
+        if (null !== $options && !is_array($options)) {
+            $options = array(
+                'min' => $options,
+                'max' => $options,
+            );
+        }
+
+        parent::__construct($options);
+
+        if (null === $this->min && null === $this->max) {
+            throw new MissingOptionsException('Either option "min" or "max" must be given for constraint ' . __CLASS__, array('min', 'max'));
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CountValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CountValidator.php
new file mode 100644
index 0000000..0a3be12
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CountValidator.php
@@ -0,0 +1,63 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class CountValidator extends ConstraintValidator
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if (null === $value) {
+            return;
+        }
+
+        if (!is_array($value) && !$value instanceof \Countable) {
+            throw new UnexpectedTypeException($value, 'array or \Countable');
+        }
+
+        $count = count($value);
+
+        if ($constraint->min == $constraint->max && $count != $constraint->min) {
+            $this->context->addViolation($constraint->exactMessage, array(
+                '{{ count }}' => $count,
+                '{{ limit }}' => $constraint->min,
+            ), $value, (int) $constraint->min);
+
+            return;
+        }
+
+        if (null !== $constraint->max && $count > $constraint->max) {
+            $this->context->addViolation($constraint->maxMessage, array(
+                '{{ count }}' => $count,
+                '{{ limit }}' => $constraint->max,
+            ), $value, (int) $constraint->max);
+
+            return;
+        }
+
+        if (null !== $constraint->min && $count < $constraint->min) {
+            $this->context->addViolation($constraint->minMessage, array(
+                '{{ count }}' => $count,
+                '{{ limit }}' => $constraint->min,
+            ), $value, (int) $constraint->min);
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Country.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Country.php
new file mode 100644
index 0000000..5e81df4
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Country.php
@@ -0,0 +1,24 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Annotation
+ *
+ * @api
+ */
+class Country extends Constraint
+{
+    public $message = 'This value is not a valid country.';
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CountryValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CountryValidator.php
new file mode 100644
index 0000000..1d49954
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/CountryValidator.php
@@ -0,0 +1,46 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * Validates whether a value is a valid country code
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+class CountryValidator extends ConstraintValidator
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if (null === $value || '' === $value) {
+            return;
+        }
+
+        if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
+            throw new UnexpectedTypeException($value, 'string');
+        }
+
+        $value = (string) $value;
+
+        if (!in_array($value, \Symfony\Component\Locale\Locale::getCountries())) {
+            $this->context->addViolation($constraint->message, array('{{ value }}' => $value));
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Date.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Date.php
new file mode 100644
index 0000000..c34851e
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Date.php
@@ -0,0 +1,24 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Annotation
+ *
+ * @api
+ */
+class Date extends Constraint
+{
+    public $message = 'This value is not a valid date.';
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/DateTime.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/DateTime.php
new file mode 100644
index 0000000..a2059b0
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/DateTime.php
@@ -0,0 +1,24 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Annotation
+ *
+ * @api
+ */
+class DateTime extends Constraint
+{
+    public $message = 'This value is not a valid datetime.';
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/DateTimeValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/DateTimeValidator.php
new file mode 100644
index 0000000..49e04b9
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/DateTimeValidator.php
@@ -0,0 +1,22 @@
+<?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\Constraints;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+class DateTimeValidator extends DateValidator
+{
+    const PATTERN = '/^(\d{4})-(\d{2})-(\d{2}) (0[0-9]|1[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/';
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/DateValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/DateValidator.php
new file mode 100644
index 0000000..f891f9d
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/DateValidator.php
@@ -0,0 +1,46 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+class DateValidator extends ConstraintValidator
+{
+    const PATTERN = '/^(\d{4})-(\d{2})-(\d{2})$/';
+
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if (null === $value || '' === $value || $value instanceof \DateTime) {
+            return;
+        }
+
+        if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
+            throw new UnexpectedTypeException($value, 'string');
+        }
+
+        $value = (string) $value;
+
+        if (!preg_match(static::PATTERN, $value, $matches) || !checkdate($matches[2], $matches[3], $matches[1])) {
+            $this->context->addViolation($constraint->message, array('{{ value }}' => $value));
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Email.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Email.php
new file mode 100644
index 0000000..db250df
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Email.php
@@ -0,0 +1,26 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Annotation
+ *
+ * @api
+ */
+class Email extends Constraint
+{
+    public $message = 'This value is not a valid email address.';
+    public $checkMX = false;
+    public $checkHost = false;
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/EmailValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/EmailValidator.php
new file mode 100644
index 0000000..bfdad09
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/EmailValidator.php
@@ -0,0 +1,85 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+class EmailValidator extends ConstraintValidator
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if (null === $value || '' === $value) {
+            return;
+        }
+
+        if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
+            throw new UnexpectedTypeException($value, 'string');
+        }
+
+        $value = (string) $value;
+        $valid = filter_var($value, FILTER_VALIDATE_EMAIL);
+
+        if ($valid) {
+            $host = substr($value, strpos($value, '@') + 1);
+
+            if (version_compare(PHP_VERSION, '5.3.3', '<') && strpos($host, '.') === false) {
+                // Likely not a FQDN, bug in PHP FILTER_VALIDATE_EMAIL prior to PHP 5.3.3
+                $valid = false;
+            }
+
+            // Check for host DNS resource records
+            if ($valid && $constraint->checkMX) {
+                $valid = $this->checkMX($host);
+            } elseif ($valid && $constraint->checkHost) {
+                $valid = $this->checkHost($host);
+            }
+        }
+
+        if (!$valid) {
+            $this->context->addViolation($constraint->message, array('{{ value }}' => $value));
+        }
+    }
+
+    /**
+     * Check DNS Records for MX type.
+     *
+     * @param string $host Hostname
+     *
+     * @return Boolean
+     */
+    private function checkMX($host)
+    {
+        return checkdnsrr($host, 'MX');
+    }
+
+    /**
+     * Check if one of MX, A or AAAA DNS RR exists.
+     *
+     * @param string $host Hostname
+     *
+     * @return Boolean
+     */
+    private function checkHost($host)
+    {
+        return $this->checkMX($host) || (checkdnsrr($host, "A") || checkdnsrr($host, "AAAA"));
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/False.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/False.php
new file mode 100644
index 0000000..1a1f163
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/False.php
@@ -0,0 +1,24 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Annotation
+ *
+ * @api
+ */
+class False extends Constraint
+{
+    public $message = 'This value should be false.';
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/FalseValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/FalseValidator.php
new file mode 100644
index 0000000..7cead61
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/FalseValidator.php
@@ -0,0 +1,35 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+class FalseValidator extends ConstraintValidator
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if (null === $value || false === $value || 0 === $value || '0' === $value) {
+            return;
+        }
+
+        $this->context->addViolation($constraint->message);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/File.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/File.php
new file mode 100644
index 0000000..49880ad
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/File.php
@@ -0,0 +1,38 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Annotation
+ *
+ * @api
+ */
+class File extends Constraint
+{
+    public $maxSize = null;
+    public $mimeTypes = array();
+    public $notFoundMessage = 'The file could not be found.';
+    public $notReadableMessage = 'The file is not readable.';
+    public $maxSizeMessage = 'The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.';
+    public $mimeTypesMessage = 'The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.';
+
+    public $uploadIniSizeErrorMessage   = 'The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.';
+    public $uploadFormSizeErrorMessage  = 'The file is too large.';
+    public $uploadPartialErrorMessage   = 'The file was only partially uploaded.';
+    public $uploadNoFileErrorMessage    = 'No file was uploaded.';
+    public $uploadNoTmpDirErrorMessage  = 'No temporary folder was configured in php.ini.';
+    public $uploadCantWriteErrorMessage = 'Cannot write temporary file to disk.';
+    public $uploadExtensionErrorMessage = 'A PHP extension caused the upload to fail.';
+    public $uploadErrorMessage          = 'The file could not be uploaded.';
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/FileValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/FileValidator.php
new file mode 100644
index 0000000..7d68882
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/FileValidator.php
@@ -0,0 +1,158 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+use Symfony\Component\HttpFoundation\File\File as FileObject;
+use Symfony\Component\HttpFoundation\File\UploadedFile;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+class FileValidator extends ConstraintValidator
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if (null === $value || '' === $value) {
+            return;
+        }
+
+        if ($value instanceof UploadedFile && !$value->isValid()) {
+            switch ($value->getError()) {
+                case UPLOAD_ERR_INI_SIZE:
+                    $maxSize = UploadedFile::getMaxFilesize();
+                    $maxSize = $constraint->maxSize ? min($maxSize, $constraint->maxSize) : $maxSize;
+                    $this->context->addViolation($constraint->uploadIniSizeErrorMessage, array(
+                        '{{ limit }}' => $maxSize,
+                        '{{ suffix }}' => 'bytes',
+                    ));
+
+                    return;
+                case UPLOAD_ERR_FORM_SIZE:
+                    $this->context->addViolation($constraint->uploadFormSizeErrorMessage);
+
+                    return;
+                case UPLOAD_ERR_PARTIAL:
+                    $this->context->addViolation($constraint->uploadPartialErrorMessage);
+
+                    return;
+                case UPLOAD_ERR_NO_FILE:
+                    $this->context->addViolation($constraint->uploadNoFileErrorMessage);
+
+                    return;
+                case UPLOAD_ERR_NO_TMP_DIR:
+                    $this->context->addViolation($constraint->uploadNoTmpDirErrorMessage);
+
+                    return;
+                case UPLOAD_ERR_CANT_WRITE:
+                    $this->context->addViolation($constraint->uploadCantWriteErrorMessage);
+
+                    return;
+                case UPLOAD_ERR_EXTENSION:
+                    $this->context->addViolation($constraint->uploadExtensionErrorMessage);
+
+                    return;
+                default:
+                    $this->context->addViolation($constraint->uploadErrorMessage);
+
+                    return;
+            }
+        }
+
+        if (!is_scalar($value) && !$value instanceof FileObject && !(is_object($value) && method_exists($value, '__toString'))) {
+            throw new UnexpectedTypeException($value, 'string');
+        }
+
+        $path = $value instanceof FileObject ? $value->getPathname() : (string) $value;
+
+        if (!is_file($path)) {
+            $this->context->addViolation($constraint->notFoundMessage, array('{{ file }}' => $path));
+
+            return;
+        }
+
+        if (!is_readable($path)) {
+            $this->context->addViolation($constraint->notReadableMessage, array('{{ file }}' => $path));
+
+            return;
+        }
+
+        if ($constraint->maxSize) {
+            if (ctype_digit((string) $constraint->maxSize)) {
+                $size = filesize($path);
+                $limit = $constraint->maxSize;
+                $suffix = 'bytes';
+            } elseif (preg_match('/^(\d+)k$/', $constraint->maxSize, $matches)) {
+                $size = round(filesize($path) / 1000, 2);
+                $limit = $matches[1];
+                $suffix = 'kB';
+            } elseif (preg_match('/^(\d+)M$/', $constraint->maxSize, $matches)) {
+                $size = round(filesize($path) / 1000000, 2);
+                $limit = $matches[1];
+                $suffix = 'MB';
+            } else {
+                throw new ConstraintDefinitionException(sprintf('"%s" is not a valid maximum size', $constraint->maxSize));
+            }
+
+            if ($size > $limit) {
+                $this->context->addViolation($constraint->maxSizeMessage, array(
+                    '{{ size }}'    => $size,
+                    '{{ limit }}'   => $limit,
+                    '{{ suffix }}'  => $suffix,
+                    '{{ file }}'    => $path,
+                ));
+
+                return;
+            }
+        }
+
+        if ($constraint->mimeTypes) {
+            if (!$value instanceof FileObject) {
+                $value = new FileObject($value);
+            }
+
+            $mimeTypes = (array) $constraint->mimeTypes;
+            $mime = $value->getMimeType();
+            $valid = false;
+
+            foreach ($mimeTypes as $mimeType) {
+                if ($mimeType === $mime) {
+                    $valid = true;
+                    break;
+                }
+
+                if ($discrete = strstr($mimeType, '/*', true)) {
+                    if (strstr($mime, '/', true) === $discrete) {
+                        $valid = true;
+                        break;
+                    }
+                }
+            }
+
+            if (false === $valid) {
+                $this->context->addViolation($constraint->mimeTypesMessage, array(
+                    '{{ type }}'    => '"'.$mime.'"',
+                    '{{ types }}'   => '"'.implode('", "', $mimeTypes) .'"',
+                    '{{ file }}'    => $path,
+                ));
+            }
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GroupSequence.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GroupSequence.php
new file mode 100644
index 0000000..c19f5f8
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GroupSequence.php
@@ -0,0 +1,34 @@
+<?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\Constraints;
+
+/**
+ * Annotation for group sequences
+ *
+ * @Annotation
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+class GroupSequence
+{
+    /**
+     * The members of the sequence
+     * @var array
+     */
+    public $groups;
+
+    public function __construct(array $groups)
+    {
+        $this->groups = $groups['value'];
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GroupSequenceProvider.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GroupSequenceProvider.php
new file mode 100644
index 0000000..4571559
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/GroupSequenceProvider.php
@@ -0,0 +1,22 @@
+<?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\Constraints;
+
+/**
+ * Annotation to define a group sequence provider
+ *
+ * @Annotation
+ */
+class GroupSequenceProvider
+{
+
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Image.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Image.php
new file mode 100644
index 0000000..a231064
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Image.php
@@ -0,0 +1,33 @@
+<?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\Constraints;
+
+/**
+ * @Annotation
+ *
+ * @api
+ */
+class Image extends File
+{
+    public $mimeTypes = 'image/*';
+    public $minWidth = null;
+    public $maxWidth = null;
+    public $maxHeight = null;
+    public $minHeight = null;
+
+    public $mimeTypesMessage = 'This file is not a valid image.';
+    public $sizeNotDetectedMessage = 'The size of the image could not be detected.';
+    public $maxWidthMessage = 'The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.';
+    public $minWidthMessage = 'The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.';
+    public $maxHeightMessage = 'The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.';
+    public $minHeightMessage = 'The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.';
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/ImageValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/ImageValidator.php
new file mode 100644
index 0000000..79e6bdc
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/ImageValidator.php
@@ -0,0 +1,113 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
+
+/**
+ * Validates whether a value is a valid image file and is valid
+ * against minWidth, maxWidth, minHeight and maxHeight constraints
+ *
+ * @author Benjamin Dulau <benjamin.dulau@gmail.com>
+ */
+class ImageValidator extends FileValidator
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        $violations = count($this->context->getViolations());
+
+        parent::validate($value, $constraint);
+
+        $failed = count($this->context->getViolations()) !== $violations;
+
+        if ($failed || null === $value || '' === $value) {
+            return;
+        }
+
+        if (null === $constraint->minWidth && null === $constraint->maxWidth
+            && null === $constraint->minHeight && null === $constraint->maxHeight) {
+            return;
+        }
+
+        $size = @getimagesize($value);
+        if (empty($size) || ($size[0] === 0) || ($size[1] === 0)) {
+            $this->context->addViolation($constraint->sizeNotDetectedMessage);
+
+            return;
+        }
+
+        $width  = $size[0];
+        $height = $size[1];
+
+        if ($constraint->minWidth) {
+            if (!ctype_digit((string) $constraint->minWidth)) {
+                throw new ConstraintDefinitionException(sprintf('"%s" is not a valid minimum width', $constraint->minWidth));
+            }
+
+            if ($width < $constraint->minWidth) {
+                $this->context->addViolation($constraint->minWidthMessage, array(
+                    '{{ width }}'    => $width,
+                    '{{ min_width }}' => $constraint->minWidth
+                ));
+
+                return;
+            }
+        }
+
+        if ($constraint->maxWidth) {
+            if (!ctype_digit((string) $constraint->maxWidth)) {
+                throw new ConstraintDefinitionException(sprintf('"%s" is not a valid maximum width', $constraint->maxWidth));
+            }
+
+            if ($width > $constraint->maxWidth) {
+                $this->context->addViolation($constraint->maxWidthMessage, array(
+                    '{{ width }}'    => $width,
+                    '{{ max_width }}' => $constraint->maxWidth
+                ));
+
+                return;
+            }
+        }
+
+        if ($constraint->minHeight) {
+            if (!ctype_digit((string) $constraint->minHeight)) {
+                throw new ConstraintDefinitionException(sprintf('"%s" is not a valid minimum height', $constraint->minHeight));
+            }
+
+            if ($height < $constraint->minHeight) {
+                $this->context->addViolation($constraint->minHeightMessage, array(
+                    '{{ height }}'    => $height,
+                    '{{ min_height }}' => $constraint->minHeight
+                ));
+
+                return;
+            }
+        }
+
+        if ($constraint->maxHeight) {
+            if (!ctype_digit((string) $constraint->maxHeight)) {
+                throw new ConstraintDefinitionException(sprintf('"%s" is not a valid maximum height', $constraint->maxHeight));
+            }
+
+            if ($height > $constraint->maxHeight) {
+                $this->context->addViolation($constraint->maxHeightMessage, array(
+                    '{{ height }}'    => $height,
+                    '{{ max_height }}' => $constraint->maxHeight
+                ));
+            }
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Ip.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Ip.php
new file mode 100644
index 0000000..1698d11
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Ip.php
@@ -0,0 +1,80 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * Validates that a value is a valid IP address
+ *
+ * @Annotation
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ * @author Joseph Bielawski <stloyd@gmail.com>
+ *
+ * @api
+ */
+class Ip extends Constraint
+{
+    const V4 = '4';
+    const V6 = '6';
+    const ALL = 'all';
+
+    // adds FILTER_FLAG_NO_PRIV_RANGE flag (skip private ranges)
+    const V4_NO_PRIV = '4_no_priv';
+    const V6_NO_PRIV = '6_no_priv';
+    const ALL_NO_PRIV = 'all_no_priv';
+
+    // adds FILTER_FLAG_NO_RES_RANGE flag (skip reserved ranges)
+    const V4_NO_RES = '4_no_res';
+    const V6_NO_RES = '6_no_res';
+    const ALL_NO_RES = 'all_no_res';
+
+    // adds FILTER_FLAG_NO_PRIV_RANGE and FILTER_FLAG_NO_RES_RANGE flags (skip both)
+    const V4_ONLY_PUBLIC = '4_public';
+    const V6_ONLY_PUBLIC = '6_public';
+    const ALL_ONLY_PUBLIC = 'all_public';
+
+    protected static $versions = array(
+        self::V4,
+        self::V6,
+        self::ALL,
+
+        self::V4_NO_PRIV,
+        self::V6_NO_PRIV,
+        self::ALL_NO_PRIV,
+
+        self::V4_NO_RES,
+        self::V6_NO_RES,
+        self::ALL_NO_RES,
+
+        self::V4_ONLY_PUBLIC,
+        self::V6_ONLY_PUBLIC,
+        self::ALL_ONLY_PUBLIC,
+    );
+
+    public $version = self::V4;
+
+    public $message = 'This is not a valid IP address.';
+
+    /**
+     * {@inheritDoc}
+     */
+    public function __construct($options = null)
+    {
+        parent::__construct($options);
+
+        if (!in_array($this->version, self::$versions)) {
+            throw new ConstraintDefinitionException(sprintf('The option "version" must be one of "%s"', implode('", "', self::$versions)));
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/IpValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/IpValidator.php
new file mode 100644
index 0000000..3358ec2
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/IpValidator.php
@@ -0,0 +1,97 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * Validates whether a value is a valid IP address
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ * @author Joseph Bielawski <stloyd@gmail.com>
+ *
+ * @api
+ */
+class IpValidator extends ConstraintValidator
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if (null === $value || '' === $value) {
+            return;
+        }
+
+        if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
+            throw new UnexpectedTypeException($value, 'string');
+        }
+
+        $value = (string) $value;
+
+        switch ($constraint->version) {
+            case Ip::V4:
+               $flag = FILTER_FLAG_IPV4;
+               break;
+
+            case Ip::V6:
+               $flag = FILTER_FLAG_IPV6;
+               break;
+
+            case Ip::V4_NO_PRIV:
+               $flag = FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE;
+               break;
+
+            case Ip::V6_NO_PRIV:
+               $flag = FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE;
+               break;
+
+            case Ip::ALL_NO_PRIV:
+               $flag = FILTER_FLAG_NO_PRIV_RANGE;
+               break;
+
+            case Ip::V4_NO_RES:
+               $flag = FILTER_FLAG_IPV4 | FILTER_FLAG_NO_RES_RANGE;
+               break;
+
+            case Ip::V6_NO_RES:
+               $flag = FILTER_FLAG_IPV6 | FILTER_FLAG_NO_RES_RANGE;
+               break;
+
+            case Ip::ALL_NO_RES:
+               $flag = FILTER_FLAG_NO_RES_RANGE;
+               break;
+
+            case Ip::V4_ONLY_PUBLIC:
+               $flag = FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE;
+               break;
+
+            case Ip::V6_ONLY_PUBLIC:
+               $flag = FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE;
+               break;
+
+            case Ip::ALL_ONLY_PUBLIC:
+               $flag = FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE;
+               break;
+
+            default:
+                $flag = null;
+                break;
+        }
+
+        if (!filter_var($value, FILTER_VALIDATE_IP, $flag)) {
+            $this->context->addViolation($constraint->message, array('{{ value }}' => $value));
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Language.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Language.php
new file mode 100644
index 0000000..a0a099b
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Language.php
@@ -0,0 +1,24 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Annotation
+ *
+ * @api
+ */
+class Language extends Constraint
+{
+    public $message = 'This value is not a valid language.';
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LanguageValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LanguageValidator.php
new file mode 100644
index 0000000..5aed18a
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LanguageValidator.php
@@ -0,0 +1,46 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * Validates whether a value is a valid language code
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+class LanguageValidator extends ConstraintValidator
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if (null === $value || '' === $value) {
+            return;
+        }
+
+        if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
+            throw new UnexpectedTypeException($value, 'string');
+        }
+
+        $value = (string) $value;
+
+        if (!in_array($value, \Symfony\Component\Locale\Locale::getLanguages())) {
+            $this->context->addViolation($constraint->message, array('{{ value }}' => $value));
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Length.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Length.php
new file mode 100644
index 0000000..70554c0
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Length.php
@@ -0,0 +1,46 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\Exception\MissingOptionsException;
+
+/**
+ * @Annotation
+ *
+ * @api
+ */
+class Length extends Constraint
+{
+    public $maxMessage = 'This value is too long. It should have {{ limit }} characters or less.';
+    public $minMessage = 'This value is too short. It should have {{ limit }} characters or more.';
+    public $exactMessage = 'This value should have exactly {{ limit }} characters.';
+    public $max;
+    public $min;
+    public $charset = 'UTF-8';
+
+    public function __construct($options = null)
+    {
+        if (null !== $options && !is_array($options)) {
+            $options = array(
+                'min' => $options,
+                'max' => $options,
+            );
+        }
+
+        parent::__construct($options);
+
+        if (null === $this->min && null === $this->max) {
+            throw new MissingOptionsException('Either option "min" or "max" must be given for constraint ' . __CLASS__, array('min', 'max'));
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LengthValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LengthValidator.php
new file mode 100644
index 0000000..8090a2c
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LengthValidator.php
@@ -0,0 +1,71 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class LengthValidator extends ConstraintValidator
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if (null === $value || '' === $value) {
+            return;
+        }
+
+        if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
+            throw new UnexpectedTypeException($value, 'string');
+        }
+
+        $stringValue = (string) $value;
+
+        if (function_exists('grapheme_strlen') && 'UTF-8' === $constraint->charset) {
+            $length = grapheme_strlen($stringValue);
+        } elseif (function_exists('mb_strlen')) {
+            $length = mb_strlen($stringValue, $constraint->charset);
+        } else {
+            $length = strlen($stringValue);
+        }
+
+        if ($constraint->min == $constraint->max && $length != $constraint->min) {
+            $this->context->addViolation($constraint->exactMessage, array(
+                '{{ value }}' => $stringValue,
+                '{{ limit }}' => $constraint->min,
+            ), $value, (int) $constraint->min);
+
+            return;
+        }
+
+        if (null !== $constraint->max && $length > $constraint->max) {
+            $this->context->addViolation($constraint->maxMessage, array(
+                '{{ value }}' => $stringValue,
+                '{{ limit }}' => $constraint->max,
+            ), $value, (int) $constraint->max);
+
+            return;
+        }
+
+        if (null !== $constraint->min && $length < $constraint->min) {
+            $this->context->addViolation($constraint->minMessage, array(
+                '{{ value }}' => $stringValue,
+                '{{ limit }}' => $constraint->min,
+            ), $value, (int) $constraint->min);
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Locale.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Locale.php
new file mode 100644
index 0000000..9a9025e
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Locale.php
@@ -0,0 +1,24 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Annotation
+ *
+ * @api
+ */
+class Locale extends Constraint
+{
+    public $message = 'This value is not a valid locale.';
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LocaleValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LocaleValidator.php
new file mode 100644
index 0000000..5cacdb4
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LocaleValidator.php
@@ -0,0 +1,46 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * Validates whether a value is a valid locale code
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+class LocaleValidator extends ConstraintValidator
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if (null === $value || '' === $value) {
+            return;
+        }
+
+        if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
+            throw new UnexpectedTypeException($value, 'string');
+        }
+
+        $value = (string) $value;
+
+        if (!in_array($value, \Symfony\Component\Locale\Locale::getLocales())) {
+            $this->context->addViolation($constraint->message, array('{{ value }}' => $value));
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Luhn.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Luhn.php
new file mode 100644
index 0000000..f376045
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Luhn.php
@@ -0,0 +1,24 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * Metadata for the LuhnValidator.
+ *
+ * @Annotation
+ */
+class Luhn extends Constraint
+{
+    public $message = 'Invalid card number';
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LuhnValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LuhnValidator.php
new file mode 100644
index 0000000..1ae8b39
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/LuhnValidator.php
@@ -0,0 +1,58 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+
+/**
+ * Validates a PAN using the LUHN Algorithm
+ *
+ * For a list of example card numbers that are used to test this
+ * class, please see the LuhnValidatorTest class.
+ *
+ * @see    http://en.wikipedia.org/wiki/Luhn_algorithm
+ * @author Tim Nagel <t.nagel@infinite.net.au>
+ * @author Greg Knapp http://gregk.me/2011/php-implementation-of-bank-card-luhn-algorithm/
+ */
+class LuhnValidator extends ConstraintValidator
+{
+    /**
+     * Validates a creditcard number with the Luhn algorithm.
+     *
+     * @param mixed      $value
+     * @param Constraint $constraint
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if (null === $value || '' === $value) {
+            return;
+        }
+
+        if (!is_numeric($value)) {
+            $this->context->addViolation($constraint->message);
+
+            return;
+        }
+
+        $length = strlen($value);
+        $oddLength = $length % 2;
+        for ($sum = 0, $i = $length - 1; $i >= 0; $i--) {
+            $digit = (int) $value[$i];
+            $sum += (($i % 2) === $oddLength) ? array_sum(str_split($digit * 2)) : $digit;
+        }
+
+        if (($sum % 10) !== 0) {
+            $this->context->addViolation($constraint->message);
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Max.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Max.php
new file mode 100644
index 0000000..814fc1f
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Max.php
@@ -0,0 +1,44 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Annotation
+ *
+ * @api
+ *
+ * @deprecated Deprecated since version 2.1, to be removed in 2.3.
+ */
+class Max extends Constraint
+{
+    public $message = 'This value should be {{ limit }} or less.';
+    public $invalidMessage = 'This value should be a valid number.';
+    public $limit;
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getDefaultOption()
+    {
+        return 'limit';
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getRequiredOptions()
+    {
+        return array('limit');
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/MaxLength.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/MaxLength.php
new file mode 100644
index 0000000..765d548
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/MaxLength.php
@@ -0,0 +1,44 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Annotation
+ *
+ * @api
+ *
+ * @deprecated Deprecated since version 2.1, to be removed in 2.3.
+ */
+class MaxLength extends Constraint
+{
+    public $message = 'This value is too long. It should have {{ limit }} characters or less.';
+    public $limit;
+    public $charset = 'UTF-8';
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getDefaultOption()
+    {
+        return 'limit';
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getRequiredOptions()
+    {
+        return array('limit');
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/MaxLengthValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/MaxLengthValidator.php
new file mode 100644
index 0000000..9b9e9b9
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/MaxLengthValidator.php
@@ -0,0 +1,57 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ *
+ * @deprecated Deprecated since version 2.1, to be removed in 2.3.
+ */
+class MaxLengthValidator extends ConstraintValidator
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if (null === $value || '' === $value) {
+            return;
+        }
+
+        if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
+            throw new UnexpectedTypeException($value, 'string');
+        }
+
+        $stringValue = (string) $value;
+
+        if (function_exists('grapheme_strlen') && 'UTF-8' === $constraint->charset) {
+            $length = grapheme_strlen($stringValue);
+        } elseif (function_exists('mb_strlen')) {
+            $length = mb_strlen($stringValue, $constraint->charset);
+        } else {
+            $length = strlen($stringValue);
+        }
+
+        if ($length > $constraint->limit) {
+            $this->context->addViolation($constraint->message, array(
+                '{{ value }}' => $stringValue,
+                '{{ limit }}' => $constraint->limit,
+            ), $value, (int) $constraint->limit);
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/MaxValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/MaxValidator.php
new file mode 100644
index 0000000..2019d69
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/MaxValidator.php
@@ -0,0 +1,51 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ *
+ * @deprecated Deprecated since version 2.1, to be removed in 2.3.
+ */
+class MaxValidator extends ConstraintValidator
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if (null === $value || '' === $value) {
+            return;
+        }
+
+        if (!is_numeric($value)) {
+            $this->context->addViolation($constraint->invalidMessage, array(
+                '{{ value }}' => $value,
+                '{{ limit }}' => $constraint->limit,
+            ));
+
+            return;
+        }
+
+        if ($value > $constraint->limit) {
+            $this->context->addViolation($constraint->message, array(
+                '{{ value }}' => $value,
+                '{{ limit }}' => $constraint->limit,
+            ));
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Min.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Min.php
new file mode 100644
index 0000000..6e8b364
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Min.php
@@ -0,0 +1,44 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Annotation
+ *
+ * @api
+ *
+ * @deprecated Deprecated since version 2.1, to be removed in 2.3.
+ */
+class Min extends Constraint
+{
+    public $message = 'This value should be {{ limit }} or more.';
+    public $invalidMessage = 'This value should be a valid number.';
+    public $limit;
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getDefaultOption()
+    {
+        return 'limit';
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getRequiredOptions()
+    {
+        return array('limit');
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/MinLength.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/MinLength.php
new file mode 100644
index 0000000..4457f6c
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/MinLength.php
@@ -0,0 +1,44 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Annotation
+ *
+ * @api
+ *
+ * @deprecated Deprecated since version 2.1, to be removed in 2.3.
+ */
+class MinLength extends Constraint
+{
+    public $message = 'This value is too short. It should have {{ limit }} characters or more.';
+    public $limit;
+    public $charset = 'UTF-8';
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getDefaultOption()
+    {
+        return 'limit';
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getRequiredOptions()
+    {
+        return array('limit');
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/MinLengthValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/MinLengthValidator.php
new file mode 100644
index 0000000..80fcac4
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/MinLengthValidator.php
@@ -0,0 +1,57 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ *
+ * @deprecated Deprecated since version 2.1, to be removed in 2.3.
+ */
+class MinLengthValidator extends ConstraintValidator
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if (null === $value || '' === $value) {
+            return;
+        }
+
+        if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
+            throw new UnexpectedTypeException($value, 'string');
+        }
+
+        $stringValue = (string) $value;
+
+        if (function_exists('grapheme_strlen') && 'UTF-8' === $constraint->charset) {
+            $length = grapheme_strlen($stringValue);
+        } elseif (function_exists('mb_strlen')) {
+            $length = mb_strlen($stringValue, $constraint->charset);
+        } else {
+            $length = strlen($stringValue);
+        }
+
+        if ($length < $constraint->limit) {
+            $this->context->addViolation($constraint->message, array(
+                '{{ value }}' => $stringValue,
+                '{{ limit }}' => $constraint->limit,
+            ), $value, (int) $constraint->limit);
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/MinValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/MinValidator.php
new file mode 100644
index 0000000..c907793
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/MinValidator.php
@@ -0,0 +1,56 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ *
+ * @deprecated Deprecated since version 2.1, to be removed in 2.3.
+ */
+class MinValidator extends ConstraintValidator
+{
+    /**
+     * Checks if the passed value is valid.
+     *
+     * @param mixed      $value      The value that should be validated
+     * @param Constraint $constraint The constraint for the validation
+     *
+     * @api
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if (null === $value || '' === $value) {
+            return;
+        }
+
+        if (!is_numeric($value)) {
+            $this->context->addViolation($constraint->invalidMessage, array(
+                '{{ value }}' => $value,
+                '{{ limit }}' => $constraint->limit,
+            ));
+
+            return;
+        }
+
+        if ($value < $constraint->limit) {
+            $this->context->addViolation($constraint->message, array(
+                '{{ value }}' => $value,
+                '{{ limit }}' => $constraint->limit,
+            ));
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotBlank.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotBlank.php
new file mode 100644
index 0000000..c3281ad
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotBlank.php
@@ -0,0 +1,24 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Annotation
+ *
+ * @api
+ */
+class NotBlank extends Constraint
+{
+    public $message = 'This value should not be blank.';
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotBlankValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotBlankValidator.php
new file mode 100644
index 0000000..dd3dbdd
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotBlankValidator.php
@@ -0,0 +1,33 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+class NotBlankValidator extends ConstraintValidator
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if (false === $value || (empty($value) && '0' != $value)) {
+            $this->context->addViolation($constraint->message);
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotNull.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotNull.php
new file mode 100644
index 0000000..2608ab3
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotNull.php
@@ -0,0 +1,24 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Annotation
+ *
+ * @api
+ */
+class NotNull extends Constraint
+{
+    public $message = 'This value should not be null.';
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotNullValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotNullValidator.php
new file mode 100644
index 0000000..4ee6592
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NotNullValidator.php
@@ -0,0 +1,33 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+class NotNullValidator extends ConstraintValidator
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if (null === $value) {
+            $this->context->addViolation($constraint->message);
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Null.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Null.php
new file mode 100644
index 0000000..e110bf8
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Null.php
@@ -0,0 +1,24 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Annotation
+ *
+ * @api
+ */
+class Null extends Constraint
+{
+    public $message = 'This value should be null.';
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NullValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NullValidator.php
new file mode 100644
index 0000000..e8fa24e
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/NullValidator.php
@@ -0,0 +1,33 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+class NullValidator extends ConstraintValidator
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if (null !== $value) {
+            $this->context->addViolation($constraint->message, array('{{ value }}' => $value));
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Range.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Range.php
new file mode 100644
index 0000000..a94825e
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Range.php
@@ -0,0 +1,38 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\Exception\MissingOptionsException;
+
+/**
+ * @Annotation
+ *
+ * @api
+ */
+class Range extends Constraint
+{
+    public $minMessage = 'This value should be {{ limit }} or more.';
+    public $maxMessage = 'This value should be {{ limit }} or less.';
+    public $invalidMessage = 'This value should be a valid number.';
+    public $min;
+    public $max;
+
+    public function __construct($options = null)
+    {
+        parent::__construct($options);
+
+        if (null === $this->min && null === $this->max) {
+            throw new MissingOptionsException('Either option "min" or "max" must be given for constraint ' . __CLASS__, array('min', 'max'));
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/RangeValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/RangeValidator.php
new file mode 100644
index 0000000..1a8ba15
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/RangeValidator.php
@@ -0,0 +1,55 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class RangeValidator extends ConstraintValidator
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if (null === $value) {
+            return;
+        }
+
+        if (!is_numeric($value)) {
+            $this->context->addViolation($constraint->invalidMessage, array(
+                '{{ value }}' => $value,
+            ));
+
+            return;
+        }
+
+        if (null !== $constraint->max && $value > $constraint->max) {
+            $this->context->addViolation($constraint->maxMessage, array(
+                '{{ value }}' => $value,
+                '{{ limit }}' => $constraint->max,
+            ));
+
+            return;
+        }
+
+        if (null !== $constraint->min && $value < $constraint->min) {
+            $this->context->addViolation($constraint->minMessage, array(
+                '{{ value }}' => $value,
+                '{{ limit }}' => $constraint->min,
+            ));
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Regex.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Regex.php
new file mode 100644
index 0000000..f26186c
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Regex.php
@@ -0,0 +1,96 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Annotation
+ *
+ * @api
+ */
+class Regex extends Constraint
+{
+    public $message = 'This value is not valid.';
+    public $pattern;
+    public $htmlPattern = null;
+    public $match = true;
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getDefaultOption()
+    {
+        return 'pattern';
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getRequiredOptions()
+    {
+        return array('pattern');
+    }
+
+    /**
+     * Returns htmlPattern if exists or pattern is convertible.
+     *
+     * @return string|null
+     */
+    public function getHtmlPattern()
+    {
+        // If htmlPattern is specified, use it
+        if (null !== $this->htmlPattern) {
+            return empty($this->htmlPattern)
+                ? null
+                : $this->htmlPattern;
+        }
+
+        return $this->getNonDelimitedPattern();
+    }
+
+    /**
+     * Convert the htmlPattern to a suitable format for HTML5 pattern.
+     * Example: /^[a-z]+$/ would be converted to [a-z]+
+     * However, if options are specified, it cannot be converted
+     * 
+     * Pattern is also ignored if match=false since the pattern should
+     * then be reversed before application.
+     *
+     * @todo reverse pattern in case match=false as per issue #5307
+     *
+     * @link http://dev.w3.org/html5/spec/single-page.html#the-pattern-attribute
+     *
+     * @return string|null
+     */
+    private function getNonDelimitedPattern()
+    {
+        // If match = false, pattern should not be added to HTML5 validation
+        if (!$this->match) {
+            return null;
+        }
+        
+        if (preg_match('/^(.)(\^?)(.*?)(\$?)\1$/', $this->pattern, $matches)) {
+            $delimiter = $matches[1];
+            $start     = empty($matches[2]) ? '.*' : '';
+            $pattern   = $matches[3];
+            $end       = empty($matches[4]) ? '.*' : '';
+
+            // Unescape the delimiter in pattern
+            $pattern = str_replace('\\' . $delimiter, $delimiter, $pattern);
+
+            return $start . $pattern . $end;
+        }
+
+        return null;
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/RegexValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/RegexValidator.php
new file mode 100644
index 0000000..c39869d
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/RegexValidator.php
@@ -0,0 +1,47 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * Validates whether a value match or not given regexp pattern
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ * @author Joseph Bielawski <stloyd@gmail.com>
+ *
+ * @api
+ */
+class RegexValidator extends ConstraintValidator
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if (null === $value || '' === $value) {
+            return;
+        }
+
+        if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
+            throw new UnexpectedTypeException($value, 'string');
+        }
+
+        $value = (string) $value;
+
+        if ($constraint->match xor preg_match($constraint->pattern, $value)) {
+            $this->context->addViolation($constraint->message, array('{{ value }}' => $value));
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Time.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Time.php
new file mode 100644
index 0000000..3ff8a50
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Time.php
@@ -0,0 +1,24 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Annotation
+ *
+ * @api
+ */
+class Time extends Constraint
+{
+    public $message = 'This value is not a valid time.';
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/TimeValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/TimeValidator.php
new file mode 100644
index 0000000..31259cc
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/TimeValidator.php
@@ -0,0 +1,46 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+class TimeValidator extends ConstraintValidator
+{
+    const PATTERN = '/^(0[0-9]|1[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/';
+
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if (null === $value || '' === $value || $value instanceof \DateTime) {
+            return;
+        }
+
+        if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
+            throw new UnexpectedTypeException($value, 'string');
+        }
+
+        $value = (string) $value;
+
+        if (!preg_match(static::PATTERN, $value)) {
+            $this->context->addViolation($constraint->message, array('{{ value }}' => $value));
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/True.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/True.php
new file mode 100644
index 0000000..a5bfc85
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/True.php
@@ -0,0 +1,24 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Annotation
+ *
+ * @api
+ */
+class True extends Constraint
+{
+    public $message = 'This value should be true.';
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/TrueValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/TrueValidator.php
new file mode 100644
index 0000000..2fbe047
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/TrueValidator.php
@@ -0,0 +1,37 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+class TrueValidator extends ConstraintValidator
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if (null === $value) {
+            return;
+        }
+
+        if (true !== $value && 1 !== $value && '1' !== $value) {
+            $this->context->addViolation($constraint->message);
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Type.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Type.php
new file mode 100644
index 0000000..11dec3c
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Type.php
@@ -0,0 +1,41 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Annotation
+ *
+ * @api
+ */
+class Type extends Constraint
+{
+    public $message = 'This value should be of type {{ type }}.';
+    public $type;
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getDefaultOption()
+    {
+        return 'type';
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getRequiredOptions()
+    {
+        return array('type');
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/TypeValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/TypeValidator.php
new file mode 100644
index 0000000..ecc88df
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/TypeValidator.php
@@ -0,0 +1,51 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+class TypeValidator extends ConstraintValidator
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if (null === $value) {
+            return;
+        }
+
+        $type = strtolower($constraint->type);
+        $type = $type == 'boolean' ? 'bool' : $constraint->type;
+        $isFunction = 'is_'.$type;
+        $ctypeFunction = 'ctype_'.$type;
+
+        if (function_exists($isFunction) && call_user_func($isFunction, $value)) {
+            return;
+        } elseif (function_exists($ctypeFunction) && call_user_func($ctypeFunction, $value)) {
+            return;
+        } elseif ($value instanceof $constraint->type) {
+            return;
+        }
+
+        $this->context->addViolation($constraint->message, array(
+            '{{ value }}' => is_object($value) ? get_class($value) : (is_array($value) ? 'Array' : (string) $value),
+            '{{ type }}'  => $constraint->type,
+        ));
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Url.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Url.php
new file mode 100644
index 0000000..4b4e96c
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Url.php
@@ -0,0 +1,25 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Annotation
+ *
+ * @api
+ */
+class Url extends Constraint
+{
+    public $message = 'This value is not a valid URL.';
+    public $protocols = array('http', 'https');
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/UrlValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/UrlValidator.php
new file mode 100644
index 0000000..1fc380e
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/UrlValidator.php
@@ -0,0 +1,61 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+class UrlValidator extends ConstraintValidator
+{
+    const PATTERN = '~^
+            (%s)://                                 # protocol
+            (
+                ([\pL\pN\pS-]+\.)+[\pL]+                   # a domain name
+                    |                                     #  or
+                \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}      # a IP address
+                    |                                     #  or
+                \[
+                    (?:(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){6})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:::(?:(?:(?:[0-9a-f]{1,4})):){5})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){4})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,1}(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){3})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,2}(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){2})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,3}(?:(?:[0-9a-f]{1,4})))?::(?:(?:[0-9a-f]{1,4})):)(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,4}(?:(?:[0-9a-f]{1,4})))?::)(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,5}(?:(?:[0-9a-f]{1,4})))?::)(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,6}(?:(?:[0-9a-f]{1,4})))?::))))
+                \]  # a IPv6 address
+            )
+            (:[0-9]+)?                              # a port (optional)
+            (/?|/\S+)                               # a /, nothing or a / with something
+        $~ixu';
+
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($value, Constraint $constraint)
+    {
+        if (null === $value || '' === $value) {
+            return;
+        }
+
+        if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
+            throw new UnexpectedTypeException($value, 'string');
+        }
+
+        $value = (string) $value;
+
+        $pattern = sprintf(static::PATTERN, implode('|', $constraint->protocols));
+
+        if (!preg_match($pattern, $value)) {
+            $this->context->addViolation($constraint->message, array('{{ value }}' => $value));
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Valid.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Valid.php
new file mode 100644
index 0000000..42b413e
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Constraints/Valid.php
@@ -0,0 +1,36 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
+
+/**
+ * @Annotation
+ *
+ * @api
+ */
+class Valid extends Constraint
+{
+    public $traverse = true;
+
+    public $deep = false;
+
+    public function __construct($options = null)
+    {
+        if (is_array($options) && array_key_exists('groups', $options)) {
+            throw new ConstraintDefinitionException('The option "groups" is not supported by the constraint ' . __CLASS__);
+        }
+
+        parent::__construct($options);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Exception/ConstraintDefinitionException.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Exception/ConstraintDefinitionException.php
new file mode 100644
index 0000000..b24fdd6
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Exception/ConstraintDefinitionException.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\Exception;
+
+class ConstraintDefinitionException extends ValidatorException
+{
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Exception/GroupDefinitionException.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Exception/GroupDefinitionException.php
new file mode 100644
index 0000000..ab7e91d
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Exception/GroupDefinitionException.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\Exception;
+
+class GroupDefinitionException extends ValidatorException
+{
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Exception/InvalidOptionsException.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Exception/InvalidOptionsException.php
new file mode 100644
index 0000000..ce87c42
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Exception/InvalidOptionsException.php
@@ -0,0 +1,29 @@
+<?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\Exception;
+
+class InvalidOptionsException extends ValidatorException
+{
+    private $options;
+
+    public function __construct($message, array $options)
+    {
+        parent::__construct($message);
+
+        $this->options = $options;
+    }
+
+    public function getOptions()
+    {
+        return $this->options;
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Exception/MappingException.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Exception/MappingException.php
new file mode 100644
index 0000000..4c8c057
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Exception/MappingException.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\Exception;
+
+class MappingException extends ValidatorException
+{
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Exception/MissingOptionsException.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Exception/MissingOptionsException.php
new file mode 100644
index 0000000..07c5d9e
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Exception/MissingOptionsException.php
@@ -0,0 +1,29 @@
+<?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\Exception;
+
+class MissingOptionsException extends ValidatorException
+{
+    private $options;
+
+    public function __construct($message, array $options)
+    {
+        parent::__construct($message);
+
+        $this->options = $options;
+    }
+
+    public function getOptions()
+    {
+        return $this->options;
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Exception/NoSuchMetadataException.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Exception/NoSuchMetadataException.php
new file mode 100644
index 0000000..4cac74c
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Exception/NoSuchMetadataException.php
@@ -0,0 +1,19 @@
+<?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\Exception;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class NoSuchMetadataException extends ValidatorException
+{
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Exception/UnexpectedTypeException.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Exception/UnexpectedTypeException.php
new file mode 100644
index 0000000..573fecd
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Exception/UnexpectedTypeException.php
@@ -0,0 +1,20 @@
+<?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\Exception;
+
+class UnexpectedTypeException extends ValidatorException
+{
+    public function __construct($value, $expectedType)
+    {
+        parent::__construct(sprintf('Expected argument of type %s, %s given', $expectedType, gettype($value)));
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Exception/ValidatorException.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Exception/ValidatorException.php
new file mode 100644
index 0000000..6ee2416
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Exception/ValidatorException.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\Exception;
+
+class ValidatorException extends \RuntimeException
+{
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/ExecutionContext.php b/core/vendor/symfony/validator/Symfony/Component/Validator/ExecutionContext.php
new file mode 100644
index 0000000..e431f83
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/ExecutionContext.php
@@ -0,0 +1,375 @@
+<?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;
+
+/**
+ * Default implementation of {@link ExecutionContextInterface}.
+ *
+ * This class is immutable by design.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class ExecutionContext implements ExecutionContextInterface
+{
+    /**
+     * @var GlobalExecutionContextInterface
+     */
+    protected $globalContext;
+
+    /**
+     * @var MetadataInterface
+     */
+    private $metadata;
+
+    /**
+     * @var mixed
+     */
+    private $value;
+
+    /**
+     * @var string
+     */
+    private $group;
+
+    /**
+     * @var string
+     */
+    private $propertyPath;
+
+    /**
+     * Creates a new execution context.
+     *
+     * @param GlobalExecutionContextInterface $globalContext The global context storing node-independent state.
+     * @param MetadataInterface               $metadata      The metadata of the validated node.
+     * @param mixed                           $value         The value of the validated node.
+     * @param string                          $group         The current validation group.
+     * @param string                          $propertyPath  The property path to the current node.
+     */
+    public function __construct(GlobalExecutionContextInterface $globalContext, MetadataInterface $metadata = null, $value = null, $group = null, $propertyPath = '')
+    {
+        if (null === $group) {
+            $group = Constraint::DEFAULT_GROUP;
+        }
+
+        $this->globalContext = $globalContext;
+        $this->metadata = $metadata;
+        $this->value = $value;
+        $this->propertyPath = $propertyPath;
+        $this->group = $group;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function addViolation($message, array $params = array(), $invalidValue = null, $pluralization = null, $code = null)
+    {
+        $this->globalContext->getViolations()->add(new ConstraintViolation(
+            $message,
+            $params,
+            $this->globalContext->getRoot(),
+            $this->propertyPath,
+            // check using func_num_args() to allow passing null values
+            func_num_args() >= 3 ? $invalidValue : $this->value,
+            $pluralization,
+            $code
+        ));
+    }
+
+    /**
+     * Adds a violation at the validation graph node with the given property
+     * path.
+     *
+     * @param string       $propertyPath  The property path for the violation.
+     * @param string       $message       The error message.
+     * @param array        $params        The parameters parsed into the error message.
+     * @param mixed        $invalidValue  The invalid, validated value.
+     * @param integer|null $pluralization The number to use to pluralize of the message.
+     * @param integer|null $code          The violation code.
+     *
+     * @deprecated Deprecated since version 2.2, to be removed in 2.3.
+     */
+    public function addViolationAtPath($propertyPath, $message, array $params = array(), $invalidValue = null, $pluralization = null, $code = null)
+    {
+        $this->globalContext->getViolations()->add(new ConstraintViolation(
+            $message,
+            $params,
+            $this->globalContext->getRoot(),
+            $propertyPath,
+            // check using func_num_args() to allow passing null values
+            func_num_args() >= 4 ? $invalidValue : $this->value,
+            $pluralization,
+            $code
+        ));
+    }
+
+    /**
+     * Adds a violation at the validation graph node with the given property
+     * path relative to the current property path.
+     *
+     * @param string       $subPath       The relative property path for the violation.
+     * @param string       $message       The error message.
+     * @param array        $params        The parameters parsed into the error message.
+     * @param mixed        $invalidValue  The invalid, validated value.
+     * @param integer|null $pluralization The number to use to pluralize of the message.
+     * @param integer|null $code          The violation code.
+     *
+     * @deprecated Deprecated since version 2.2, to be removed in 2.3. Use the
+     *             method {@link atViolationAt} instead.
+     */
+    public function addViolationAtSubPath($subPath, $message, array $params = array(), $invalidValue = null, $pluralization = null, $code = null)
+    {
+        if (func_num_args() >= 4) {
+            $this->addViolationAt($subPath, $message, $params, $invalidValue, $pluralization, $code);
+        } else {
+            // Needed in order to make the check for func_num_args() inside work
+            $this->addViolationAt($subPath, $message, $params);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function addViolationAt($subPath, $message, array $params = array(), $invalidValue = null, $pluralization = null, $code = null)
+    {
+        $this->globalContext->getViolations()->add(new ConstraintViolation(
+            $message,
+            $params,
+            $this->globalContext->getRoot(),
+            $this->getPropertyPath($subPath),
+            // check using func_num_args() to allow passing null values
+            func_num_args() >= 4 ? $invalidValue : $this->value,
+            $pluralization,
+            $code
+        ));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getViolations()
+    {
+        return $this->globalContext->getViolations();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getRoot()
+    {
+        return $this->globalContext->getRoot();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getPropertyPath($subPath = null)
+    {
+        if (null !== $subPath && '' !== $this->propertyPath && '' !== $subPath && '[' !== $subPath[0]) {
+            return $this->propertyPath . '.' . $subPath;
+        }
+
+        return $this->propertyPath . $subPath;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getClassName()
+    {
+        if ($this->metadata instanceof ClassBasedInterface) {
+            return $this->metadata->getClassName();
+        }
+
+        return null;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getPropertyName()
+    {
+        if ($this->metadata instanceof PropertyMetadataInterface) {
+            return $this->metadata->getPropertyName();
+        }
+
+        return null;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getValue()
+    {
+        return $this->value;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getGroup()
+    {
+        return $this->group;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getMetadata()
+    {
+        return $this->metadata;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getMetadataFor($value)
+    {
+        return $this->globalContext->getMetadataFactory()->getMetadataFor($value);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function validate($value, $groups = null, $subPath = '', $traverse = false, $deep = false)
+    {
+        $propertyPath = $this->getPropertyPath($subPath);
+
+        foreach ($this->resolveGroups($groups) as $group) {
+            $this->globalContext->getVisitor()->validate($value, $group, $propertyPath, $traverse, $deep);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function validateValue($value, $constraints, $groups = null, $subPath = '')
+    {
+        $constraints = is_array($constraints) ? $constraints : array($constraints);
+
+        if (null === $groups && '' === $subPath) {
+            $context = clone $this;
+            $context->value = $value;
+            $context->executeConstraintValidators($value, $constraints);
+
+            return;
+        }
+
+        $propertyPath = $this->getPropertyPath($subPath);
+
+        foreach ($this->resolveGroups($groups) as $group) {
+            $context = clone $this;
+            $context->value = $value;
+            $context->group = $group;
+            $context->propertyPath = $propertyPath;
+            $context->executeConstraintValidators($value, $constraints);
+        }
+    }
+
+    /**
+     * Returns the class name of the current node.
+     *
+     * @return string|null The class name or null, if the current node does not
+     *                     hold information about a class.
+     *
+     * @see getClassName
+     *
+     * @deprecated Deprecated since version 2.2, to be removed in 2.3. Use
+     *             {@link getClassName} instead.
+     */
+    public function getCurrentClass()
+    {
+        return $this->getClassName();
+    }
+
+    /**
+     * Returns the property name of the current node.
+     *
+     * @return string|null The property name or null, if the current node does
+     *                     not hold information about a property.
+     *
+     * @see getPropertyName
+     *
+     * @deprecated Deprecated since version 2.2, to be removed in 2.3. Use
+     *             {@link getClassName} instead.
+     */
+    public function getCurrentProperty()
+    {
+        return $this->getPropertyName();
+    }
+
+    /**
+     * Returns the currently validated value.
+     *
+     * @return mixed The current value.
+     *
+     * @see getValue
+     *
+     * @deprecated Deprecated since version 2.2, to be removed in 2.3. Use
+     *             {@link getValue} instead.
+     */
+    public function getCurrentValue()
+    {
+        return $this->value;
+    }
+
+    /**
+     * Returns the graph walker instance.
+     *
+     * @return GraphWalker The graph walker.
+     *
+     * @deprecated Deprecated since version 2.2, to be removed in 2.3. Use
+     *             {@link validate} and {@link validateValue} instead.
+     */
+    public function getGraphWalker()
+    {
+        return $this->globalContext->getVisitor()->getGraphWalker();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getMetadataFactory()
+    {
+        return $this->globalContext->getMetadataFactory();
+    }
+
+    /**
+     * Executes the validators of the given constraints for the given value.
+     *
+     * @param mixed        $value       The value to validate.
+     * @param Constraint[] $constraints The constraints to match against.
+     */
+    private function executeConstraintValidators($value, array $constraints)
+    {
+        foreach ($constraints as $constraint) {
+            $validator = $this->globalContext->getValidatorFactory()->getInstance($constraint);
+            $validator->initialize($this);
+            $validator->validate($value, $constraint);
+        }
+    }
+
+    /**
+     * Returns an array of group names.
+     *
+     * @param null|string|string[] $groups The groups to resolve. If a single string is
+     *                                     passed, it is converted to an array. If null
+     *                                     is passed, an array containing the current
+     *                                     group of the context is returned.
+     *
+     * @return array An array of validation groups.
+     */
+    private function resolveGroups($groups)
+    {
+        return $groups ? (array) $groups : (array) $this->group;
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/ExecutionContextInterface.php b/core/vendor/symfony/validator/Symfony/Component/Validator/ExecutionContextInterface.php
new file mode 100644
index 0000000..cae91a9
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/ExecutionContextInterface.php
@@ -0,0 +1,304 @@
+<?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;
+
+/**
+ * Stores the validator's state during validation.
+ *
+ * For example, let's validate the following object graph:
+ *
+ * <pre>
+ * (Person)---($firstName: string)
+ *      \
+ *   ($address: Address)---($street: string)
+ * </pre>
+ *
+ * We validate the <tt>Person</tt> instance, which becomes the "root" of the
+ * validation run (see {@link getRoot}). The state of the context after the
+ * first step will be like this:
+ *
+ * <pre>
+ * (Person)---($firstName: string)
+ *    ^ \
+ *   ($address: Address)---($street: string)
+ * </pre>
+ *
+ * The validator is stopped at the <tt>Person</tt> node, both the root and the
+ * value (see {@link getValue}) of the context point to the <tt>Person</tt>
+ * instance. The property path is empty at this point (see {@link getPropertyPath}).
+ * The metadata of the context is the metadata of the <tt>Person</tt> node
+ * (see {@link getMetadata}).
+ *
+ * After advancing to the property <tt>$firstName</tt> of the <tt>Person</tt>
+ * instance, the state of the context looks like this:
+ *
+ * <pre>
+ * (Person)---($firstName: string)
+ *      \              ^
+ *   ($address: Address)---($street: string)
+ * </pre>
+ *
+ * The validator is stopped at the property <tt>$firstName</tt>. The root still
+ * points to the <tt>Person</tt> instance, because this is where the validation
+ * started. The property path is now "firstName" and the current value is the
+ * value of that property.
+ *
+ * After advancing to the <tt>$address</tt> property and then to the
+ * <tt>$street</tt> property of the <tt>Address</tt> instance, the context state
+ * looks like this:
+ *
+ * <pre>
+ * (Person)---($firstName: string)
+ *      \
+ *   ($address: Address)---($street: string)
+ *                               ^
+ * </pre>
+ *
+ * The validator is stopped at the property <tt>$street</tt>. The root still
+ * points to the <tt>Person</tt> instance, but the property path is now
+ * "address.street" and the validated value is the value of that property.
+ *
+ * Apart from the root, the property path and the currently validated value,
+ * the execution context also knows the metadata of the current node (see
+ * {@link getMetadata}) which for example returns a {@link Mapping\PropertyMetadata}
+ * or a {@link Mapping\ClassMetadata} object. he context also contains the
+ * validation group that is currently being validated (see {@link getGroup}) and
+ * the violations that happened up until now (see {@link getViolations}).
+ *
+ * Apart from reading the execution context, you can also use
+ * {@link addViolation} or {@link addViolationAt} to add new violations and
+ * {@link validate} or {@link validateValue} to validate values that the
+ * validator otherwise would not reach.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+interface ExecutionContextInterface
+{
+    /**
+     * Adds a violation at the current node of the validation graph.
+     *
+     * @param string       $message       The error message.
+     * @param array        $params        The parameters substituted in the error message.
+     * @param mixed        $invalidValue  The invalid, validated value.
+     * @param integer|null $pluralization The number to use to pluralize of the message.
+     * @param integer|null $code          The violation code.
+     *
+     * @api
+     */
+    public function addViolation($message, array $params = array(), $invalidValue = null, $pluralization = null, $code = null);
+
+    /**
+     * Adds a violation at the validation graph node with the given property
+     * path relative to the current property path.
+     *
+     * @param string       $subPath       The relative property path for the violation.
+     * @param string       $message       The error message.
+     * @param array        $params        The parameters substituted in the error message.
+     * @param mixed        $invalidValue  The invalid, validated value.
+     * @param integer|null $pluralization The number to use to pluralize of the message.
+     * @param integer|null $code          The violation code.
+     *
+     * @api
+     */
+    public function addViolationAt($subPath, $message, array $params = array(), $invalidValue = null, $pluralization = null, $code = null);
+
+    /**
+     * Validates the given value within the scope of the current validation.
+     *
+     * The value may be any value recognized by the used metadata factory
+     * (see {@link MetadataFactoryInterface::getMetadata}), or an array or a
+     * traversable object of such values.
+     *
+     * Usually you validate a value that is not the current node of the
+     * execution context. For this case, you can pass the {@link $subPath}
+     * argument which is appended to the current property path when a violation
+     * is created. For example, take the following object graph:
+     *
+     * <pre>
+     * (Person)---($address: Address)---($phoneNumber: PhoneNumber)
+     *                     ^
+     * </pre>
+     *
+     * When the execution context stops at the <tt>Person</tt> instance, the
+     * property path is "address". When you validate the <tt>PhoneNumber</tt>
+     * instance now, pass "phoneNumber" as sub path to correct the property path
+     * to "address.phoneNumber":
+     *
+     * <pre>
+     * $context->validate($address->phoneNumber, 'phoneNumber');
+     * </pre>
+     *
+     * Any violations generated during the validation will be added to the
+     * violation list that you can access with {@link getViolations}.
+     *
+     * @param mixed  $value    The value to validate.
+     * @param string $subPath  The path to append to the context's property path.
+     * @param null   $groups   The groups to validate in. If you don't pass any
+     *                         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>.
+     * @param bool   $deep     Whether to traverse the value recursively if
+     *                         it is a collection of collections.
+     */
+    public function validate($value, $subPath = '', $groups = null, $traverse = false, $deep = false);
+
+    /**
+     * Validates a value against a constraint.
+     *
+     * Use the parameter <tt>$subPath</tt> to adapt the property path for the
+     * validated value. For example, take the following object graph:
+     *
+     * <pre>
+     * (Person)---($address: Address)---($street: string)
+     *                     ^
+     * </pre>
+     *
+     * When the validator validates the <tt>Address</tt> instance, the
+     * property path stored in the execution context is "address". When you
+     * manually validate the property <tt>$street</tt> now, pass the sub path
+     * "street" to adapt the full property path to "address.street":
+     *
+     * <pre>
+     * $context->validate($address->street, new NotNull(), 'street');
+     * </pre>
+     *
+     * @param mixed                   $value       The value to validate.
+     * @param Constraint|Constraint[] $constraints The constraint(s) to validate against.
+     * @param string                  $subPath     The path to append to the context's property path.
+     * @param null                    $groups      The groups to validate in. If you don't pass any
+     *                                             groups here, the current group of the context
+     *                                             will be used.
+     */
+    public function validateValue($value, $constraints, $subPath = '', $groups = null);
+
+    /**
+     * Returns the violations generated by the validator so far.
+     *
+     * @return ConstraintViolationListInterface The constraint violation list.
+     *
+     * @api
+     */
+    public function getViolations();
+
+    /**
+     * Returns the value at which validation was started in the object graph.
+     *
+     * The validator, when given an object, traverses the properties and
+     * related objects and their properties. The root of the validation is the
+     * object from which the traversal started.
+     *
+     * The current value is returned by {@link getValue}.
+     *
+     * @return mixed The root value of the validation.
+     */
+    public function getRoot();
+
+    /**
+     * Returns the value that the validator is currently validating.
+     *
+     * If you want to retrieve the object that was originally passed to the
+     * validator, use {@link getRoot}.
+     *
+     * @return mixed The currently validated value.
+     */
+    public function getValue();
+
+    /**
+     * Returns the metadata for the currently validated value.
+     *
+     * With the core implementation, this method returns a
+     * {@link Mapping\ClassMetadata} instance if the current value is an object,
+     * a {@link Mapping\PropertyMetadata} instance if the current value is
+     * the value of a property and a {@link Mapping\GetterMetadata} instance if
+     * the validated value is the result of a getter method.
+     *
+     * If the validated value is neither of these, for example if the validator
+     * has been called with a plain value and constraint, this method returns
+     * null.
+     *
+     * @return MetadataInterface|null The metadata of the currently validated
+     *                                value.
+     */
+    public function getMetadata();
+
+    /**
+     * Returns the used metadata factory.
+     *
+     * @return MetadataFactoryInterface The metadata factory.
+     */
+    public function getMetadataFactory();
+
+    /**
+     * Returns the validation group that is currently being validated.
+     *
+     * @return string The current validation group.
+     */
+    public function getGroup();
+
+    /**
+     * Returns the class name of the current node.
+     *
+     * If the metadata of the current node does not implement
+     * {@link ClassBasedInterface} or if no metadata is available for the
+     * current node, this method returns null.
+     *
+     * @return string|null The class name or null, if no class name could be found.
+     */
+    public function getClassName();
+
+    /**
+     * Returns the property name of the current node.
+     *
+     * If the metadata of the current node does not implement
+     * {@link PropertyMetadataInterface} or if no metadata is available for the
+     * current node, this method returns null.
+     *
+     * @return string|null The property name or null, if no property name could be found.
+     */
+    public function getPropertyName();
+
+    /**
+     * Returns the property path to the value that the validator is currently
+     * validating.
+     *
+     * For example, take the following object graph:
+     *
+     * <pre>
+     * (Person)---($address: Address)---($street: string)
+     * </pre>
+     *
+     * When the <tt>Person</tt> instance is passed to the validator, the
+     * property path is initially empty. When the <tt>$address</tt> property
+     * of that person is validated, the property path is "address". When
+     * the <tt>$street</tt> property of the related <tt>Address</tt> instance
+     * is validated, the property path is "address.street".
+     *
+     * Properties of objects are prefixed with a dot in the property path.
+     * Indices of arrays or objects implementing the {@link \ArrayAccess}
+     * interface are enclosed in brackets. For example, if the property in
+     * the previous example is <tt>$addresses</tt> and contains an array
+     * of <tt>Address</tt> instance, the property path generated for the
+     * <tt>$street</tt> property of one of these addresses is for example
+     * "addresses[0].street".
+     *
+     * @param string $subPath Optional. The suffix appended to the current
+     *                        property path.
+     *
+     * @return string The current property path. The result may be an empty
+     *                string if the validator is currently validating the
+     *                root value of the validation graph.
+     */
+    public function getPropertyPath($subPath = null);
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/GlobalExecutionContextInterface.php b/core/vendor/symfony/validator/Symfony/Component/Validator/GlobalExecutionContextInterface.php
new file mode 100644
index 0000000..aff44b3
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/GlobalExecutionContextInterface.php
@@ -0,0 +1,68 @@
+<?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;
+
+/**
+ * Stores the node-independent state of a validation run.
+ *
+ * When the validator validates a graph of objects, it uses two classes to
+ * store the state during the validation:
+ *
+ * <ul>
+ * <li>For each node in the validation graph (objects, properties, getters) the
+ * validator creates an instance of {@link ExecutionContextInterface} that
+ * stores the information about that node.</li>
+ * <li>One single <tt>GlobalExecutionContextInterface</tt> stores the state
+ * that is independent of the current node.</li>
+ * </ul>
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+interface GlobalExecutionContextInterface
+{
+    /**
+     * Returns the violations generated by the validator so far.
+     *
+     * @return ConstraintViolationListInterface A list of constraint violations.
+     */
+    public function getViolations();
+
+    /**
+     * Returns the value at which validation was started in the object graph.
+     *
+     * @return mixed The root value.
+     *
+     * @see ExecutionContextInterface::getRoot
+     */
+    public function getRoot();
+
+    /**
+     * Returns the visitor instance used to validate the object graph nodes.
+     *
+     * @return ValidationVisitorInterface The validation visitor.
+     */
+    public function getVisitor();
+
+    /**
+     * Returns the factory for constraint validators.
+     *
+     * @return ConstraintValidatorFactoryInterface The constraint validator factory.
+     */
+    public function getValidatorFactory();
+
+    /**
+     * Returns the factory for validation metadata objects.
+     *
+     * @return MetadataFactoryInterface The metadata factory.
+     */
+    public function getMetadataFactory();
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/GraphWalker.php b/core/vendor/symfony/validator/Symfony/Component/Validator/GraphWalker.php
new file mode 100644
index 0000000..26177b0
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/GraphWalker.php
@@ -0,0 +1,205 @@
+<?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;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+use Symfony\Component\Validator\Mapping\ClassMetadata;
+use Symfony\Component\Validator\Mapping\MemberMetadata;
+
+/**
+ * Responsible for walking over and initializing validation on different
+ * types of items.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @deprecated Deprecated since version 2.2, to be removed in 2.3. This class
+ *             has been replaced by {@link ValidationVisitorInterface} and
+ *             {@link MetadataInterface}.
+ */
+class GraphWalker
+{
+    /**
+     * @var ValidationVisitor
+     */
+    private $visitor;
+
+    /**
+     * @var MetadataFactoryInterface
+     */
+    private $metadataFactory;
+
+    /**
+     * @var array
+     */
+    private $validatedObjects;
+
+    /**
+     * Creates a new graph walker.
+     *
+     * @param ValidationVisitor        $visitor
+     * @param MetadataFactoryInterface $metadataFactory
+     * @param array                    $validatedObjects
+     *
+     * @deprecated Deprecated since version 2.2, to be removed in 2.3.
+     */
+    public function __construct(ValidationVisitor $visitor, MetadataFactoryInterface $metadataFactory, array &$validatedObjects = array())
+    {
+        $this->visitor = $visitor;
+        $this->metadataFactory = $metadataFactory;
+        $this->validatedObjects = &$validatedObjects;
+    }
+
+    /**
+     * @return ConstraintViolationList
+     *
+     * @deprecated Deprecated since version 2.2, to be removed in 2.3.
+     */
+    public function getViolations()
+    {
+        return $this->visitor->getViolations();
+    }
+
+    /**
+     * Initialize validation on the given object using the given metadata
+     * instance and validation group.
+     *
+     * @param ClassMetadata $metadata
+     * @param object        $object       The object to validate
+     * @param string        $group        The validator group to use for validation
+     * @param string        $propertyPath
+     *
+     * @deprecated Deprecated since version 2.2, to be removed in 2.3.
+     */
+    public function walkObject(ClassMetadata $metadata, $object, $group, $propertyPath)
+    {
+        $hash = spl_object_hash($object);
+
+        // Exit, if the object is already validated for the current group
+        if (isset($this->validatedObjects[$hash][$group])) {
+            return;
+        }
+
+        // Remember validating this object before starting and possibly
+        // traversing the object graph
+        $this->validatedObjects[$hash][$group] = true;
+
+        $metadata->accept($this->visitor, $object, $group, $propertyPath);
+    }
+
+    protected function walkObjectForGroup(ClassMetadata $metadata, $object, $group, $propertyPath, $propagatedGroup = null)
+    {
+        $metadata->accept($this->visitor, $object, $group, $propertyPath, $propagatedGroup);
+    }
+
+    /**
+     * Validates a property of a class.
+     *
+     * @param Mapping\ClassMetadata $metadata
+     * @param                       $property
+     * @param                       $object
+     * @param                       $group
+     * @param                       $propertyPath
+     * @param null                  $propagatedGroup
+     *
+     * @throws Exception\UnexpectedTypeException
+     *
+     * @deprecated Deprecated since version 2.2, to be removed in 2.3.
+     */
+    public function walkProperty(ClassMetadata $metadata, $property, $object, $group, $propertyPath, $propagatedGroup = null)
+    {
+        if (!is_object($object)) {
+            throw new UnexpectedTypeException($object, 'object');
+        }
+
+        foreach ($metadata->getMemberMetadatas($property) as $member) {
+            $member->accept($this->visitor, $member->getValue($object), $group, $propertyPath, $propagatedGroup);
+        }
+    }
+
+    /**
+     * Validates a property of a class against a potential value.
+     *
+     * @param Mapping\ClassMetadata $metadata
+     * @param                       $property
+     * @param                       $value
+     * @param                       $group
+     * @param                       $propertyPath
+     *
+     * @deprecated Deprecated since version 2.2, to be removed in 2.3.
+     */
+    public function walkPropertyValue(ClassMetadata $metadata, $property, $value, $group, $propertyPath)
+    {
+        foreach ($metadata->getMemberMetadatas($property) as $member) {
+            $member->accept($this->visitor, $value, $group, $propertyPath);
+        }
+    }
+
+    protected function walkMember(MemberMetadata $metadata, $value, $group, $propertyPath, $propagatedGroup = null)
+    {
+        $metadata->accept($this->visitor, $value, $group, $propertyPath, $propagatedGroup);
+    }
+
+    /**
+     * Validates an object or an array.
+     *
+     * @param      $value
+     * @param      $group
+     * @param      $propertyPath
+     * @param      $traverse
+     * @param bool $deep
+     *
+     * @deprecated Deprecated since version 2.2, to be removed in 2.3.
+     */
+    public function walkReference($value, $group, $propertyPath, $traverse, $deep = false)
+    {
+        $this->visitor->validate($value, $group, $propertyPath, $traverse, $deep);
+    }
+
+    /**
+     * Validates a value against a constraint.
+     *
+     * @param Constraint $constraint
+     * @param            $value
+     * @param            $group
+     * @param            $propertyPath
+     * @param null       $currentClass
+     * @param null       $currentProperty
+     *
+     * @deprecated Deprecated since version 2.2, to be removed in 2.3.
+     */
+    public function walkConstraint(Constraint $constraint, $value, $group, $propertyPath, $currentClass = null, $currentProperty = null)
+    {
+        $metadata = null;
+
+        // BC code to make getCurrentClass() and getCurrentProperty() work when
+        // called from within this method
+        if (null !== $currentClass) {
+            $metadata = $this->metadataFactory->getMetadataFor($currentClass);
+
+            if (null !== $currentProperty && $metadata instanceof PropertyMetadataContainerInterface) {
+                $metadata = current($metadata->getPropertyMetadata($currentProperty));
+            }
+        }
+
+        $context = new ExecutionContext(
+            $this->visitor,
+            $metadata,
+            $value,
+            $group,
+            $propertyPath
+        );
+
+        $context->validateValue($value, $constraint);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/GroupSequenceProviderInterface.php b/core/vendor/symfony/validator/Symfony/Component/Validator/GroupSequenceProviderInterface.php
new file mode 100644
index 0000000..62e8a5e
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/GroupSequenceProviderInterface.php
@@ -0,0 +1,26 @@
+<?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;
+
+/**
+ * Defines the interface for a group sequence provider.
+ */
+interface GroupSequenceProviderInterface
+{
+    /**
+     * Returns which validation groups should be used for a certain state
+     * of the object.
+     *
+     * @return array An array of validation groups
+     */
+    public function getGroupSequence();
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/LICENSE b/core/vendor/symfony/validator/Symfony/Component/Validator/LICENSE
new file mode 100644
index 0000000..cdffe7a
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2004-2012 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/BlackholeMetadataFactory.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/BlackholeMetadataFactory.php
new file mode 100644
index 0000000..4cd1175
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/BlackholeMetadataFactory.php
@@ -0,0 +1,25 @@
+<?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\Mapping;
+
+/**
+ * Simple implementation of ClassMetadataFactoryInterface that can be used when using ValidatorInterface::validateValue().
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class BlackholeMetadataFactory implements ClassMetadataFactoryInterface
+{
+    public function getClassMetadata($class)
+    {
+        throw new \LogicException('BlackholeClassMetadataFactory only works with ValidatorInterface::validateValue().');
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Cache/ApcCache.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Cache/ApcCache.php
new file mode 100644
index 0000000..226fab3
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Cache/ApcCache.php
@@ -0,0 +1,51 @@
+<?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\Mapping\Cache;
+
+use Symfony\Component\Validator\Mapping\ClassMetadata;
+
+class ApcCache implements CacheInterface
+{
+    private $prefix;
+
+    public function __construct($prefix)
+    {
+        if (!extension_loaded('apc')) {
+            throw new \RuntimeException('Unable to use ApcCache to cache validator mappings as APC is not enabled.');
+        }
+
+        $this->prefix = $prefix;
+    }
+
+    public function has($class)
+    {
+        if (!function_exists('apc_exists')) {
+            $exists = false;
+
+            apc_fetch($this->prefix.$class, $exists);
+
+            return $exists;
+        }
+
+        return apc_exists($this->prefix.$class);
+    }
+
+    public function read($class)
+    {
+        return apc_fetch($this->prefix.$class);
+    }
+
+    public function write(ClassMetadata $metadata)
+    {
+        apc_store($this->prefix.$metadata->getClassName(), $metadata);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Cache/CacheInterface.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Cache/CacheInterface.php
new file mode 100644
index 0000000..2f9b031
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Cache/CacheInterface.php
@@ -0,0 +1,45 @@
+<?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\Mapping\Cache;
+
+use Symfony\Component\Validator\Mapping\ClassMetadata;
+
+/**
+ * Persists ClassMetadata instances in a cache
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+interface CacheInterface
+{
+    /**
+     * Returns whether metadata for the given class exists in the cache
+     *
+     * @param string $class
+     */
+    public function has($class);
+
+    /**
+     * Returns the metadata for the given class from the cache
+     *
+     * @param string $class Class Name
+     *
+     * @return ClassMetadata|false A ClassMetadata instance or false on miss
+     */
+    public function read($class);
+
+    /**
+     * Stores a class metadata in the cache
+     *
+     * @param ClassMetadata $metadata A Class Metadata
+     */
+    public function write(ClassMetadata $metadata);
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/ClassMetadata.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/ClassMetadata.php
new file mode 100644
index 0000000..40dc41a
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/ClassMetadata.php
@@ -0,0 +1,407 @@
+<?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\Mapping;
+
+use Symfony\Component\Validator\ValidationVisitorInterface;
+use Symfony\Component\Validator\PropertyMetadataContainerInterface;
+use Symfony\Component\Validator\ClassBasedInterface;
+use Symfony\Component\Validator\MetadataInterface;
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
+use Symfony\Component\Validator\Exception\GroupDefinitionException;
+
+/**
+ * Represents all the configured constraints on a given class.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ClassMetadata extends ElementMetadata implements MetadataInterface, ClassBasedInterface, PropertyMetadataContainerInterface
+{
+    /**
+     * @var string
+     */
+    public $name;
+
+    /**
+     * @var string
+     */
+    public $defaultGroup;
+
+    /**
+     * @var MemberMetadata[]
+     */
+    public $members = array();
+
+    /**
+     * @var PropertyMetadata[]
+     */
+    public $properties = array();
+
+    /**
+     * @var GetterMetadata[]
+     */
+    public $getters = array();
+
+    /**
+     * @var array
+     */
+    public $groupSequence = array();
+
+    /**
+     * @var Boolean
+     */
+    public $groupSequenceProvider = false;
+
+    /**
+     * @var \ReflectionClass
+     */
+    private $reflClass;
+
+    /**
+     * Constructs a metadata for the given class
+     *
+     * @param string $class
+     */
+    public function __construct($class)
+    {
+        $this->name = $class;
+        // class name without namespace
+        if (false !== $nsSep = strrpos($class, '\\')) {
+            $this->defaultGroup = substr($class, $nsSep + 1);
+        } else {
+            $this->defaultGroup = $class;
+        }
+    }
+    
+    public function accept(ValidationVisitorInterface $visitor, $value, $group, $propertyPath, $propagatedGroup = null)
+    {
+        if (null === $propagatedGroup && Constraint::DEFAULT_GROUP === $group
+                && ($this->hasGroupSequence() || $this->isGroupSequenceProvider())) {
+            if ($this->hasGroupSequence()) {
+                $groups = $this->getGroupSequence();
+            } else {
+                $groups = $value->getGroupSequence();
+            }
+
+            foreach ($groups as $group) {
+                $this->accept($visitor, $value, $group, $propertyPath, Constraint::DEFAULT_GROUP);
+
+                if (count($visitor->getViolations()) > 0) {
+                    break;
+                }
+            }
+
+            return;
+        }
+
+        $visitor->visit($this, $value, $group, $propertyPath);
+
+        if (null !== $value) {
+            $pathPrefix = empty($propertyPath) ? '' : $propertyPath.'.';
+
+            foreach ($this->getConstrainedProperties() as $property) {
+                foreach ($this->getMemberMetadatas($property) as $member) {
+                    $member->accept($visitor, $member->getValue($value), $group, $pathPrefix.$property, $propagatedGroup);
+                }
+            }
+        }
+    }
+
+    /**
+     * Returns the properties to be serialized
+     *
+     * @return array
+     */
+    public function __sleep()
+    {
+        return array_merge(parent::__sleep(), array(
+            'getters',
+            'groupSequence',
+            'groupSequenceProvider',
+            'members',
+            'name',
+            'properties',
+            'defaultGroup'
+        ));
+    }
+
+    /**
+     * Returns the fully qualified name of the class
+     *
+     * @return string  The fully qualified class name
+     */
+    public function getClassName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Returns the name of the default group for this class
+     *
+     * For each class, the group "Default" is an alias for the group
+     * "<ClassName>", where <ClassName> is the non-namespaced name of the
+     * class. All constraints implicitly or explicitly assigned to group
+     * "Default" belong to both of these groups, unless the class defines
+     * a group sequence.
+     *
+     * If a class defines a group sequence, validating the class in "Default"
+     * will validate the group sequence. The constraints assigned to "Default"
+     * can still be validated by validating the class in "<ClassName>".
+     *
+     * @return string  The name of the default group
+     */
+    public function getDefaultGroup()
+    {
+        return $this->defaultGroup;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function addConstraint(Constraint $constraint)
+    {
+        if (!in_array(Constraint::CLASS_CONSTRAINT, (array) $constraint->getTargets())) {
+            throw new ConstraintDefinitionException(sprintf(
+                'The constraint %s cannot be put on classes',
+                get_class($constraint)
+            ));
+        }
+
+        $constraint->addImplicitGroupName($this->getDefaultGroup());
+
+        parent::addConstraint($constraint);
+    }
+
+    /**
+     * Adds a constraint to the given property.
+     *
+     * @param string     $property   The name of the property
+     * @param Constraint $constraint The constraint
+     *
+     * @return ClassMetadata This object
+     */
+    public function addPropertyConstraint($property, Constraint $constraint)
+    {
+        if (!isset($this->properties[$property])) {
+            $this->properties[$property] = new PropertyMetadata($this->getClassName(), $property);
+
+            $this->addMemberMetadata($this->properties[$property]);
+        }
+
+        $constraint->addImplicitGroupName($this->getDefaultGroup());
+
+        $this->properties[$property]->addConstraint($constraint);
+
+        return $this;
+    }
+
+    /**
+     * Adds a constraint to the getter of the given property.
+     *
+     * The name of the getter is assumed to be the name of the property with an
+     * uppercased first letter and either the prefix "get" or "is".
+     *
+     * @param string     $property   The name of the property
+     * @param Constraint $constraint The constraint
+     *
+     * @return ClassMetadata This object
+     */
+    public function addGetterConstraint($property, Constraint $constraint)
+    {
+        if (!isset($this->getters[$property])) {
+            $this->getters[$property] = new GetterMetadata($this->getClassName(), $property);
+
+            $this->addMemberMetadata($this->getters[$property]);
+        }
+
+        $constraint->addImplicitGroupName($this->getDefaultGroup());
+
+        $this->getters[$property]->addConstraint($constraint);
+
+        return $this;
+    }
+
+    /**
+     * Merges the constraints of the given metadata into this object.
+     *
+     * @param ClassMetadata $source The source metadata
+     */
+    public function mergeConstraints(ClassMetadata $source)
+    {
+        foreach ($source->getConstraints() as $constraint) {
+            $this->addConstraint(clone $constraint);
+        }
+
+        foreach ($source->getConstrainedProperties() as $property) {
+            foreach ($source->getMemberMetadatas($property) as $member) {
+                $member = clone $member;
+
+                foreach ($member->getConstraints() as $constraint) {
+                    $constraint->addImplicitGroupName($this->getDefaultGroup());
+                }
+
+                $this->addMemberMetadata($member);
+
+                if (!$member->isPrivate()) {
+                    $property = $member->getPropertyName();
+
+                    if ($member instanceof PropertyMetadata && !isset($this->properties[$property])) {
+                        $this->properties[$property] = $member;
+                    } elseif ($member instanceof GetterMetadata && !isset($this->getters[$property])) {
+                        $this->getters[$property] = $member;
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Adds a member metadata.
+     *
+     * @param MemberMetadata $metadata
+     */
+    protected function addMemberMetadata(MemberMetadata $metadata)
+    {
+        $property = $metadata->getPropertyName();
+
+        $this->members[$property][] = $metadata;
+    }
+
+    /**
+     * Returns true if metadatas of members is present for the given property.
+     *
+     * @param string $property The name of the property
+     *
+     * @return Boolean
+     */
+    public function hasMemberMetadatas($property)
+    {
+        return array_key_exists($property, $this->members);
+    }
+
+    /**
+     * Returns all metadatas of members describing the given property.
+     *
+     * @param string $property The name of the property
+     *
+     * @return MemberMetadata[] An array of MemberMetadata
+     */
+    public function getMemberMetadatas($property)
+    {
+        return $this->members[$property];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getPropertyMetadata($property)
+    {
+        return $this->members[$property];
+    }
+
+    /**
+     * Returns all properties for which constraints are defined.
+     *
+     * @return array An array of property names
+     */
+    public function getConstrainedProperties()
+    {
+        return array_keys($this->members);
+    }
+
+    /**
+     * Sets the default group sequence for this class.
+     *
+     * @param array $groups An array of group names
+     */
+    public function setGroupSequence(array $groups)
+    {
+        if ($this->isGroupSequenceProvider()) {
+            throw new GroupDefinitionException('Defining a static group sequence is not allowed with a group sequence provider');
+        }
+
+        if (in_array(Constraint::DEFAULT_GROUP, $groups, true)) {
+            throw new GroupDefinitionException(sprintf('The group "%s" is not allowed in group sequences', Constraint::DEFAULT_GROUP));
+        }
+
+        if (!in_array($this->getDefaultGroup(), $groups, true)) {
+            throw new GroupDefinitionException(sprintf('The group "%s" is missing in the group sequence', $this->getDefaultGroup()));
+        }
+
+        $this->groupSequence = $groups;
+
+        return $this;
+    }
+
+    /**
+     * Returns whether this class has an overridden default group sequence.
+     *
+     * @return Boolean
+     */
+    public function hasGroupSequence()
+    {
+        return count($this->groupSequence) > 0;
+    }
+
+    /**
+     * Returns the default group sequence for this class.
+     *
+     * @return array An array of group names
+     */
+    public function getGroupSequence()
+    {
+        return $this->groupSequence;
+    }
+
+    /**
+     * Returns a ReflectionClass instance for this class.
+     *
+     * @return \ReflectionClass
+     */
+    public function getReflectionClass()
+    {
+        if (!$this->reflClass) {
+            $this->reflClass = new \ReflectionClass($this->getClassName());
+        }
+
+        return $this->reflClass;
+    }
+
+    /**
+     * Sets whether a group sequence provider should be used.
+     *
+     * @param Boolean $active
+     */
+    public function setGroupSequenceProvider($active)
+    {
+        if ($this->hasGroupSequence()) {
+            throw new GroupDefinitionException('Defining a group sequence provider is not allowed with a static group sequence');
+        }
+
+        if (!$this->getReflectionClass()->implementsInterface('Symfony\Component\Validator\GroupSequenceProviderInterface')) {
+            throw new GroupDefinitionException(sprintf('Class "%s" must implement GroupSequenceProviderInterface', $this->name));
+        }
+
+        $this->groupSequenceProvider = $active;
+    }
+
+    /**
+     * Returns whether the class is a group sequence provider.
+     *
+     * @return Boolean
+     */
+    public function isGroupSequenceProvider()
+    {
+        return $this->groupSequenceProvider;
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/ClassMetadataFactory.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/ClassMetadataFactory.php
new file mode 100644
index 0000000..279d833
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/ClassMetadataFactory.php
@@ -0,0 +1,123 @@
+<?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\Mapping;
+
+use Symfony\Component\Validator\MetadataFactoryInterface;
+use Symfony\Component\Validator\Exception\NoSuchMetadataException;
+use Symfony\Component\Validator\Mapping\Loader\LoaderInterface;
+use Symfony\Component\Validator\Mapping\Cache\CacheInterface;
+
+/**
+ * A factory for creating metadata for PHP classes.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class ClassMetadataFactory implements ClassMetadataFactoryInterface, MetadataFactoryInterface
+{
+    /**
+     * The loader for loading the class metadata
+     * @var LoaderInterface
+     */
+    protected $loader;
+
+    /**
+     * The cache for caching class metadata
+     * @var CacheInterface
+     */
+    protected $cache;
+
+    protected $loadedClasses = array();
+
+    public function __construct(LoaderInterface $loader = null, CacheInterface $cache = null)
+    {
+        $this->loader = $loader;
+        $this->cache = $cache;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getMetadataFor($value)
+    {
+        if (!is_object($value) && !is_string($value)) {
+            throw new NoSuchMetadataException('Cannot create metadata for non-objects. Got: ' . gettype($value));
+        }
+
+        $class = ltrim(is_object($value) ? get_class($value) : $value, '\\');
+
+        if (isset($this->loadedClasses[$class])) {
+            return $this->loadedClasses[$class];
+        }
+
+        if (null !== $this->cache && false !== ($this->loadedClasses[$class] = $this->cache->read($class))) {
+            return $this->loadedClasses[$class];
+        }
+
+        if (!class_exists($class) && !interface_exists($class)) {
+            throw new NoSuchMetadataException('The class or interface "' . $class . '" does not exist.');
+        }
+
+        $metadata = new ClassMetadata($class);
+
+        // Include constraints from the parent class
+        if ($parent = $metadata->getReflectionClass()->getParentClass()) {
+            $metadata->mergeConstraints($this->getClassMetadata($parent->name));
+        }
+
+        // Include constraints from all implemented interfaces
+        foreach ($metadata->getReflectionClass()->getInterfaces() as $interface) {
+            if ('Symfony\Component\Validator\GroupSequenceProviderInterface' === $interface->name) {
+                continue;
+            }
+            $metadata->mergeConstraints($this->getClassMetadata($interface->name));
+        }
+
+        if (null !== $this->loader) {
+            $this->loader->loadClassMetadata($metadata);
+        }
+
+        if (null !== $this->cache) {
+            $this->cache->write($metadata);
+        }
+
+        return $this->loadedClasses[$class] = $metadata;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasMetadataFor($value)
+    {
+        if (!is_object($value) && !is_string($value)) {
+            return false;
+        }
+
+        $class = ltrim(is_object($value) ? get_class($value) : $value, '\\');
+
+        if (class_exists($class) || interface_exists($class)) {
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @deprecated Deprecated since version 2.2, to be removed in 2.3. Use
+     *             {@link getMetadataFor} instead.
+     */
+    public function getClassMetadata($class)
+    {
+        return $this->getMetadataFor($class);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/ClassMetadataFactoryAdapter.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/ClassMetadataFactoryAdapter.php
new file mode 100644
index 0000000..017e4e4
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/ClassMetadataFactoryAdapter.php
@@ -0,0 +1,59 @@
+<?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\Mapping;
+
+use Symfony\Component\Validator\MetadataFactoryInterface;
+use Symfony\Component\Validator\Exception\NoSuchMetadataException;
+
+/**
+ * An adapter for exposing {@link ClassMetadataFactoryInterface} implementations
+ * under the new {@link MetadataFactoryInterface}.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class ClassMetadataFactoryAdapter implements MetadataFactoryInterface
+{
+    /**
+     * @var ClassMetadataFactoryInterface
+     */
+    private $innerFactory;
+
+    public function __construct(ClassMetadataFactoryInterface $innerFactory)
+    {
+        $this->innerFactory = $innerFactory;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getMetadataFor($value)
+    {
+        $class = is_object($value) ? get_class($value) : $value;
+        $metadata = $this->innerFactory->getClassMetadata($class);
+
+        if (null === $metadata) {
+            throw new NoSuchMetadataException('No metadata exists for class '. $class);
+        }
+
+        return $metadata;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasMetadataFor($value)
+    {
+        $class = is_object($value) ? get_class($value) : $value;
+
+        return null !== $this->innerFactory->getClassMetadata($class);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/ClassMetadataFactoryInterface.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/ClassMetadataFactoryInterface.php
new file mode 100644
index 0000000..42fff5c
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/ClassMetadataFactoryInterface.php
@@ -0,0 +1,30 @@
+<?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\Mapping;
+
+/**
+ * A factory for {@link ClassMetadata} objects.
+ *
+ * @deprecated Deprecated since version 2.2, to be removed in 2.3. Implement
+ *             {@link \Symfony\Component\Validator\MetadataFactoryInterface} instead.
+ */
+interface ClassMetadataFactoryInterface
+{
+    /**
+     * Returns metadata for a given class.
+     *
+     * @param string $class The class name.
+     *
+     * @return ClassMetadata The class metadata instance.
+     */
+    public function getClassMetadata($class);
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/ElementMetadata.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/ElementMetadata.php
new file mode 100644
index 0000000..1504eb7
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/ElementMetadata.php
@@ -0,0 +1,105 @@
+<?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\Mapping;
+
+use Symfony\Component\Validator\Constraint;
+
+abstract class ElementMetadata
+{
+    /**
+     * @var Constraint[]
+     */
+    public $constraints = array();
+
+    /**
+     * @var array
+     */
+    public $constraintsByGroup = array();
+
+    /**
+     * Returns the names of the properties that should be serialized.
+     *
+     * @return array
+     */
+    public function __sleep()
+    {
+        return array(
+            'constraints',
+            'constraintsByGroup',
+        );
+    }
+
+    /**
+     * Clones this object.
+     */
+    public function __clone()
+    {
+        $constraints = $this->constraints;
+
+        $this->constraints = array();
+        $this->constraintsByGroup = array();
+
+        foreach ($constraints as $constraint) {
+            $this->addConstraint(clone $constraint);
+        }
+    }
+
+    /**
+     * Adds a constraint to this element.
+     *
+     * @param Constraint $constraint
+     */
+    public function addConstraint(Constraint $constraint)
+    {
+        $this->constraints[] = $constraint;
+
+        foreach ($constraint->groups as $group) {
+            $this->constraintsByGroup[$group][] = $constraint;
+        }
+
+        return $this;
+    }
+
+    /**
+     * Returns all constraints of this element.
+     *
+     * @return Constraint[] An array of Constraint instances
+     */
+    public function getConstraints()
+    {
+        return $this->constraints;
+    }
+
+    /**
+     * Returns whether this element has any constraints.
+     *
+     * @return Boolean
+     */
+    public function hasConstraints()
+    {
+        return count($this->constraints) > 0;
+    }
+
+    /**
+     * Returns the constraints of the given group and global ones (* group).
+     *
+     * @param string $group The group name
+     *
+     * @return array An array with all Constraint instances belonging to the group
+     */
+    public function findConstraints($group)
+    {
+        return isset($this->constraintsByGroup[$group])
+                ? $this->constraintsByGroup[$group]
+                : array();
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/GetterMetadata.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/GetterMetadata.php
new file mode 100644
index 0000000..38cc6e4
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/GetterMetadata.php
@@ -0,0 +1,55 @@
+<?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\Mapping;
+
+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
+     */
+    public function __construct($class, $property)
+    {
+        $getMethod = 'get'.ucfirst($property);
+        $isMethod = 'is'.ucfirst($property);
+
+        if (method_exists($class, $getMethod)) {
+            $method = $getMethod;
+        } elseif (method_exists($class, $isMethod)) {
+            $method = $isMethod;
+        } else {
+            throw new ValidatorException(sprintf('Neither method %s nor %s exists in class %s', $getMethod, $isMethod, $class));
+        }
+
+        parent::__construct($class, $method, $property);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getPropertyValue($object)
+    {
+        return $this->getReflectionMember()->invoke($object);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function newReflectionMember()
+    {
+        return new \ReflectionMethod($this->getClassName(), $this->getName());
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/AbstractLoader.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/AbstractLoader.php
new file mode 100644
index 0000000..54c0dbe
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/AbstractLoader.php
@@ -0,0 +1,65 @@
+<?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\Mapping\Loader;
+
+use Symfony\Component\Validator\Exception\MappingException;
+
+abstract class AbstractLoader implements LoaderInterface
+{
+    /**
+     * Contains all known namespaces indexed by their prefix
+     * @var array
+     */
+    protected $namespaces;
+
+    /**
+     * Adds a namespace alias.
+     *
+     * @param string $alias     The alias
+     * @param string $namespace The PHP namespace
+     */
+    protected function addNamespaceAlias($alias, $namespace)
+    {
+        $this->namespaces[$alias] = $namespace;
+    }
+
+    /**
+     * Creates a new constraint instance for the given constraint name.
+     *
+     * @param string $name The constraint name. Either a constraint relative
+     *                        to the default constraint namespace, or a fully
+     *                        qualified class name
+     * @param array $options The constraint options
+     *
+     * @return Constraint
+     *
+     * @throws MappingException If the namespace prefix is undefined
+     */
+    protected function newConstraint($name, $options)
+    {
+        if (strpos($name, '\\') !== false && class_exists($name)) {
+            $className = (string) $name;
+        } elseif (strpos($name, ':') !== false) {
+            list($prefix, $className) = explode(':', $name, 2);
+
+            if (!isset($this->namespaces[$prefix])) {
+                throw new MappingException(sprintf('Undefined namespace prefix "%s"', $prefix));
+            }
+
+            $className = $this->namespaces[$prefix].$className;
+        } else {
+            $className = 'Symfony\\Component\\Validator\\Constraints\\'.$name;
+        }
+
+        return new $className($options);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/AnnotationLoader.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/AnnotationLoader.php
new file mode 100644
index 0000000..0e7e89b
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/AnnotationLoader.php
@@ -0,0 +1,81 @@
+<?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\Mapping\Loader;
+
+use Doctrine\Common\Annotations\Reader;
+use Symfony\Component\Validator\Exception\MappingException;
+use Symfony\Component\Validator\Mapping\ClassMetadata;
+use Symfony\Component\Validator\Constraints\GroupSequence;
+use Symfony\Component\Validator\Constraints\GroupSequenceProvider;
+use Symfony\Component\Validator\Constraint;
+
+class AnnotationLoader implements LoaderInterface
+{
+    protected $reader;
+
+    public function __construct(Reader $reader)
+    {
+        $this->reader = $reader;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function loadClassMetadata(ClassMetadata $metadata)
+    {
+        $reflClass = $metadata->getReflectionClass();
+        $className = $reflClass->name;
+        $loaded = false;
+
+        foreach ($this->reader->getClassAnnotations($reflClass) as $constraint) {
+            if ($constraint instanceof GroupSequence) {
+                $metadata->setGroupSequence($constraint->groups);
+            } elseif ($constraint instanceof GroupSequenceProvider) {
+                $metadata->setGroupSequenceProvider(true);
+            } elseif ($constraint instanceof Constraint) {
+                $metadata->addConstraint($constraint);
+            }
+
+            $loaded = true;
+        }
+
+        foreach ($reflClass->getProperties() as $property) {
+            if ($property->getDeclaringClass()->name == $className) {
+                foreach ($this->reader->getPropertyAnnotations($property) as $constraint) {
+                    if ($constraint instanceof Constraint) {
+                        $metadata->addPropertyConstraint($property->name, $constraint);
+                    }
+
+                    $loaded = true;
+                }
+            }
+        }
+
+        foreach ($reflClass->getMethods() as $method) {
+            if ($method->getDeclaringClass()->name ==  $className) {
+                foreach ($this->reader->getMethodAnnotations($method) as $constraint) {
+                    if ($constraint instanceof Constraint) {
+                        if (preg_match('/^(get|is)(.+)$/i', $method->name, $matches)) {
+                            $metadata->addGetterConstraint(lcfirst($matches[2]), $constraint);
+                        } else {
+                            throw new MappingException(sprintf('The constraint on "%s::%s" cannot be added. Constraints can only be added on methods beginning with "get" or "is".', $className, $method->name));
+                        }
+                    }
+
+                    $loaded = true;
+                }
+            }
+        }
+
+        return $loaded;
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/FileLoader.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/FileLoader.php
new file mode 100644
index 0000000..2b8c6c0
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/FileLoader.php
@@ -0,0 +1,40 @@
+<?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\Mapping\Loader;
+
+use Symfony\Component\Validator\Exception\MappingException;
+
+abstract class FileLoader extends AbstractLoader
+{
+    protected $file;
+
+    /**
+     * Constructor.
+     *
+     * @param string $file The mapping file to load
+     *
+     * @throws MappingException if the mapping file does not exist
+     * @throws MappingException if the mapping file is not readable
+     */
+    public function __construct($file)
+    {
+        if (!is_file($file)) {
+            throw new MappingException(sprintf('The mapping file %s does not exist', $file));
+        }
+
+        if (!is_readable($file)) {
+            throw new MappingException(sprintf('The mapping file %s is not readable', $file));
+        }
+
+        $this->file = $file;
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/FilesLoader.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/FilesLoader.php
new file mode 100644
index 0000000..a20c797
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/FilesLoader.php
@@ -0,0 +1,61 @@
+<?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\Mapping\Loader;
+
+/**
+ * Creates mapping loaders for array of files.
+ *
+ * Abstract class, used by
+ *
+ * @author Bulat Shakirzyanov <mallluhuct@gmail.com>
+ *
+ * @see    Symfony\Component\Validator\Mapping\Loader\YamlFileLoader
+ * @see    Symfony\Component\Validator\Mapping\Loader\XmlFileLoader
+ */
+abstract class FilesLoader extends LoaderChain
+{
+    /**
+     * Array of mapping files.
+     *
+     * @param array $paths Array of file paths
+     */
+    public function __construct(array $paths)
+    {
+        parent::__construct($this->getFileLoaders($paths));
+    }
+
+    /**
+     * Array of mapping files.
+     *
+     * @param array $paths Array of file paths
+     *
+     * @return LoaderInterface[] Array of metadata loaders
+     */
+    protected function getFileLoaders($paths)
+    {
+        $loaders = array();
+        foreach ($paths as $path) {
+            $loaders[] = $this->getFileLoaderInstance($path);
+        }
+
+        return $loaders;
+    }
+
+    /**
+     * Takes mapping file path.
+     *
+     * @param string $file
+     *
+     * @return LoaderInterface
+     */
+    abstract protected function getFileLoaderInstance($file);
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/LoaderChain.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/LoaderChain.php
new file mode 100644
index 0000000..a0c9ef1
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/LoaderChain.php
@@ -0,0 +1,62 @@
+<?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\Mapping\Loader;
+
+use Symfony\Component\Validator\Exception\MappingException;
+use Symfony\Component\Validator\Mapping\ClassMetadata;
+
+/**
+ * Calls multiple LoaderInterface instances in a chain
+ *
+ * This class accepts multiple instances of LoaderInterface to be passed to the
+ * constructor. When loadClassMetadata() is called, the same method is called
+ * in <em>all</em> of these loaders, regardless of whether any of them was
+ * successful or not.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class LoaderChain implements LoaderInterface
+{
+    protected $loaders;
+
+    /**
+     * Accepts a list of LoaderInterface instances
+     *
+     * @param LoaderInterface[] $loaders An array of LoaderInterface instances
+     *
+     * @throws MappingException If any of the loaders does not implement LoaderInterface
+     */
+    public function __construct(array $loaders)
+    {
+        foreach ($loaders as $loader) {
+            if (!$loader instanceof LoaderInterface) {
+                throw new MappingException(sprintf('Class %s is expected to implement LoaderInterface', get_class($loader)));
+            }
+        }
+
+        $this->loaders = $loaders;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function loadClassMetadata(ClassMetadata $metadata)
+    {
+        $success = false;
+
+        foreach ($this->loaders as $loader) {
+            $success = $loader->loadClassMetadata($metadata) || $success;
+        }
+
+        return $success;
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/LoaderInterface.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/LoaderInterface.php
new file mode 100644
index 0000000..bd679b0
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/LoaderInterface.php
@@ -0,0 +1,26 @@
+<?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\Mapping\Loader;
+
+use Symfony\Component\Validator\Mapping\ClassMetadata;
+
+interface LoaderInterface
+{
+    /**
+     * Load a Class Metadata.
+     *
+     * @param ClassMetadata $metadata A metadata
+     *
+     * @return Boolean
+     */
+    public function loadClassMetadata(ClassMetadata $metadata);
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/StaticMethodLoader.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/StaticMethodLoader.php
new file mode 100644
index 0000000..64d3df7
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/StaticMethodLoader.php
@@ -0,0 +1,52 @@
+<?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\Mapping\Loader;
+
+use Symfony\Component\Validator\Exception\MappingException;
+use Symfony\Component\Validator\Mapping\ClassMetadata;
+
+class StaticMethodLoader implements LoaderInterface
+{
+    protected $methodName;
+
+    public function __construct($methodName = 'loadValidatorMetadata')
+    {
+        $this->methodName = $methodName;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function loadClassMetadata(ClassMetadata $metadata)
+    {
+        /** @var \ReflectionClass $reflClass */
+        $reflClass = $metadata->getReflectionClass();
+
+        if (!$reflClass->isInterface() && $reflClass->hasMethod($this->methodName)) {
+            $reflMethod = $reflClass->getMethod($this->methodName);
+
+            if (!$reflMethod->isStatic()) {
+                throw new MappingException(sprintf('The method %s::%s should be static', $reflClass->name, $this->methodName));
+            }
+
+            if ($reflMethod->getDeclaringClass()->name != $reflClass->name) {
+                return false;
+            }
+
+            $reflMethod->invoke(null, $metadata);
+
+            return true;
+        }
+
+        return false;
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/XmlFileLoader.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/XmlFileLoader.php
new file mode 100644
index 0000000..4925abb
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/XmlFileLoader.php
@@ -0,0 +1,238 @@
+<?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\Mapping\Loader;
+
+use Symfony\Component\Validator\Exception\MappingException;
+use Symfony\Component\Validator\Mapping\ClassMetadata;
+
+class XmlFileLoader extends FileLoader
+{
+    /**
+     * An array of SimpleXMLElement instances.
+     *
+     * @var \SimpleXMLElement[]
+     */
+    protected $classes = null;
+
+    /**
+     * {@inheritDoc}
+     */
+    public function loadClassMetadata(ClassMetadata $metadata)
+    {
+        if (null === $this->classes) {
+            $this->classes = array();
+            $xml = $this->parseFile($this->file);
+
+            foreach ($xml->namespace as $namespace) {
+                $this->addNamespaceAlias((string) $namespace['prefix'], trim((string) $namespace));
+            }
+
+            foreach ($xml->class as $class) {
+                $this->classes[(string) $class['name']] = $class;
+            }
+        }
+
+        if (isset($this->classes[$metadata->getClassName()])) {
+            $xml = $this->classes[$metadata->getClassName()];
+
+            foreach ($xml->{'group-sequence-provider'} as $provider) {
+                $metadata->setGroupSequenceProvider(true);
+            }
+
+            foreach ($xml->{'group-sequence'} as $groupSequence) {
+                if (count($groupSequence->value) > 0) {
+                    $metadata->setGroupSequence($this->parseValues($groupSequence[0]->value));
+                }
+            }
+
+            foreach ($this->parseConstraints($xml->constraint) as $constraint) {
+                $metadata->addConstraint($constraint);
+            }
+
+            foreach ($xml->property as $property) {
+                foreach ($this->parseConstraints($property->constraint) as $constraint) {
+                    $metadata->addPropertyConstraint((string) $property['name'], $constraint);
+                }
+            }
+
+            foreach ($xml->getter as $getter) {
+                foreach ($this->parseConstraints($getter->constraint) as $constraint) {
+                    $metadata->addGetterConstraint((string) $getter['property'], $constraint);
+                }
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Parses a collection of "constraint" XML nodes.
+     *
+     * @param \SimpleXMLElement $nodes The XML nodes
+     *
+     * @return array The Constraint instances
+     */
+    protected function parseConstraints(\SimpleXMLElement $nodes)
+    {
+        $constraints = array();
+
+        foreach ($nodes as $node) {
+            if (count($node) > 0) {
+                if (count($node->value) > 0) {
+                    $options = $this->parseValues($node->value);
+                } elseif (count($node->constraint) > 0) {
+                    $options = $this->parseConstraints($node->constraint);
+                } elseif (count($node->option) > 0) {
+                    $options = $this->parseOptions($node->option);
+                } else {
+                    $options = array();
+                }
+            } elseif (strlen((string) $node) > 0) {
+                $options = trim($node);
+            } else {
+                $options = null;
+            }
+
+            $constraints[] = $this->newConstraint($node['name'], $options);
+        }
+
+        return $constraints;
+    }
+
+    /**
+     * Parses a collection of "value" XML nodes.
+     *
+     * @param \SimpleXMLElement $nodes The XML nodes
+     *
+     * @return array The values
+     */
+    protected function parseValues(\SimpleXMLElement $nodes)
+    {
+        $values = array();
+
+        foreach ($nodes as $node) {
+            if (count($node) > 0) {
+                if (count($node->value) > 0) {
+                    $value = $this->parseValues($node->value);
+                } elseif (count($node->constraint) > 0) {
+                    $value = $this->parseConstraints($node->constraint);
+                } else {
+                    $value = array();
+                }
+            } else {
+                $value = trim($node);
+            }
+
+            if (isset($node['key'])) {
+                $values[(string) $node['key']] = $value;
+            } else {
+                $values[] = $value;
+            }
+        }
+
+        return $values;
+    }
+
+    /**
+     * Parses a collection of "option" XML nodes.
+     *
+     * @param \SimpleXMLElement $nodes The XML nodes
+     *
+     * @return array The options
+     */
+    protected function parseOptions(\SimpleXMLElement $nodes)
+    {
+        $options = array();
+
+        foreach ($nodes as $node) {
+            if (count($node) > 0) {
+                if (count($node->value) > 0) {
+                    $value = $this->parseValues($node->value);
+                } elseif (count($node->constraint) > 0) {
+                    $value = $this->parseConstraints($node->constraint);
+                } else {
+                    $value = array();
+                }
+            } else {
+                $value = trim($node);
+            }
+
+            $options[(string) $node['name']] = $value;
+        }
+
+        return $options;
+    }
+
+    /**
+     * Parse a XML File.
+     *
+     * @param string $file Path of file
+     *
+     * @return SimpleXMLElement
+     *
+     * @throws MappingException
+     */
+    protected function parseFile($file)
+    {
+        $internalErrors = libxml_use_internal_errors(true);
+        $disableEntities = libxml_disable_entity_loader(true);
+        libxml_clear_errors();
+
+        $dom = new \DOMDocument();
+        $dom->validateOnParse = true;
+        if (!$dom->loadXML(file_get_contents($file), LIBXML_NONET | (defined('LIBXML_COMPACT') ? LIBXML_COMPACT : 0))) {
+            libxml_disable_entity_loader($disableEntities);
+
+            throw new MappingException(implode("\n", $this->getXmlErrors($internalErrors)));
+        }
+
+        libxml_disable_entity_loader($disableEntities);
+
+        if (!$dom->schemaValidate(__DIR__.'/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd')) {
+            throw new MappingException(implode("\n", $this->getXmlErrors($internalErrors)));
+        }
+
+        $dom->normalizeDocument();
+
+        libxml_use_internal_errors($internalErrors);
+
+        foreach ($dom->childNodes as $child) {
+            if ($child->nodeType === XML_DOCUMENT_TYPE_NODE) {
+                throw new MappingException('Document types are not allowed.');
+            }
+        }
+
+        return simplexml_import_dom($dom);
+    }
+
+    protected function getXmlErrors($internalErrors)
+    {
+        $errors = array();
+        foreach (libxml_get_errors() as $error) {
+            $errors[] = sprintf('[%s %s] %s (in %s - line %d, column %d)',
+                LIBXML_ERR_WARNING == $error->level ? 'WARNING' : 'ERROR',
+                $error->code,
+                trim($error->message),
+                $error->file ? $error->file : 'n/a',
+                $error->line,
+                $error->column
+            );
+        }
+
+        libxml_clear_errors();
+        libxml_use_internal_errors($internalErrors);
+
+        return $errors;
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/XmlFilesLoader.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/XmlFilesLoader.php
new file mode 100644
index 0000000..a4628cf
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/XmlFilesLoader.php
@@ -0,0 +1,30 @@
+<?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\Mapping\Loader;
+
+/**
+ * Loads multiple xml mapping files
+ *
+ * @author Bulat Shakirzyanov <mallluhuct@gmail.com>
+ *
+ * @see    Symfony\Component\Validator\Mapping\Loader\FilesLoader
+ */
+class XmlFilesLoader extends FilesLoader
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function getFileLoaderInstance($file)
+    {
+        return new XmlFileLoader($file);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/YamlFileLoader.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/YamlFileLoader.php
new file mode 100644
index 0000000..57fe2a5
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/YamlFileLoader.php
@@ -0,0 +1,129 @@
+<?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\Mapping\Loader;
+
+use Symfony\Component\Validator\Mapping\ClassMetadata;
+use Symfony\Component\Yaml\Yaml;
+
+class YamlFileLoader extends FileLoader
+{
+    /**
+     * An array of YAML class descriptions
+     *
+     * @var array
+     */
+    protected $classes = null;
+
+    /**
+     * {@inheritDoc}
+     */
+    public function loadClassMetadata(ClassMetadata $metadata)
+    {
+        if (null === $this->classes) {
+            $this->classes = Yaml::parse($this->file);
+
+            // empty file
+            if (null === $this->classes) {
+                return false;
+            }
+
+            // not an array
+            if (!is_array($this->classes)) {
+                throw new \InvalidArgumentException(sprintf('The file "%s" must contain a YAML array.', $this->file));
+            }
+
+            if (isset($this->classes['namespaces'])) {
+                foreach ($this->classes['namespaces'] as $alias => $namespace) {
+                    $this->addNamespaceAlias($alias, $namespace);
+                }
+
+                unset($this->classes['namespaces']);
+            }
+        }
+
+        // TODO validation
+
+        if (isset($this->classes[$metadata->getClassName()])) {
+            $yaml = $this->classes[$metadata->getClassName()];
+
+            if (isset($yaml['group_sequence_provider'])) {
+                $metadata->setGroupSequenceProvider((bool) $yaml['group_sequence_provider']);
+            }
+
+            if (isset($yaml['group_sequence'])) {
+                $metadata->setGroupSequence($yaml['group_sequence']);
+            }
+
+            if (isset($yaml['constraints']) && is_array($yaml['constraints'])) {
+                foreach ($this->parseNodes($yaml['constraints']) as $constraint) {
+                    $metadata->addConstraint($constraint);
+                }
+            }
+
+            if (isset($yaml['properties']) && is_array($yaml['properties'])) {
+                foreach ($yaml['properties'] as $property => $constraints) {
+                    if (null !== $constraints) {
+                        foreach ($this->parseNodes($constraints) as $constraint) {
+                            $metadata->addPropertyConstraint($property, $constraint);
+                        }
+                    }
+                }
+            }
+
+            if (isset($yaml['getters']) && is_array($yaml['getters'])) {
+                foreach ($yaml['getters'] as $getter => $constraints) {
+                    if (null !== $constraints) {
+                        foreach ($this->parseNodes($constraints) as $constraint) {
+                            $metadata->addGetterConstraint($getter, $constraint);
+                        }
+                    }
+                }
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Parses a collection of YAML nodes
+     *
+     * @param array $nodes The YAML nodes
+     *
+     * @return array An array of values or Constraint instances
+     */
+    protected function parseNodes(array $nodes)
+    {
+        $values = array();
+
+        foreach ($nodes as $name => $childNodes) {
+            if (is_numeric($name) && is_array($childNodes) && count($childNodes) == 1) {
+                $options = current($childNodes);
+
+                if (is_array($options)) {
+                    $options = $this->parseNodes($options);
+                }
+
+                $values[] = $this->newConstraint(key($childNodes), $options);
+            } else {
+                if (is_array($childNodes)) {
+                    $childNodes = $this->parseNodes($childNodes);
+                }
+
+                $values[$name] = $childNodes;
+            }
+        }
+
+        return $values;
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/YamlFilesLoader.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/YamlFilesLoader.php
new file mode 100644
index 0000000..bffface
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/YamlFilesLoader.php
@@ -0,0 +1,30 @@
+<?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\Mapping\Loader;
+
+/**
+ * Loads multiple yaml mapping files
+ *
+ * @author Bulat Shakirzyanov <mallluhuct@gmail.com>
+ *
+ * @see    Symfony\Component\Validator\Mapping\Loader\FilesLoader
+ */
+class YamlFilesLoader extends FilesLoader
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function getFileLoaderInstance($file)
+    {
+        return new YamlFileLoader($file);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd
new file mode 100644
index 0000000..1ca840b
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/Loader/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd
@@ -0,0 +1,160 @@
+<?xml version="1.0" ?>
+
+<xsd:schema xmlns="http://symfony.com/schema/dic/constraint-mapping"
+    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+    targetNamespace="http://symfony.com/schema/dic/constraint-mapping"
+    elementFormDefault="qualified">
+
+  <xsd:annotation>
+    <xsd:documentation><![CDATA[
+      Symfony Validator Constraint Mapping Schema, version 1.0
+      Authors: Bernhard Schussek
+
+      A constraint mapping connects classes, properties and getters with
+      validation constraints.
+    ]]></xsd:documentation>
+  </xsd:annotation>
+  
+  <xsd:element name="constraint-mapping" type="constraint-mapping" />
+  
+  <xsd:complexType name="constraint-mapping">
+    <xsd:annotation>
+      <xsd:documentation><![CDATA[
+        The root element of the constraint mapping definition.
+      ]]></xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="namespace" type="namespace" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="class" type="class" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+  
+  <xsd:complexType name="namespace">
+    <xsd:annotation>
+      <xsd:documentation><![CDATA[
+        Contains the abbreviation for a namespace.
+      ]]></xsd:documentation>
+    </xsd:annotation>
+    <xsd:simpleContent>
+      <xsd:extension base="xsd:string">
+        <xsd:attribute name="prefix" type="xsd:string" use="required" />
+      </xsd:extension>
+    </xsd:simpleContent>
+  </xsd:complexType>
+  
+  <xsd:complexType name="class">
+    <xsd:annotation>
+      <xsd:documentation><![CDATA[
+        Contains constraints for a single class.
+        
+        Nested elements may be class constraints, property and/or getter 
+        definitions.
+      ]]></xsd:documentation>
+    </xsd:annotation>
+    <xsd:choice minOccurs="0" maxOccurs="unbounded">
+      <xsd:element name="group-sequence-provider" type="group-sequence-provider" minOccurs="0" maxOccurs="1" />
+      <xsd:element name="group-sequence" type="group-sequence" minOccurs="0" maxOccurs="1" />
+      <xsd:element name="constraint" type="constraint" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="property" type="property" minOccurs="0" maxOccurs="unbounded" />
+      <xsd:element name="getter" type="getter" minOccurs="0" maxOccurs="unbounded" />
+    </xsd:choice>
+    <xsd:attribute name="name" type="xsd:string" use="required" />
+  </xsd:complexType>
+
+  <xsd:complexType name="group-sequence">
+    <xsd:annotation>
+      <xsd:documentation><![CDATA[
+        Contains the group sequence of a class. Each group should be written
+        into a "value" tag.
+      ]]></xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="value" type="value" minOccurs="1" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+  
+  <xsd:complexType name="group-sequence-provider">
+    <xsd:annotation>
+      <xsd:documentation><![CDATA[
+        Defines the name of the group sequence provider for a class.
+      ]]></xsd:documentation>
+    </xsd:annotation>
+  </xsd:complexType>
+  
+  <xsd:complexType name="property">
+    <xsd:annotation>
+      <xsd:documentation><![CDATA[
+        Contains constraints for a single property. The name of the property
+        should be given in the "name" option.
+      ]]></xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="constraint" type="constraint" maxOccurs="unbounded" />
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required" />
+  </xsd:complexType>
+  
+  <xsd:complexType name="getter">
+    <xsd:annotation>
+      <xsd:documentation><![CDATA[
+        Contains constraints for a getter method. The name of the corresponding
+        property should be given in the "property" option.
+      ]]></xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="constraint" type="constraint" maxOccurs="unbounded" />
+    </xsd:sequence>
+    <xsd:attribute name="property" type="xsd:string" use="required" />
+  </xsd:complexType>
+  
+  <xsd:complexType name="constraint" mixed="true">
+    <xsd:annotation>
+      <xsd:documentation><![CDATA[
+        Contains a constraint definition. The name of the constraint should be
+        given in the "name" option.
+        
+        May contain a single value, multiple "constraint" elements, 
+        multiple "value" elements or multiple "option" elements.
+      ]]></xsd:documentation>
+    </xsd:annotation>
+    <xsd:choice minOccurs="0">
+      <xsd:element name="constraint" type="constraint" minOccurs="1" maxOccurs="unbounded" />
+      <xsd:element name="option" type="option" minOccurs="1" maxOccurs="unbounded" />
+      <xsd:element name="value" type="value" minOccurs="1" maxOccurs="unbounded" />
+    </xsd:choice>
+    <xsd:attribute name="name" type="xsd:string" use="required" />    
+  </xsd:complexType>
+  
+  <xsd:complexType name="option" mixed="true">
+    <xsd:annotation>
+      <xsd:documentation><![CDATA[
+        Contains a constraint option definition. The name of the option
+        should be given in the "name" option.
+        
+        May contain a single value, multiple "value" elements or multiple
+        "constraint" elements.
+      ]]></xsd:documentation>
+    </xsd:annotation>
+    <xsd:choice minOccurs="0">
+      <xsd:element name="constraint" type="constraint" minOccurs="1" maxOccurs="unbounded" />
+      <xsd:element name="value" type="value" minOccurs="1" maxOccurs="unbounded" />
+    </xsd:choice>
+    <xsd:attribute name="name" type="xsd:string" use="required" />  
+  </xsd:complexType>
+  
+  <xsd:complexType name="value" mixed="true">
+    <xsd:annotation>
+      <xsd:documentation><![CDATA[
+        A value of an element.
+        
+        May contain a single value, multiple "value" elements or multiple
+        "constraint" elements.
+      ]]></xsd:documentation>
+    </xsd:annotation>
+    <xsd:choice minOccurs="0">
+      <xsd:element name="constraint" type="constraint" minOccurs="1" maxOccurs="unbounded" />
+      <xsd:element name="value" type="value" minOccurs="1" maxOccurs="unbounded" />
+    </xsd:choice>
+    <xsd:attribute name="key" type="xsd:string" use="optional" /> 
+  </xsd:complexType>
+</xsd:schema>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/MemberMetadata.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/MemberMetadata.php
new file mode 100644
index 0000000..7db22a8
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/MemberMetadata.php
@@ -0,0 +1,220 @@
+<?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\Mapping;
+
+use Symfony\Component\Validator\ValidationVisitorInterface;
+use Symfony\Component\Validator\ClassBasedInterface;
+use Symfony\Component\Validator\PropertyMetadataInterface;
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\Constraints\Valid;
+use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
+
+abstract class MemberMetadata extends ElementMetadata implements PropertyMetadataInterface, ClassBasedInterface
+{
+    public $class;
+    public $name;
+    public $property;
+    public $cascaded = false;
+    public $collectionCascaded = false;
+    public $collectionCascadedDeeply = false;
+    private $reflMember;
+
+    /**
+     * 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
+     */
+    public function __construct($class, $name, $property)
+    {
+        $this->class = $class;
+        $this->name = $name;
+        $this->property = $property;
+    }
+
+    public function accept(ValidationVisitorInterface $visitor, $value, $group, $propertyPath, $propagatedGroup = null)
+    {
+        $visitor->visit($this, $value, $group, $propertyPath);
+
+        if ($this->isCascaded()) {
+            $visitor->validate($value, $propagatedGroup ?: $group, $propertyPath, $this->isCollectionCascaded(), $this->isCollectionCascadedDeeply());
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function addConstraint(Constraint $constraint)
+    {
+        if (!in_array(Constraint::PROPERTY_CONSTRAINT, (array) $constraint->getTargets())) {
+            throw new ConstraintDefinitionException(sprintf(
+                'The constraint %s cannot be put on properties or getters',
+                get_class($constraint)
+            ));
+        }
+
+        if ($constraint instanceof Valid) {
+            $this->cascaded = true;
+            /* @var Valid $constraint */
+            $this->collectionCascaded = $constraint->traverse;
+            $this->collectionCascadedDeeply = $constraint->deep;
+        } else {
+            parent::addConstraint($constraint);
+        }
+
+        return $this;
+    }
+
+    /**
+     * Returns the names of the properties that should be serialized
+     *
+     * @return array
+     */
+    public function __sleep()
+    {
+        return array_merge(parent::__sleep(), array(
+            'class',
+            'name',
+            'property',
+            'cascaded', // TESTME
+        ));
+    }
+
+    /**
+     * Returns the name of the member
+     *
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Returns the class this member is defined on
+     *
+     * @return string
+     */
+    public function getClassName()
+    {
+        return $this->class;
+    }
+
+    /**
+     * Returns the name of the property this member belongs to
+     *
+     * @return string The property name
+     */
+    public function getPropertyName()
+    {
+        return $this->property;
+    }
+
+    /**
+     * Returns whether this member is public
+     *
+     * @return Boolean
+     */
+    public function isPublic()
+    {
+        return $this->getReflectionMember()->isPublic();
+    }
+
+    /**
+     * Returns whether this member is protected
+     *
+     * @return Boolean
+     */
+    public function isProtected()
+    {
+        return $this->getReflectionMember()->isProtected();
+    }
+
+    /**
+     * Returns whether this member is private
+     *
+     * @return Boolean
+     */
+    public function isPrivate()
+    {
+        return $this->getReflectionMember()->isPrivate();
+    }
+
+    /**
+     * Returns whether objects stored in this member should be validated
+     *
+     * @return Boolean
+     */
+    public function isCascaded()
+    {
+        return $this->cascaded;
+    }
+
+    /**
+     * Returns whether arrays or traversable objects stored in this member
+     * should be traversed and validated in each entry
+     *
+     * @return Boolean
+     */
+    public function isCollectionCascaded()
+    {
+        return $this->collectionCascaded;
+    }
+
+    /**
+     * Returns whether arrays or traversable objects stored in this member
+     * should be traversed recursively for inner arrays/traversable objects
+     *
+     * @return Boolean
+     */
+    public function isCollectionCascadedDeeply()
+    {
+        return $this->collectionCascadedDeeply;
+    }
+
+    /**
+     * Returns the value of this property in the given object
+     *
+     * @param object $object The object
+     *
+     * @return mixed The property value
+     *
+     * @deprecated Deprecated since version 2.2, to be removed in 2.3. Use the
+     *             method {@link getPropertyValue} instead.
+     */
+    public function getValue($object)
+    {
+        return $this->getPropertyValue($object);
+    }
+
+    /**
+     * Returns the Reflection instance of the member
+     *
+     * @return object
+     */
+    public function getReflectionMember()
+    {
+        if (!$this->reflMember) {
+            $this->reflMember = $this->newReflectionMember();
+        }
+
+        return $this->reflMember;
+    }
+
+    /**
+     * Creates a new Reflection instance for the member
+     *
+     * @return object
+     */
+    abstract protected function newReflectionMember();
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/PropertyMetadata.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/PropertyMetadata.php
new file mode 100644
index 0000000..caa7b6e
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Mapping/PropertyMetadata.php
@@ -0,0 +1,51 @@
+<?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\Mapping;
+
+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
+     */
+    public function __construct($class, $name)
+    {
+        if (!property_exists($class, $name)) {
+            throw new ValidatorException(sprintf('Property %s does not exist in class %s', $name, $class));
+        }
+
+        parent::__construct($class, $name, $name);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getPropertyValue($object)
+    {
+        return $this->getReflectionMember()->getValue($object);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function newReflectionMember()
+    {
+        $member = new \ReflectionProperty($this->getClassName(), $this->getName());
+        $member->setAccessible(true);
+
+        return $member;
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/MetadataFactoryInterface.php b/core/vendor/symfony/validator/Symfony/Component/Validator/MetadataFactoryInterface.php
new file mode 100644
index 0000000..6dbab06
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/MetadataFactoryInterface.php
@@ -0,0 +1,40 @@
+<?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;
+
+/**
+ * Returns {@link MetadataInterface} instances for values.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+interface MetadataFactoryInterface
+{
+    /**
+     * Returns the metadata for the given value.
+     *
+     * @param mixed $value Some value.
+     *
+     * @return MetadataInterface The metadata for the value.
+     *
+     * @throws Exception\NoSuchMetadataException If no metadata exists for the value.
+     */
+    public function getMetadataFor($value);
+
+    /**
+     * Returns whether metadata exists for the given value.
+     *
+     * @param mixed $value Some value.
+     *
+     * @return Boolean Whether metadata exists for the value.
+     */
+    public function hasMetadataFor($value);
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/MetadataInterface.php b/core/vendor/symfony/validator/Symfony/Component/Validator/MetadataInterface.php
new file mode 100644
index 0000000..a5d6504
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/MetadataInterface.php
@@ -0,0 +1,68 @@
+<?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;
+
+/**
+ * A container for validation metadata.
+ *
+ * The container contains constraints that may belong to different validation
+ * groups. Constraints for a specific group can be fetched by calling
+ * {@link findConstraints}.
+ *
+ * Implement this interface to add validation metadata to your own metadata
+ * layer. Each metadata may have named properties. Each property can be
+ * represented by one or more {@link PropertyMetadataInterface} instances that
+ * are returned by {@link getPropertyMetadata}. Since
+ * <tt>PropertyMetadataInterface</tt> inherits from <tt>MetadataInterface</tt>,
+ * each property may be divided into further properties.
+ *
+ * The {@link accept} method of each metadata implements the Visitor pattern.
+ * The method should forward the call to the visitor's
+ * {@link ValidationVisitorInterface::visit} method and additionally call
+ * <tt>accept()</tt> on all structurally related metadata instances.
+ *
+ * For example, to store constraints for PHP classes and their properties,
+ * create a class <tt>ClassMetadata</tt> (implementing <tt>MetadataInterface</tt>)
+ * and a class <tt>PropertyMetadata</tt> (implementing <tt>PropertyMetadataInterface</tt>).
+ * <tt>ClassMetadata::getPropertyMetadata($property)</tt> returns all
+ * <tt>PropertyMetadata</tt> instances for a property of that class. Its
+ * <tt>accept()</tt>-method simply forwards to <tt>ValidationVisitorInterface::visit()</tt>
+ * and calls <tt>accept()</tt> on all contained <tt>PropertyMetadata</tt>
+ * instances, which themselves call <tt>ValidationVisitorInterface::visit()</tt>
+ * again.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+interface MetadataInterface
+{
+    /**
+     * Implementation of the Visitor design pattern.
+     *
+     * Calls {@link ValidationVisitorInterface::visit} and then forwards the
+     * <tt>accept()</tt>-call to all property metadata instances.
+     *
+     * @param ValidationVisitorInterface $visitor      The visitor implementing the validation logic.
+     * @param mixed                      $value        The value to validate.
+     * @param string|string[]            $group        The validation group to validate in.
+     * @param string                     $propertyPath The current property path in the validation graph.
+     */
+    public function accept(ValidationVisitorInterface $visitor, $value, $group, $propertyPath);
+
+    /**
+     * Returns all constraints for a given validation group.
+     *
+     * @param string $group The validation group.
+     *
+     * @return Constraint[] A list of constraint instances.
+     */
+    public function findConstraints($group);
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/ObjectInitializerInterface.php b/core/vendor/symfony/validator/Symfony/Component/Validator/ObjectInitializerInterface.php
new file mode 100644
index 0000000..0426bc8
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/ObjectInitializerInterface.php
@@ -0,0 +1,35 @@
+<?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;
+
+/**
+ * Prepares an object for validation.
+ *
+ * Concrete implementations of this interface are used by {@link ValidationVisitorInterface}
+ * to initialize objects just before validating them.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+interface ObjectInitializerInterface
+{
+    /**
+     * Initializes an object just before validation.
+     *
+     * @param object $object The object to validate
+     *
+     * @api
+     */
+    public function initialize($object);
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/PropertyMetadataContainerInterface.php b/core/vendor/symfony/validator/Symfony/Component/Validator/PropertyMetadataContainerInterface.php
new file mode 100644
index 0000000..33db49e
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/PropertyMetadataContainerInterface.php
@@ -0,0 +1,33 @@
+<?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;
+
+/**
+ * A container for {@link PropertyMetadataInterface} instances.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+interface PropertyMetadataContainerInterface
+{
+    /**
+     * Returns all metadata instances for the given named property.
+     *
+     * If your implementation does not support properties, simply throw an
+     * exception in this method (for example a <tt>BadMethodCallException</tt>).
+     *
+     * @param string $property The property name.
+     *
+     * @return PropertyMetadataInterface[] A list of metadata instances. Empty if
+     *                                     no metadata exists for the property.
+     */
+    public function getPropertyMetadata($property);
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/PropertyMetadataInterface.php b/core/vendor/symfony/validator/Symfony/Component/Validator/PropertyMetadataInterface.php
new file mode 100644
index 0000000..eaac1a7
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/PropertyMetadataInterface.php
@@ -0,0 +1,44 @@
+<?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;
+
+/**
+ * A container for validation metadata of a property.
+ *
+ * What exactly you define as "property" is up to you. The validator expects
+ * implementations of {@link MetadataInterface} that contain constraints and
+ * optionally a list of named properties that also have constraints (and may
+ * have further sub properties). Such properties are mapped by implementations
+ * of this interface.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @see MetadataInterface
+ */
+interface PropertyMetadataInterface extends MetadataInterface
+{
+    /**
+     * Returns the name of the property.
+     *
+     * @return string The property name.
+     */
+    public function getPropertyName();
+
+    /**
+     * Extracts the value of the property from the given container.
+     *
+     * @param mixed $containingValue The container to extract the property value from.
+     *
+     * @return mixed The value of the property.
+     */
+    public function getPropertyValue($containingValue);
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/README.md b/core/vendor/symfony/validator/Symfony/Component/Validator/README.md
new file mode 100644
index 0000000..f1b2556
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/README.md
@@ -0,0 +1,120 @@
+Validator Component
+===================
+
+This component is based on the JSR-303 Bean Validation specification and
+enables specifying validation rules for classes using XML, YAML, PHP or
+annotations, which can then be checked against instances of these classes.
+
+Usage
+-----
+
+The component provides "validation constraints", which are simple objects
+containing the rules for the validation. Let's validate a simple string
+as an example:
+
+    use Symfony\Component\Validator\Validation;
+    use Symfony\Component\Validator\Constraints\Length;
+
+    $validator = Validation::createValidator();
+
+    $violations = $validator->validateValue('Bernhard', new Length(array('min' => 10)));
+
+This validation will fail because the given string is shorter than ten
+characters. The precise errors, here called "constraint violations",  are
+returned by the validator. You can analyze these or return them to the user.
+If the violation list is empty, validation succeeded.
+
+Validation of arrays is possible using the `Collection` constraint:
+
+    use Symfony\Component\Validator\Validation;
+    use Symfony\Component\Validator\Constraints as Assert;
+
+    $validator = Validation::createValidator();
+
+    $constraint = new Assert\Collection(array(
+        'name' => new Assert\Collection(array(
+            'first_name' => new Assert\Length(array('min' => 101)),
+            'last_name'  => new Assert\Length(array('min' => 1)),
+        )),
+        'email'    => new Assert\Email(),
+        'simple'   => new Assert\Length(array('min' => 102)),
+        'gender'   => new Assert\Choice(array(3, 4)),
+        'file'     => new Assert\File(),
+        'password' => new Assert\Length(array('min' => 60)),
+    ));
+
+    $violations = $validator->validateValue($input, $constraint);
+
+Again, the validator returns the list of violations.
+
+Validation of objects is possible using "constraint mapping". With such
+a mapping you can put constraints onto properties and objects of classes.
+Whenever an object of this class is validated, its properties and
+method results are matched against the constraints.
+
+    use Symfony\Component\Validator\Validation;
+    use Symfony\Component\Validator\Constraints as Assert;
+
+    class User
+    {
+        /**
+         * @Assert\Length(min = 3)
+         * @Assert\NotBlank
+         */
+        private $name;
+
+        /**
+         * @Assert\Email
+         * @Assert\NotBlank
+         */
+        private $email;
+
+        public function __construct($name, $email)
+        {
+            $this->name = $name;
+            $this->email = $email;
+        }
+
+        /**
+         * @Assert\True(message = "The user should have a Google Mail account")
+         */
+        public function isGmailUser()
+        {
+            return false !== strpos($this->email, '@gmail.com');
+        }
+    }
+
+    $validator = Validation::createValidatorBuilder()
+        ->enableAnnotationMapping()
+        ->getValidator();
+
+    $user = new User('John Doe', 'john@example.com');
+
+    $violations = $validator->validate($user);
+
+This example uses the annotation support of Doctrine Common to
+map constraints to properties and methods. You can also map constraints
+using XML, YAML or plain PHP, if you dislike annotations or don't want
+to include Doctrine. Check the documentation for more information about
+these drivers.
+
+Resources
+---------
+
+Silex integration:
+
+https://github.com/fabpot/Silex/blob/master/src/Silex/Provider/ValidatorServiceProvider.php
+
+Documentation:
+
+http://symfony.com/doc/2.0/book/validation.html
+
+JSR-303 Specification:
+
+http://jcp.org/en/jsr/detail?id=303
+
+You can run the unit tests with the following command:
+
+    $ cd path/to/Symfony/Component/Validator/
+    $ composer.phar install --dev
+    $ phpunit
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.bg.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.bg.xlf
new file mode 100644
index 0000000..48aa79a
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.bg.xlf
@@ -0,0 +1,219 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>Ð¡Ñ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ñ‚Ð° Ñ‚Ñ€ÑÐ±Ð²Ð° Ð´Ð° Ð±ÑŠÐ´Ðµ Ð»ÑŠÐ¶Ð° (false).</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>Ð¡Ñ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ñ‚Ð° Ñ‚Ñ€ÑÐ±Ð²Ð° Ð´Ð° Ð±ÑŠÐ´Ðµ Ð¸ÑÑ‚Ð¸Ð½Ð° (true).</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>Ð¡Ñ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ñ‚Ð° Ñ‚Ñ€ÑÐ±Ð²Ð° Ð´Ð° Ð±ÑŠÐ´Ðµ Ð¾Ñ‚ Ñ‚Ð¸Ð¿ {{ type }}.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>Ð¡Ñ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ñ‚Ð° Ñ‚Ñ€ÑÐ±Ð²Ð° Ð´Ð° Ð±ÑŠÐ´Ðµ Ð¿Ñ€Ð°Ð·Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>Ð˜Ð·Ð±Ñ€Ð°Ð½Ð°Ñ‚Ð° ÑÑ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚ Ðµ Ð½ÐµÐ²Ð°Ð»Ð¸Ð´Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>Ð¢Ñ€ÑÐ±Ð²Ð° Ð´Ð° Ð¸Ð·Ð±ÐµÑ€ÐµÑ‚Ðµ Ð¼Ð¸Ð½Ð¸Ð¼ÑƒÐ¼ {{ limit }} Ð¾Ð¿Ñ†Ð¸Ñ.|Ð¢Ñ€ÑÐ±Ð²Ð° Ð´Ð° Ð¸Ð·Ð±ÐµÑ€ÐµÑ‚Ðµ Ð¼Ð¸Ð½Ð¸Ð¼ÑƒÐ¼ {{ limit }} Ð¾Ð¿Ñ†Ð¸Ð¸.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>Ð¢Ñ€ÑÐ±Ð²Ð° Ð´Ð° Ð¸Ð·Ð±ÐµÑ€ÐµÑ‚Ðµ Ð¼Ð°ÐºÑÐ¸Ð¼ÑƒÐ¼ {{ limit }} Ð¾Ð¿Ñ†Ð¸Ñ.|Ð¢Ñ€ÑÐ±Ð²Ð° Ð´Ð° Ð¸Ð·Ð±ÐµÑ€ÐµÑ‚Ðµ Ð¼Ð°ÐºÑÐ¸Ð¼ÑƒÐ¼ {{ limit }} Ð¾Ð¿Ñ†Ð¸Ð¸.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>Ð•Ð´Ð½Ð° Ð¸Ð»Ð¸ Ð¿Ð¾Ð²ÐµÑ‡Ðµ Ð¾Ñ‚ Ð·Ð°Ð´Ð°Ð´ÐµÐ½Ð¸Ñ‚Ðµ ÑÑ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ð¸ Ðµ Ð½ÐµÐ²Ð°Ð»Ð¸Ð´Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>ÐŸÐ¾Ð»ÐµÑ‚Ð°Ñ‚Ð° {{ fields }} Ð½Ðµ Ð±ÑÑ…Ð° Ð¾Ñ‡Ð°ÐºÐ²Ð°Ð½Ð¸.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>ÐŸÐ¾Ð»ÐµÑ‚Ð°Ñ‚Ð° {{ fields }} Ð»Ð¸Ð¿ÑÐ²Ð°Ñ‚.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>Ð¡Ñ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ñ‚Ð° Ð½Ðµ Ðµ Ð²Ð°Ð»Ð¸Ð´Ð½Ð° Ð´Ð°Ñ‚Ð° (date).</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>Ð¡Ñ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ñ‚Ð° Ð½Ðµ Ðµ Ð²Ð°Ð»Ð¸Ð´Ð½Ð° Ð´Ð°Ñ‚Ð° (datetime).</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>Ð¡Ñ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ñ‚Ð° Ð½Ðµ Ðµ Ð²Ð°Ð»Ð¸Ð´ÐµÐ½ email Ð°Ð´Ñ€ÐµÑ.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>Ð¤Ð°Ð¹Ð»ÑŠÑ‚ Ð½Ðµ Ð±ÐµÑˆÐµ Ð¾Ñ‚ÐºÑ€Ð¸Ñ‚.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>Ð¤Ð°Ð¹Ð»ÑŠÑ‚ Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±ÑŠÐ´Ðµ Ð¿Ñ€Ð¾Ñ‡ÐµÑ‚ÐµÐ½.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Ð¤Ð°Ð¹Ð»ÑŠÑ‚ Ðµ Ñ‚Ð²ÑŠÑ€Ð´Ðµ Ð³Ð¾Ð»ÑÐ¼ ({{ size }} {{ suffix }}). ÐœÐ°ÐºÑÐ¸Ð¼Ð°Ð»Ð½Ð¸ÑÑ‚ Ñ€Ð°Ð·Ð¼ÐµÑ€ Ðµ {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>ÐœÐ°Ð¹Ð¼ Ñ‚Ð¸Ð¿Ð° Ð½Ð° Ñ„Ð°Ð¹Ð»Ð° Ðµ Ð½ÐµÐ²Ð°Ð»Ð¸Ð´ÐµÐ½ ({{ type }}). Ð Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸ Ð¼Ð°Ð¹Ð¼ Ñ‚Ð¸Ð¿Ð¾Ð²Ðµ ÑÐ° {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>Ð¡Ñ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ñ‚Ð° Ñ‚Ñ€ÑÐ±Ð²Ð° Ð´Ð° Ð±ÑŠÐ´Ðµ {{ limit }} Ð¸Ð»Ð¸ Ð¿Ð¾-Ð¼Ð°Ð»ÐºÐ¾.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>Ð¡Ñ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ñ‚Ð° Ðµ Ñ‚Ð²ÑŠÑ€Ð´Ðµ Ð´ÑŠÐ»Ð³Ð°. Ð¢Ñ€ÑÐ±Ð²Ð° Ð´Ð° ÑÑŠÐ´ÑŠÑ€Ð¶Ð° {{ limit }} Ð¸Ð»Ð¸ Ð¿Ð¾-Ð¼Ð°Ð»ÐºÐ¾ ÑÐ¸Ð¼Ð²Ð¾Ð»Ð°.|Ð¡Ñ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ñ‚Ð° Ðµ Ñ‚Ð²ÑŠÑ€Ð´Ðµ Ð´ÑŠÐ»Ð³Ð°. Ð¢Ñ€ÑÐ±Ð²Ð° Ð´Ð° ÑÑŠÐ´ÑŠÑ€Ð¶Ð° {{ limit }} Ð¸Ð»Ð¸ Ð¿Ð¾-Ð¼Ð°Ð»ÐºÐ¾ ÑÐ¸Ð¼Ð²Ð¾Ð»Ð°.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>Ð¡Ñ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ñ‚Ð° Ñ‚Ñ€ÑÐ±Ð²Ð° Ð´Ð° Ð±ÑŠÐ´Ðµ {{ limit }} Ð¸Ð»Ð¸ Ð¿Ð¾Ð²ÐµÑ‡Ðµ.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>Ð¡Ñ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ñ‚Ð° Ðµ Ñ‚Ð²ÑŠÑ€Ð´Ðµ ÐºÑ€Ð°Ñ‚ÐºÐ°. Ð¢Ñ€ÑÐ±Ð²Ð° Ð´Ð° Ð±ÑŠÐ´Ðµ {{ limit }} Ð¸Ð»Ð¸ Ð¿Ð¾Ð²ÐµÑ‡Ðµ ÑÐ¸Ð¼Ð²Ð¾Ð»Ð°.|Ð¡Ñ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ñ‚Ð° Ðµ Ñ‚Ð²ÑŠÑ€Ð´Ðµ ÐºÑ€Ð°Ñ‚ÐºÐ°. Ð¢Ñ€ÑÐ±Ð²Ð° Ð´Ð° Ð±ÑŠÐ´Ðµ {{ limit }} Ð¸Ð»Ð¸ Ð¿Ð¾Ð²ÐµÑ‡Ðµ ÑÐ¸Ð¼Ð²Ð¾Ð»Ð°.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>Ð¡Ñ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ñ‚Ð° Ð½Ðµ Ñ‚Ñ€ÑÐ±Ð²Ð° Ð´Ð° Ð±ÑŠÐ´Ðµ Ð¿Ñ€Ð°Ð·Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>Ð¡Ñ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ñ‚Ð° Ð½Ðµ Ñ‚Ñ€ÑÐ±Ð²Ð° Ð´Ð° Ð±ÑŠÐ´Ðµ null.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>Ð¡Ñ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ñ‚Ð° Ñ‚Ñ€ÑÐ±Ð²Ð° Ð´Ð° Ð±ÑŠÐ´Ðµ null.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>Ð¡Ñ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ñ‚Ð° Ð½Ðµ Ðµ Ð²Ð°Ð»Ð¸Ð´Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>Ð¡Ñ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ñ‚Ð° Ð½Ðµ Ðµ Ð²Ð°Ð»Ð¸Ð´Ð½Ð¾ Ð²Ñ€ÐµÐ¼Ðµ (time).</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>Ð¡Ñ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ñ‚Ð° Ð½Ðµ Ðµ Ð²Ð°Ð»Ð¸Ð´ÐµÐ½ URL.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>Ð”Ð²ÐµÑ‚Ðµ ÑÑ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ð¸ Ñ‚Ñ€ÑÐ±Ð²Ð° Ð´Ð° Ð±ÑŠÐ´Ð°Ñ‚ Ñ€Ð°Ð²Ð½Ð¸.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Ð¤Ð°Ð¹Ð»ÑŠÑ‚ Ðµ Ñ‚Ð²ÑŠÑ€Ð´Ðµ Ð³Ð¾Ð»ÑÐ¼. Ð Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸ÑÑ‚ Ð¼Ð°ÐºÑÐ¸Ð¼Ð°Ð»ÐµÐ½ Ñ€Ð°Ð·Ð¼ÐµÑ€ Ðµ {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>Ð¤Ð°Ð¹Ð»ÑŠÑ‚ Ðµ Ñ‚Ð²ÑŠÑ€Ð´Ðµ Ð³Ð¾Ð»ÑÐ¼.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>Ð¤Ð°Ð¹Ð»ÑŠÑ‚ Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±ÑŠÐ´Ðµ ÐºÐ°Ñ‡ÐµÐ½.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>Ð¡Ñ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ñ‚Ð° Ñ‚Ñ€ÑÐ±Ð²Ð° Ð´Ð° Ð±ÑŠÐ´Ðµ Ð²Ð°Ð»Ð¸Ð´ÐµÐ½ Ð½Ð¾Ð¼ÐµÑ€.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This file is not a valid image.</source>
+                <target>Ð¤Ð°Ð¹Ð»ÑŠÑ‚ Ð½Ðµ Ðµ Ð²Ð°Ð»Ð¸Ð´Ð½Ð¾ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ðµ.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This is not a valid IP address.</source>
+                <target>Ð¢Ð¾Ð²Ð° Ð½Ðµ Ðµ Ð²Ð°Ð»Ð¸Ð´ÐµÐ½ IP Ð°Ð´Ñ€ÐµÑ.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This value is not a valid language.</source>
+                <target>Ð¡Ñ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ñ‚Ð° Ð½Ðµ Ðµ Ð²Ð°Ð»Ð¸Ð´ÐµÐ½ ÐµÐ·Ð¸Ðº.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid locale.</source>
+                <target>Ð¡Ñ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ñ‚Ð° Ð½Ðµ Ðµ Ð²Ð°Ð»Ð¸Ð´Ð½Ð° Ð»Ð¾ÐºÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ.</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid country.</source>
+                <target>Ð¡Ñ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ñ‚Ð° Ð½Ðµ Ðµ Ð²Ð°Ð»Ð¸Ð´Ð½Ð° Ð´ÑŠÑ€Ð¶Ð°Ð²Ð°.</target>
+            </trans-unit>
+            <trans-unit id="41">
+                <source>This value is already used.</source>
+                <target>Ð¡Ñ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ñ‚Ð° Ð²ÐµÑ‡Ðµ Ðµ Ð² ÑƒÐ¿Ð¾Ñ‚Ñ€ÐµÐ±Ð°.</target>
+            </trans-unit>
+            <trans-unit id="42">
+                <source>The size of the image could not be detected.</source>
+                <target>Ð Ð°Ð·Ð¼ÐµÑ€Ð° Ð½Ð° Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸ÐµÑ‚Ð¾ Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±ÑŠÐ´Ðµ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½.</target>
+            </trans-unit>
+            <trans-unit id="43">
+                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
+                <target>Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸ÐµÑ‚Ð¾ Ðµ Ñ‚Ð²ÑŠÑ€Ð´Ðµ ÑˆÐ¸Ñ€Ð¾ÐºÐ¾ ({{ width }}px). Ð¨Ð¸Ñ€Ð¾Ñ‡Ð¸Ð½Ð°Ñ‚Ð° Ñ‚Ñ€ÑÐ±Ð²Ð° Ð´Ð° Ð±ÑŠÐ´Ðµ Ð¼Ð°ÐºÑÐ¸Ð¼ÑƒÐ¼ {{ max_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="44">
+                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
+                <target>Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸ÐµÑ‚Ð¾ Ðµ Ñ Ñ‚Ð²ÑŠÑ€Ð´Ðµ Ð¼Ð°Ð»ÐºÐ° ÑˆÐ¸Ñ€Ð¾Ñ‡Ð¸Ð½Ð° ({{ width }}px). Ð¨Ð¸Ñ€Ð¾Ñ‡Ð¸Ð½Ð°Ñ‚Ð° Ñ‚Ñ€ÑÐ±Ð²Ð° Ð´Ð° Ð±ÑŠÐ´Ðµ Ð¼Ð¸Ð½Ð¸Ð¼ÑƒÐ¼ {{ min_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="45">
+                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
+                <target>Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸ÐµÑ‚Ð¾ Ðµ Ñ Ñ‚Ð²ÑŠÑ€Ð´Ðµ Ð³Ð¾Ð»ÑÐ¼Ð° Ð²Ð¸ÑÐ¾Ñ‡Ð¸Ð½Ð° ({{ height }}px). Ð’Ð¸ÑÐ¾Ñ‡Ð¸Ð½Ð°Ñ‚Ð° Ñ‚Ñ€ÑÐ±Ð²Ð° Ð´Ð° Ð±ÑŠÐ´Ðµ Ð¼Ð°ÐºÑÐ¸Ð¼ÑƒÐ¼ {{ max_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="46">
+                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
+                <target>Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸ÐµÑ‚Ð¾ Ðµ Ñ Ñ‚Ð²ÑŠÑ€Ð´Ðµ Ð¼Ð°Ð»ÐºÐ° Ð²Ð¸ÑÐ¾Ñ‡Ð¸Ð½Ð° ({{ height }}px). Ð’Ð¸ÑÐ¾Ñ‡Ð¸Ð½Ð° Ñ‚Ñ€ÑÐ±Ð²Ð° Ð´Ð° Ð±ÑŠÐ´Ðµ Ð¼Ð¸Ð½Ð¸Ð¼ÑƒÐ¼ {{ min_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="47">
+                <source>This value should be the user current password.</source>
+                <target>Ð¡Ñ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ñ‚Ð° Ñ‚Ñ€ÑÐ±Ð²Ð° Ð´Ð° Ð±ÑŠÐ´Ðµ Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ‚Ð° Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»ÑÐºÐ° Ð¿Ð°Ñ€Ð¾Ð»Ð°.</target>
+            </trans-unit>
+            <trans-unit id="48">
+                <source>This value should have exactly {{ limit }} characters.</source>
+                <target>Ð¡Ñ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ñ‚Ð° Ñ‚Ñ€ÑÐ±Ð²Ð° Ð´Ð° Ð±ÑŠÐ´Ðµ Ñ‚Ð¾Ñ‡Ð½Ð¾ {{ limit }} ÑÐ¸Ð¼Ð²Ð¾Ð»Ð°.|Ð¡Ñ‚Ð¾Ð¹Ð½Ð¾ÑÑ‚Ñ‚Ð° Ñ‚Ñ€ÑÐ±Ð²Ð° Ð´Ð° Ð±ÑŠÐ´Ðµ Ñ‚Ð¾Ñ‡Ð½Ð¾ {{ limit }} ÑÐ¸Ð¼Ð²Ð¾Ð»Ð°.</target>
+            </trans-unit>
+            <trans-unit id="49">
+                <source>The file was only partially uploaded.</source>
+                <target>Ð¤Ð°Ð¹Ð»ÑŠÑ‚ Ðµ ÐºÐ°Ñ‡ÐµÐ½ Ñ‡Ð°ÑÑ‚Ð¸Ñ‡Ð½Ð¾.</target>
+            </trans-unit>
+            <trans-unit id="50">
+                <source>No file was uploaded.</source>
+                <target>Ð¤Ð°Ð¹Ð»ÑŠÑ‚ Ð½Ðµ Ð±ÐµÑˆÐµ ÐºÐ°Ñ‡ÐµÐ½.</target>
+            </trans-unit>
+            <trans-unit id="51">
+                <source>No temporary folder was configured in php.ini.</source>
+                <target>ÐÐµ Ðµ Ð¿Ð¾ÑÐ¾Ñ‡ÐµÐ½Ð° Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð·Ð° Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¸ Ñ„Ð°Ð¹Ð»Ð¾Ð²Ðµ Ð² php.ini.</target>
+            </trans-unit>
+            <trans-unit id="52">
+                <source>Cannot write temporary file to disk.</source>
+                <target>ÐÐµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð·Ð°Ð¿Ð¸ÑˆÐµ Ð²Ñ€ÐµÐ¼ÐµÐ½ÐµÐ½ Ñ„Ð°Ð¹Ð» Ð½Ð° Ð´Ð¸ÑÐºÐ°.</target>
+            </trans-unit>
+            <trans-unit id="53">
+                <source>A PHP extension caused the upload to fail.</source>
+                <target>PHP Ñ€Ð°Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð¸Ðµ Ð¿Ñ€ÐµÐ´Ð¸Ð·Ð²Ð¸ÐºÐ° Ð¿Ñ€ÐµÐºÑŠÑÐ²Ð°Ð½Ðµ Ð½Ð° ÐºÐ°Ñ‡Ð²Ð°Ð½ÐµÑ‚Ð¾.</target>
+            </trans-unit>
+            <trans-unit id="54">
+                <source>This collection should contain {{ limit }} elements or more.</source>
+                <target>ÐšÐ¾Ð»ÐµÐºÑ†Ð¸ÑÑ‚Ð° Ñ‚Ñ€ÑÐ±Ð²Ð° Ð´Ð° ÑÑŠÐ´ÑŠÑ€Ð¶Ð° {{ limit }} Ð¸Ð»Ð¸ Ð¿Ð¾Ð²ÐµÑ‡Ðµ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚.|ÐšÐ¾Ð»ÐµÐºÑ†Ð¸ÑÑ‚Ð° Ñ‚Ñ€ÑÐ±Ð²Ð° Ð´Ð° ÑÑŠÐ´ÑŠÑ€Ð¶Ð° {{ limit }} Ð¸Ð»Ð¸ Ð¿Ð¾Ð²ÐµÑ‡Ðµ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚Ð°.</target>
+            </trans-unit>
+            <trans-unit id="55">
+                <source>This collection should contain {{ limit }} elements or less.</source>
+                <target>ÐšÐ¾Ð»ÐµÐºÑ†Ð¸ÑÑ‚Ð° Ñ‚Ñ€ÑÐ±Ð²Ð° Ð´Ð° ÑÑŠÐ´ÑŠÑ€Ð¶Ð° {{ limit }} Ð¸Ð»Ð¸ Ð¿Ð¾-Ð¼Ð°Ð»ÐºÐ¾ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚Ð°.|ÐšÐ¾Ð»ÐµÐºÑ†Ð¸ÑÑ‚Ð° Ñ‚Ñ€ÑÐ±Ð²Ð° Ð´Ð° ÑÑŠÐ´ÑŠÑ€Ð¶Ð° Ñ‚Ð¾Ñ‡Ð½Ð¾ {{ limit }} Ð¸Ð»Ð¸ Ð¿Ð¾-Ð¼Ð°Ð»ÐºÐ¾ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚Ð°.</target>
+            </trans-unit>
+            <trans-unit id="56">
+                <source>This collection should contain exactly {{ limit }} elements.</source>
+                <target>ÐšÐ¾Ð»ÐµÐºÑ†Ð¸ÑÑ‚Ð° Ñ‚Ñ€ÑÐ±Ð²Ð° Ð´Ð° ÑÑŠÐ´ÑŠÑ€Ð¶Ð° Ñ‚Ð¾Ñ‡Ð½Ð¾ {{ limit }} ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚.|ÐšÐ¾Ð»ÐµÐºÑ†Ð¸ÑÑ‚Ð° Ñ‚Ñ€ÑÐ±Ð²Ð° Ð´Ð° ÑÑŠÐ´ÑŠÑ€Ð¶Ð° Ñ‚Ð¾Ñ‡Ð½Ð¾ {{ limit }} ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚Ð°.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.ca.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.ca.xlf
new file mode 100644
index 0000000..6e78a47
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.ca.xlf
@@ -0,0 +1,219 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>Aquest valor hauria de ser fals.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>Aquest valor hauria de ser cert.</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>Aquest valor hauria de ser del tipus {{ type }}.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>Aquest valor hauria d'estar buit.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>El valor seleccionat no Ã©s una opciÃ³ vÃ lida.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>Ha de seleccionar almenys {{ limit }} opciÃ³.|Ha de seleccionar almenys {{ limit }} opcions.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>Ha de seleccionar com a mÃ xim {{ limit }} opciÃ³.|Ha de seleccionar com a mÃ xim {{ limit }} opcions.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>Un o mÃ©s dels valors facilitats sÃ³n incorrectes.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>No s'esperaven els camps {{ fields }}.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>Falten els camps {{ fields }}.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>Aquest valor no Ã©s una data vÃ lida.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>Aquest valor no Ã©s una data i hora vÃ lida.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>Aquest valor no Ã©s una adreÃ§a d'email vÃ lida.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>No s'ha pogut trobar l'arxiu.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>No es pot llegir l'arxiu.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>L'arxiu Ã©s massa gran ({{ size }} {{ suffix }}). La grandÃ ria mÃ xima permesa Ã©s {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>El tipus mime de l'arxiu no Ã©s vÃ lid ({{ type }}). Els tipus mime vÃ lids sÃ³n {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>Aquest valor hauria de ser {{ limit }} o menys.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>Aquest valor Ã©s massa llarg. Hauria de tenir {{ limit }} carÃ cter o menys.|Aquest valor Ã©s massa llarg. Hauria de tenir {{ limit }} carÃ cters o menys.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>Aquest valor hauria de ser {{ limit }} o mÃ©s.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>Aquest valor Ã©s massa curt. Hauria de tenir {{ limit }} carÃ cters o mÃ©s.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>Aquest valor no hauria d'estar buit.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>Aquest valor no hauria de ser null.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>Aquest valor hauria de ser null.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>Aquest valor no Ã©s vÃ lid.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>Aquest valor no Ã©s una hora vÃ lida.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>Aquest valor no Ã©s una URL vÃ lida.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>Els dos valors haurien de ser iguals.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>L'arxiu Ã©s massa gran. El tamany mÃ xim permÃ©s Ã©s {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>L'arxiu Ã©s massa gran.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>No es pot pujar l'arxiu.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>Aquest valor hauria de ser un nombre vÃ lid.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This file is not a valid image.</source>
+                <target>L'arxiu no Ã©s una imatge vÃ lida.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This is not a valid IP address.</source>
+                <target>AixÃ² no Ã©s una adreÃ§a IP vÃ lida.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This value is not a valid language.</source>
+                <target>Aquest valor no Ã©s un idioma vÃ lid.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid locale.</source>
+                <target>Aquest valor no Ã©s una localitzaciÃ³ vÃ lida.</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid country.</source>
+                <target>Aquest valor no Ã©s un paÃ­s vÃ lid.</target>
+            </trans-unit>
+            <trans-unit id="41">
+                <source>This value is already used.</source>
+                <target>Aquest valor ja s'ha utilitzat.</target>
+            </trans-unit>
+            <trans-unit id="42">
+                <source>The size of the image could not be detected.</source>
+                <target>No s'ha pogut determinar la grandÃ ria de la imatge.</target>
+            </trans-unit>
+            <trans-unit id="43">
+                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
+                <target>L'amplÃ ria de la imatge Ã©s massa gran ({{ width }}px). L'amplÃ ria mÃ xima permesa sÃ³n {{ max_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="44">
+                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
+                <target>L'amplÃ ria de la imatge Ã©s massa petita ({{ width }}px). L'amplÃ ria mÃ­nima requerida sÃ³n {{ min_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="45">
+                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
+                <target>L'altura de la imatge Ã©s massa gran ({{ height }}px). L'altura mÃ xima permesa sÃ³n {{ max_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="46">
+                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
+                <target>L'altura de la imatge Ã©s massa petita ({{ height }}px). L'altura mÃ­nima requerida sÃ³n {{ min_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="47">
+                <source>This value should be the user current password.</source>
+                <target>Aquest valor hauria de ser la contrasenya actual de l'usuari.</target>
+            </trans-unit>
+            <trans-unit id="48">
+                <source>This value should have exactly {{ limit }} characters.</source>
+                <target>Aquest valor hauria de tenir exactament {{ limit }} carÃ cter.|Aquest valor hauria de tenir exactament {{ limit }} carÃ cters.</target>
+            </trans-unit>
+            <trans-unit id="49">
+                <source>The file was only partially uploaded.</source>
+                <target>L'arxiu va ser nomÃ©s pujat parcialment.</target>
+            </trans-unit>
+            <trans-unit id="50">
+                <source>No file was uploaded.</source>
+                <target>Cap arxiu va ser pujat.</target>
+            </trans-unit>
+            <trans-unit id="51">
+                <source>No temporary folder was configured in php.ini.</source>
+                <target>Cap carpeta temporal va ser configurada en php.ini.</target>
+            </trans-unit>
+            <trans-unit id="52">
+                <source>Cannot write temporary file to disk.</source>
+                <target>No es va poder escriure l'arxiu temporal en el disc.</target>
+            </trans-unit>
+            <trans-unit id="53">
+                <source>A PHP extension caused the upload to fail.</source>
+                <target>Una extensiÃ³ de PHP va fer que la pujada fallara.</target>
+            </trans-unit>
+            <trans-unit id="54">
+                <source>This collection should contain {{ limit }} elements or more.</source>
+                <target>Aquesta colÂ·lecciÃ³ ha de contenir {{ limit }} element o mÃ©s.|Aquesta colÂ·lecciÃ³ ha de contenir {{ limit }} elements o mÃ©s.</target>
+            </trans-unit>
+            <trans-unit id="55">
+                <source>This collection should contain {{ limit }} elements or less.</source>
+                <target>Aquesta colÂ·lecciÃ³ ha de contenir {{ limit }} element o menys.|Aquesta colÂ·lecciÃ³ ha de contenir {{ limit }} elements o menys.</target>
+            </trans-unit>
+            <trans-unit id="56">
+                <source>This collection should contain exactly {{ limit }} elements.</source>
+                <target>Aquesta colÂ·lecciÃ³ ha de contenir exactament {{ limit }} element.|Aquesta colÂ·lecciÃ³ ha de contenir exactament {{ limit }} elements.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.cs.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.cs.xlf
new file mode 100644
index 0000000..af2d7c1
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.cs.xlf
@@ -0,0 +1,219 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>Tato hodnota musÃ­ bÃ½t nepravdivÃ¡ (false).</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>Tato hodnota musÃ­ bÃ½t pravdivÃ¡ (true).</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>Tato hodnota musÃ­ bÃ½t typu {{ type }}.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>Tato hodnota musÃ­ bÃ½t prÃ¡zdnÃ¡.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>VybranÃ¡ hodnota nenÃ­ platnou moÅ¾nostÃ­.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>MusÃ­ bÃ½t vybrÃ¡na nejmÃ©nÄ› {{ limit }} moÅ¾nost.|MusÃ­ bÃ½t vybrÃ¡ny nejmÃ©nÄ› {{ limit }} moÅ¾nosti.|MusÃ­ bÃ½t vybrÃ¡no nejmÃ©nÄ› {{ limit }} moÅ¾nostÃ­.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>MusÃ­ bÃ½t vybrÃ¡na maximÃ¡lnÄ› {{ limit }} moÅ¾nost.|MusÃ­ bÃ½t vybrÃ¡ny maximÃ¡lnÄ› {{ limit }} moÅ¾nosti.|MusÃ­ bÃ½t vybrÃ¡no maximÃ¡lnÄ› {{ limit }} moÅ¾nostÃ­.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>NÄ›kterÃ© z uvedenÃ½ch hodnot jsou neplatnÃ©.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>NeoÄekÃ¡vanÃ¡ pole {{ fields }}.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>ChybÃ­ nÃ¡sledujÃ­cÃ­ pole {{ fields }}.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>Tato hodnota nenÃ­ platnÃ© datum.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>Tato hodnota nenÃ­ platnÃ© datum s ÄasovÃ½m Ãºdajem.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>Tato hodnota nenÃ­ platnÃ¡ e-mailovÃ¡ adresa.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>Soubor nebyl nalezen.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>Soubor je neÄitelnÃ½.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Soubor je pÅ™Ã­liÅ¡ velkÃ½ ({{ size }} {{ suffix }}). MaximÃ¡lnÃ­ povolenÃ¡ velikost souboru je {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>NeplatnÃ½ mime typ souboru ({{ type }}). PovolenÃ© mime typy souborÅ¯ jsou {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>Tato hodnota musÃ­ bÃ½t {{ limit }} nebo mÃ©nÄ›.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>Tato hodnota je pÅ™Ã­liÅ¡ dlouhÃ¡. MusÃ­ obsahovat maximÃ¡lnÄ› {{ limit }} znak.|Tato hodnota je pÅ™Ã­liÅ¡ dlouhÃ¡. MusÃ­ obsahovat maximÃ¡lnÄ› {{ limit }} znaky.|Tato hodnota je pÅ™Ã­liÅ¡ dlouhÃ¡. MusÃ­ obsahovat maximÃ¡lnÄ› {{ limit }} znakÅ¯.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>Tato hodnota musÃ­ bÃ½t {{ limit }} nebo vÃ­ce.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>Tato hodnota je pÅ™Ã­liÅ¡ krÃ¡tkÃ¡. MusÃ­ obsahovat minimÃ¡lnÄ› {{ limit }} znak.|Tato hodnota je pÅ™Ã­liÅ¡ krÃ¡tkÃ¡. MusÃ­ obsahovat minimÃ¡lnÄ› {{ limit }} znaky.|Tato hodnota je pÅ™Ã­liÅ¡ krÃ¡tkÃ¡. MusÃ­ obsahovat minimÃ¡lnÄ› {{ limit }} znakÅ¯.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>Tato hodnota nesmÃ­ bÃ½t prÃ¡zdnÃ¡.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>Tato hodnota nesmÃ­ bÃ½t null.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>Tato hodnota musÃ­ bÃ½t null.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>Tato hodnota nenÃ­ platnÃ¡.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>Tato hodnota nenÃ­ platnÃ½ ÄasovÃ½ Ãºdaj.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>Tato hodnota nenÃ­ platnÃ¡ URL adresa.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>Tyto dvÄ› hodnoty musÃ­ bÃ½t stejnÃ©.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Soubor je pÅ™Ã­liÅ¡ velkÃ½. MaximÃ¡lnÃ­ povolenÃ¡ velikost souboru je {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>Soubor je pÅ™Ã­liÅ¡ velkÃ½.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>Soubor se nepodaÅ™ilo nahrÃ¡t.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>Tato hodnota musÃ­ bÃ½t ÄÃ­slo.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This file is not a valid image.</source>
+                <target>Tento soubor nenÃ­ obrÃ¡zek.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This is not a valid IP address.</source>
+                <target>Toto nenÃ­ platnÃ¡ IP adresa.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This value is not a valid language.</source>
+                <target>Tento jazyk neexistuje.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid locale.</source>
+                <target>Tato lokalizace neexistuje.</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid country.</source>
+                <target>Tato zemÄ› neexistuje.</target>
+            </trans-unit>
+            <trans-unit id="41">
+                <source>This value is already used.</source>
+                <target>Tato hodnota je jiÅ¾ pouÅ¾Ã­vÃ¡na.</target>
+            </trans-unit>
+            <trans-unit id="42">
+                <source>The size of the image could not be detected.</source>
+                <target>NepodaÅ™ily se zjistit rozmÄ›ry obrÃ¡zku.</target>
+            </trans-unit>
+            <trans-unit id="43">
+                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
+                <target>ObrÃ¡zek je pÅ™Ã­liÅ¡ Å¡irokÃ½ ({{ width }}px). MaximÃ¡lnÃ­ povolenÃ¡ Å¡Ã­Å™ka obrÃ¡zku je {{ max_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="44">
+                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
+                <target>ObrÃ¡zek je pÅ™Ã­liÅ¡ ÃºzkÃ½ ({{ width }}px). MinimÃ¡lnÃ­ Å¡Ã­Å™ka musÃ­ bÃ½t {{ min_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="45">
+                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
+                <target>ObrÃ¡zek je pÅ™Ã­liÅ¡ vysokÃ½ ({{ height }}px). MaximÃ¡lnÃ­ povolenÃ¡ vÃ½Å¡ka obrÃ¡zku je {{ max_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="46">
+                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
+                <target>ObrÃ¡zek je pÅ™Ã­liÅ¡ nÃ­zkÃ½ ({{ height }}px). MinimÃ¡lnÃ­ vÃ½Å¡ka obrÃ¡zku musÃ­ bÃ½t {{ min_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="47">
+                <source>This value should be the user current password.</source>
+                <target>Tato hodnota musÃ­ bÃ½t aktuÃ¡lnÃ­ heslo uÅ¾ivatele.</target>
+            </trans-unit>
+            <trans-unit id="48">
+                <source>This value should have exactly {{ limit }} characters.</source>
+                <target>Tato hodnota musÃ­ mÃ­t pÅ™esnÄ› {{ limit }} znak.|Tato hodnota musÃ­ mÃ­t pÅ™esnÄ› {{ limit }} znaky.|Tato hodnota musÃ­ mÃ­t pÅ™esnÄ› {{limit}} znakÅ¯.</target>
+            </trans-unit>
+            <trans-unit id="49">
+                <source>The file was only partially uploaded.</source>
+                <target>Byla nahrÃ¡na jen ÄÃ¡st souboru.</target>
+            </trans-unit>
+            <trans-unit id="50">
+                <source>No file was uploaded.</source>
+                <target>Å½Ã¡dnÃ½ soubor nebyl nahrÃ¡n.</target>
+            </trans-unit>
+            <trans-unit id="51">
+                <source>No temporary folder was configured in php.ini.</source>
+                <target>V php.ini nenÃ­ nastavena cesta k adresÃ¡Å™i pro doÄasnÃ© soubory.</target>
+            </trans-unit>
+            <trans-unit id="52">
+                <source>Cannot write temporary file to disk.</source>
+                <target>DoÄasnÃ½ soubor se nepodaÅ™ilo zapsat na disk.</target>
+            </trans-unit>
+            <trans-unit id="53">
+                <source>A PHP extension caused the upload to fail.</source>
+                <target>RozÅ¡Ã­Å™enÃ­ PHP zabrÃ¡nilo nahrÃ¡nÃ­ souboru.</target>
+            </trans-unit>
+            <trans-unit id="54">
+                <source>This collection should contain {{ limit }} elements or more.</source>
+                <target>Tato kolekce musÃ­ obsahovat minimÃ¡lnÄ› {{ limit }} prvek.|Tato kolekce musÃ­ obsahovat minimÃ¡lnÄ› {{ limit }} prvky.|Tato kolekce musÃ­ obsahovat minimÃ¡lnÄ› {{ limit }} prvkÅ¯.</target>
+            </trans-unit>
+            <trans-unit id="55">
+                <source>This collection should contain {{ limit }} elements or less.</source>
+                <target>Tato kolekce musÃ­ obsahovat maximÃ¡lnÄ› {{ limit }} prvek.|Tato kolekce musÃ­ obsahovat maximÃ¡lnÄ› {{ limit }} prvky.|Tato kolekce musÃ­ obsahovat maximÃ¡lnÄ› {{ limit }} prvkÅ¯.</target>
+            </trans-unit>
+            <trans-unit id="56">
+                <source>This collection should contain exactly {{ limit }} elements.</source>
+                <target>Tato kolekce musÃ­ obsahovat pÅ™esnÄ› {{ limit }} prvek.|Tato kolekce musÃ­ obsahovat pÅ™esnÄ› {{ limit }} prvky.|Tato kolekce musÃ­ obsahovat pÅ™esnÄ› {{ limit }} prvkÅ¯.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.da.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.da.xlf
new file mode 100644
index 0000000..8d3e653
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.da.xlf
@@ -0,0 +1,207 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>VÃ¦rdien skal vÃ¦re falsk.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>VÃ¦rdien skal vÃ¦re sand.</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>VÃ¦rdien skal vÃ¦re af typen {{ type }}.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>VÃ¦rdien skal vÃ¦re blank.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>VÃ¦rdien skal vÃ¦re en af de givne muligheder.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>Du skal vÃ¦lge mindst {{ limit }} muligheder.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>Du kan hÃ¸jest vÃ¦lge {{ limit }} muligheder.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>En eller flere af de oplyste vÃ¦rdier er ugyldige.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>Felterne {{ fields }} var ikke forventet.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>Felterne {{ fields }} mangler.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>VÃ¦rdien er ikke en gyldig dato.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>VÃ¦rdien er ikke en gyldig dato og tid.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>VÃ¦rdien er ikke en gyldig e-mail adresse.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>Filen kunne ikke findes.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>Filen kan ikke lÃ¦ses.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Filen er for stor ({{ size }} {{ suffix }}). Tilladte maksimale stÃ¸rrelse {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>Mimetypen af filen er ugyldig ({{ type }}). Tilladte mimetyper er {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>VÃ¦rdien skal vÃ¦re {{ limit }} eller mindre.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>VÃ¦rdien er for lang. Den skal have {{ limit }} bogstaver eller mindre.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>VÃ¦rdien skal vÃ¦re {{ limit }} eller mere.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>VÃ¦rdien er for kort. Den skal have {{ limit }} tegn eller flere.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>VÃ¦rdien mÃ¥ ikke vÃ¦re blank.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>VÃ¦rdien mÃ¥ ikke vÃ¦re tom (null).</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>VÃ¦rdien skal vÃ¦re tom (null).</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>VÃ¦rdien er ikke gyldig.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>VÃ¦rdien er ikke en gyldig tid.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>VÃ¦rdien er ikke en gyldig URL.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>De to vÃ¦rdier skal vÃ¦re ens.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Filen er for stor. Den maksimale stÃ¸rrelse er {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>Filen er for stor.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>Filen kunne ikke blive uploadet.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>VÃ¦rdien skal vÃ¦re et gyldigt tal.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This file is not a valid image.</source>
+                <target>Filen er ikke gyldigt billede.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This is not a valid IP address.</source>
+                <target>Dette er ikke en gyldig IP adresse.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This value is not a valid language.</source>
+                <target>VÃ¦rdien er ikke et gyldigt sprog.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid locale.</source>
+                <target>VÃ¦rdien er ikke en gyldig lokalitet.</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid country.</source>
+                <target>VÃ¦rdien er ikke et gyldigt land.</target>
+            </trans-unit>
+            <trans-unit id="41">
+                <source>This value is already used.</source>
+                <target>VÃ¦rdien er allerede i brug.</target>
+            </trans-unit>
+            <trans-unit id="42">
+                <source>The size of the image could not be detected.</source>
+                <target>StÃ¸rrelsen pÃ¥ billedet kunne ikke detekteres.</target>
+            </trans-unit>
+            <trans-unit id="43">
+                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
+                <target>Billedbredden er for stor ({{ width }}px). Tilladt maksimumsbredde er {{ max_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="44">
+                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
+                <target>Billedebredden er for lille ({{ width }}px). Forventet minimumshÃ¸jde er {{ min_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="45">
+                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
+                <target>BilledhÃ¸jden er for stor ({{ height }}px). Tilladt maksimumshÃ¸jde er {{ max_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="46">
+                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
+                <target>BilledhÃ¸jden er for lille ({{ height }}px). Forventet minimumshÃ¸jde er {{ min_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="47">
+                <source>This value should be the user current password.</source>
+                <target>VÃ¦rdien skal vÃ¦re brugerens nuvÃ¦rende password.</target>
+            </trans-unit>
+            <trans-unit id="48">
+                <source>This value should have exactly {{ limit }} characters.</source>
+                <target>VÃ¦rdien skal have prÃ¦cis {{ limit }} tegn.</target>
+            </trans-unit>
+            <trans-unit id="49">
+                <source>The file was only partially uploaded.</source>
+                <target>Filen var kun delvis uploadet.</target>
+            </trans-unit>
+            <trans-unit id="50">
+                <source>No file was uploaded.</source>
+                <target>Ingen fil blev uploadet.</target>
+            </trans-unit>
+            <trans-unit id="51">
+                <source>No temporary folder was configured in php.ini.</source>
+                <target>Ingen midlertidig mappe er konfigureret i php.ini.</target>
+            </trans-unit>
+            <trans-unit id="52">
+                <source>Cannot write temporary file to disk.</source>
+                <target>Kan ikke skrive midlertidig fil til disk.</target>
+            </trans-unit>
+            <trans-unit id="53">
+                <source>A PHP extension caused the upload to fail.</source>
+                <target>En PHP udvidelse forÃ¥rsagede fejl i upload.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.de.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.de.xlf
new file mode 100644
index 0000000..ea9b137
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.de.xlf
@@ -0,0 +1,219 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>Dieser Wert sollte false sein.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>Dieser Wert sollte true sein.</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>Dieser Wert sollte vom Typ {{ type }} sein.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>Dieser Wert sollte leer sein.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>Sie haben einen ungÃ¼ltigen Wert ausgewÃ¤hlt.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>Sie mÃ¼ssen mindestens {{ limit }} MÃ¶glichkeit wÃ¤hlen.|Sie mÃ¼ssen mindestens {{ limit }} MÃ¶glichkeiten wÃ¤hlen.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>Sie dÃ¼rfen hÃ¶chstens {{ limit }} MÃ¶glichkeit wÃ¤hlen.|Sie dÃ¼rfen hÃ¶chstens {{ limit }} MÃ¶glichkeiten wÃ¤hlen.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>Einer oder mehrere der angegebenen Werte sind ungÃ¼ltig.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>Die Felder {{ fields }} wurden nicht erwartet.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>Die erwarteten Felder {{ fields }} fehlen.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>Dieser Wert entspricht keiner gÃ¼ltigen Datumsangabe.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>Dieser Wert entspricht keiner gÃ¼ltigen Datums- und Zeitangabe.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>Dieser Wert ist keine gÃ¼ltige E-Mail-Adresse.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>Die Datei wurde nicht gefunden.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>Die Datei ist nicht lesbar.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Die Datei ist zu groÃŸ ({{ size }} {{ suffix }}). Die maximal zulÃ¤ssige GrÃ¶ÃŸe betrÃ¤gt {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>Der Dateityp ist ungÃ¼ltig ({{ type }}). Erlaubte Dateitypen sind {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>Dieser Wert sollte kleiner oder gleich {{ limit }} sein.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>Diese Zeichenkette ist zu lang. Sie sollte hÃ¶chstens {{ limit }} Zeichen haben.|Diese Zeichenkette ist zu lang. Sie sollte hÃ¶chstens {{ limit }} Zeichen haben.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>Dieser Wert sollte grÃ¶ÃŸer oder gleich {{ limit }} sein.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>Diese Zeichenkette ist zu kurz. Sie sollte mindestens {{ limit }} Zeichen haben.|Diese Zeichenkette ist zu kurz. Sie sollte mindestens {{ limit }} Zeichen haben.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>Dieser Wert sollte nicht leer sein.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>Dieser Wert sollte nicht null sein.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>Dieser Wert sollte null sein.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>Dieser Wert ist nicht gÃ¼ltig.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>Dieser Wert entspricht keiner gÃ¼ltigen Zeitangabe.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>Dieser Wert ist keine gÃ¼ltige URL.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>Die beiden Werte sollten identisch sein.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Die Datei ist zu groÃŸ. Die maximal zulÃ¤ssige GrÃ¶ÃŸe betrÃ¤gt {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>Die Datei ist zu groÃŸ.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>Die Datei konnte nicht hochgeladen werden.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>Dieser Wert sollte eine gÃ¼ltige Zahl sein.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This file is not a valid image.</source>
+                <target>Diese Datei ist kein gÃ¼ltiges Bild.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This is not a valid IP address.</source>
+                <target>Dies ist keine gÃ¼ltige IP-Adresse.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This value is not a valid language.</source>
+                <target>Dieser Wert entspricht keiner gÃ¼ltigen Sprache.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid locale.</source>
+                <target>Dieser Wert entspricht keinem gÃ¼ltigen Gebietsschema.</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid country.</source>
+                <target>Dieser Wert entspricht keinem gÃ¼ltigen Land.</target>
+            </trans-unit>
+            <trans-unit id="41">
+                <source>This value is already used.</source>
+                <target>Dieser Wert wird bereits verwendet.</target>
+            </trans-unit>
+            <trans-unit id="42">
+                <source>The size of the image could not be detected.</source>
+                <target>Die GrÃ¶ÃŸe des Bildes konnte nicht ermittelt werden.</target>
+            </trans-unit>
+            <trans-unit id="43">
+                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
+                <target>Die Bildbreite ist zu groÃŸ ({{ width }}px). Die maximal zulÃ¤ssige Breite betrÃ¤gt {{ max_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="44">
+                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
+                <target>Die Bildbreite ist zu gering ({{ width }}px). Die erwartete Mindestbreite betrÃ¤gt {{ min_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="45">
+                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
+                <target>Die BildhÃ¶he ist zu groÃŸ ({{ height }}px). Die maximal zulÃ¤ssige HÃ¶he betrÃ¤gt {{ max_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="46">
+                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
+                <target>Die BildhÃ¶he ist zu gering ({{ height }}px). Die erwartete MindesthÃ¶he betrÃ¤gt {{ min_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="47">
+                <source>This value should be the user current password.</source>
+                <target>Dieser Wert sollte dem aktuellen Benutzerpasswort entsprechen.</target>
+            </trans-unit>
+            <trans-unit id="48">
+                <source>This value should have exactly {{ limit }} characters.</source>
+                <target>Dieser Wert sollte genau {{ limit }} Zeichen lang sein.|Dieser Wert sollte genau {{ limit }} Zeichen lang sein.</target>
+            </trans-unit>
+            <trans-unit id="49">
+                <source>The file was only partially uploaded.</source>
+                <target>Die Datei wurde nur teilweise hochgeladen.</target>
+            </trans-unit>
+            <trans-unit id="50">
+                <source>No file was uploaded.</source>
+                <target>Es wurde keine Datei hochgeladen.</target>
+            </trans-unit>
+            <trans-unit id="51">
+                <source>No temporary folder was configured in php.ini.</source>
+                <target>Es wurde kein temporÃ¤rer Ordner in der php.ini konfiguriert.</target>
+            </trans-unit>
+            <trans-unit id="52">
+                <source>Cannot write temporary file to disk.</source>
+                <target>Kann die temporÃ¤re Datei nicht speichern.</target>
+            </trans-unit>
+            <trans-unit id="53">
+                <source>A PHP extension caused the upload to fail.</source>
+                <target>Eine PHP-Erweiterung verhinderte den Upload.</target>
+            </trans-unit>
+            <trans-unit id="54">
+                <source>This collection should contain {{ limit }} elements or more.</source>
+                <target>Diese Sammlung sollte {{ limit }} oder mehr Elemente beinhalten.|Diese Sammlung sollte {{ limit }} oder mehr Elemente beinhalten.</target>
+            </trans-unit>
+            <trans-unit id="55">
+                <source>This collection should contain {{ limit }} elements or less.</source>
+                <target>Diese Sammlung sollte {{ limit }} oder weniger Elemente beinhalten.|Diese Sammlung sollte {{ limit }} oder weniger Elemente beinhalten.</target>
+            </trans-unit>
+            <trans-unit id="56">
+                <source>This collection should contain exactly {{ limit }} elements.</source>
+                <target>Diese Sammlung sollte genau {{ limit }} Element beinhalten.|Diese Sammlung sollte genau {{ limit }} Elemente beinhalten.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
\ No newline at end of file
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.en.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.en.xlf
new file mode 100644
index 0000000..b95ec61
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.en.xlf
@@ -0,0 +1,219 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>This value should be false.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>This value should be true.</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>This value should be of type {{ type }}.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>This value should be blank.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>The value you selected is not a valid choice.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>One or more of the given values is invalid.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>The fields {{ fields }} were not expected.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>The fields {{ fields }} are missing.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>This value is not a valid date.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>This value is not a valid datetime.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>This value is not a valid email address.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>The file could not be found.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>The file is not readable.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>This value should be {{ limit }} or less.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>This value should be {{ limit }} or more.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>This value should not be blank.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>This value should not be null.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>This value should be null.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>This value is not valid.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>This value is not a valid time.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>This value is not a valid URL.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>The two values should be equal.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>The file is too large.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>The file could not be uploaded.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>This value should be a valid number.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This file is not a valid image.</source>
+                <target>This file is not a valid image.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This is not a valid IP address.</source>
+                <target>This is not a valid IP address.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This value is not a valid language.</source>
+                <target>This value is not a valid language.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid locale.</source>
+                <target>This value is not a valid locale.</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid country.</source>
+                <target>This value is not a valid country.</target>
+            </trans-unit>
+            <trans-unit id="41">
+                <source>This value is already used.</source>
+                <target>This value is already used.</target>
+            </trans-unit>
+            <trans-unit id="42">
+                <source>The size of the image could not be detected.</source>
+                <target>The size of the image could not be detected.</target>
+            </trans-unit>
+            <trans-unit id="43">
+                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
+                <target>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="44">
+                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
+                <target>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="45">
+                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
+                <target>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="46">
+                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
+                <target>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="47">
+                <source>This value should be the user current password.</source>
+                <target>This value should be the user current password.</target>
+            </trans-unit>
+            <trans-unit id="48">
+                <source>This value should have exactly {{ limit }} characters.</source>
+                <target>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</target>
+            </trans-unit>
+            <trans-unit id="49">
+                <source>The file was only partially uploaded.</source>
+                <target>The file was only partially uploaded.</target>
+            </trans-unit>
+            <trans-unit id="50">
+                <source>No file was uploaded.</source>
+                <target>No file was uploaded.</target>
+            </trans-unit>
+            <trans-unit id="51">
+                <source>No temporary folder was configured in php.ini.</source>
+                <target>No temporary folder was configured in php.ini.</target>
+            </trans-unit>
+            <trans-unit id="52">
+                <source>Cannot write temporary file to disk.</source>
+                <target>Cannot write temporary file to disk.</target>
+            </trans-unit>
+            <trans-unit id="53">
+                <source>A PHP extension caused the upload to fail.</source>
+                <target>A PHP extension caused the upload to fail.</target>
+            </trans-unit>
+            <trans-unit id="54">
+                <source>This collection should contain {{ limit }} elements or more.</source>
+                <target>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</target>
+            </trans-unit>
+            <trans-unit id="55">
+                <source>This collection should contain {{ limit }} elements or less.</source>
+                <target>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</target>
+            </trans-unit>
+            <trans-unit id="56">
+                <source>This collection should contain exactly {{ limit }} elements.</source>
+                <target>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.es.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.es.xlf
new file mode 100644
index 0000000..34bc7c3
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.es.xlf
@@ -0,0 +1,219 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>Este valor deberÃ­a ser falso.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>Este valor deberÃ­a ser verdadero.</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>Este valor deberÃ­a ser de tipo {{ type }}.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>Este valor deberÃ­a estar vacÃ­o.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>El valor seleccionado no es una opciÃ³n vÃ¡lida.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>Debe seleccionar al menos {{ limit }} opciÃ³n.|Debe seleccionar al menos {{ limit }} opciones.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>Debe seleccionar como mÃ¡ximo {{ limit }} opciÃ³n.|Debe seleccionar como mÃ¡ximo {{ limit }} opciones.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>Uno o mÃ¡s de los valores indicados no son vÃ¡lidos.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>No se esperaban los campos {{ fields }}.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>Faltan los campos {{ fields }}.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>Este valor no es una fecha vÃ¡lida.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>Este valor no es una fecha y hora vÃ¡lidas.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>Este valor no es una direcciÃ³n de email vÃ¡lida.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>No se pudo encontrar el archivo.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>No se puede leer el archivo.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>El archivo es demasiado grande ({{ size }} {{ suffix }}). El tamaÃ±o mÃ¡ximo permitido es {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>El tipo mime del archivo no es vÃ¡lido ({{ type }}). Los tipos mime vÃ¡lidos son {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>Este valor deberÃ­a ser {{ limit }} o menos.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>Este valor es demasiado largo. DeberÃ­a tener {{ limit }} carÃ¡cter o menos.|Este valor es demasiado largo. DeberÃ­a tener {{ limit }} caracteres o menos.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>Este valor deberÃ­a ser {{ limit }} o mÃ¡s.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>Este valor es demasiado corto. DeberÃ­a tener {{ limit }} carÃ¡cter o mÃ¡s.|Este valor es demasiado corto. DeberÃ­a tener {{ limit }} caracteres o mÃ¡s.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>Este valor no deberÃ­a estar vacÃ­o.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>Este valor no deberÃ­a ser null.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>Este valor deberÃ­a ser null.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>Este valor no es vÃ¡lido.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>Este valor no es una hora vÃ¡lida.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>Este valor no es una URL vÃ¡lida.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>Los dos valores deberÃ­an ser iguales.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>El archivo es demasiado grande. El tamaÃ±o mÃ¡ximo permitido es {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>El archivo es demasiado grande.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>No se pudo subir el archivo.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>Este valor deberÃ­a ser un nÃºmero vÃ¡lido.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This file is not a valid image.</source>
+                <target>El archivo no es una imagen vÃ¡lida.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This is not a valid IP address.</source>
+                <target>Esto no es una direcciÃ³n IP vÃ¡lida.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This value is not a valid language.</source>
+                <target>Este valor no es un idioma vÃ¡lido.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid locale.</source>
+                <target>Este valor no es una localizaciÃ³n vÃ¡lida.</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid country.</source>
+                <target>Este valor no es un paÃ­s vÃ¡lido.</target>
+            </trans-unit>
+            <trans-unit id="41">
+                <source>This value is already used.</source>
+                <target>Este valor ya se ha utilizado.</target>
+            </trans-unit>
+            <trans-unit id="42">
+                <source>The size of the image could not be detected.</source>
+                <target>No se pudo determinar el tamaÃ±o de la imagen.</target>
+            </trans-unit>
+            <trans-unit id="43">
+                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
+                <target>La anchura de la imagen es demasiado grande ({{ width }}px). La anchura mÃ¡xima permitida son {{ max_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="44">
+                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
+                <target>La anchura de la imagen es demasiado pequeÃ±a ({{ width }}px). La anchura mÃ­nima requerida son {{ min_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="45">
+                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
+                <target>La altura de la imagen es demasiado grande ({{ height }}px). La altura mÃ¡xima permitida son {{ max_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="46">
+                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
+                <target>La altura de la imagen es demasiado pequeÃ±a ({{ height }}px). La altura mÃ­nima requerida son {{ min_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="47">
+                <source>This value should be the user current password.</source>
+                <target>Este valor deberÃ­a ser la contraseÃ±a actual del usuario.</target>
+            </trans-unit>
+            <trans-unit id="48">
+                <source>This value should have exactly {{ limit }} characters.</source>
+                <target>Este valor deberÃ­a tener exactamente {{ limit }} carÃ¡cter.|Este valor deberÃ­a tener exactamente {{ limit }} caracteres.</target>
+            </trans-unit>
+            <trans-unit id="49">
+                <source>The file was only partially uploaded.</source>
+                <target>El archivo fue sÃ³lo subido parcialmente.</target>
+            </trans-unit>
+            <trans-unit id="50">
+                <source>No file was uploaded.</source>
+                <target>NingÃºn archivo fue subido.</target>
+            </trans-unit>
+            <trans-unit id="51">
+                <source>No temporary folder was configured in php.ini.</source>
+                <target>Ninguna carpeta temporal fue configurada en php.ini.</target>
+            </trans-unit>
+            <trans-unit id="52">
+                <source>Cannot write temporary file to disk.</source>
+                <target>No se pudo escribir el archivo temporal en el disco.</target>
+            </trans-unit>
+            <trans-unit id="53">
+                <source>A PHP extension caused the upload to fail.</source>
+                <target>Una extensiÃ³n de PHP hizo que la subida fallara.</target>
+            </trans-unit>
+            <trans-unit id="54">
+                <source>This collection should contain {{ limit }} elements or more.</source>
+                <target>Esta colecciÃ³n debe contener {{ limit }} elemento o mÃ¡s.|Esta colecciÃ³n debe contener {{ limit }} elementos o mÃ¡s.</target>
+            </trans-unit>
+            <trans-unit id="55">
+                <source>This collection should contain {{ limit }} elements or less.</source>
+                <target>Esta colecciÃ³n debe contener {{ limit }} elemento o menos.|Esta colecciÃ³n debe contener {{ limit }} elementos o menos.</target>
+            </trans-unit>
+            <trans-unit id="56">
+                <source>This collection should contain exactly {{ limit }} elements.</source>
+                <target>Esta colecciÃ³n debe contener exactamente {{ limit }} elemento.|Esta colecciÃ³n debe contener exactamente {{ limit }} elementos.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.et.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.et.xlf
new file mode 100644
index 0000000..3f9c9a8
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.et.xlf
@@ -0,0 +1,131 @@
+<?xml version='1.0'?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>VÃ¤Ã¤rtus peaks olema vÃ¤Ã¤r.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>VÃ¤Ã¤rtus peaks oleme tÃµene.</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>VÃ¤Ã¤rtus peaks olema {{ type }}-tÃ¼Ã¼pi.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>VÃ¤Ã¤rtus peaks olema tÃ¼hi.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>VÃ¤Ã¤rtus peaks olema Ã¼ks etteantud valikutest.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>Valima peaks vÃ¤hemalt {{ limit }} valikut.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>Valima peaks mitte rohkem kui  {{ limit }} valikut.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>One or more of the given values is invalid.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>VÃ¤ljad {{ fields }} olid ootamatud.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>VÃ¤ljad {{ fields }} on puudu.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>VÃ¤Ã¤rtus pole korrektne kuupÃ¤ev.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>VÃ¤Ã¤rtus pole korrektne kuupÃ¤ev ja kellaeg.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>VÃ¤Ã¤rtus pole korrektne e-maili aadress.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>Faili ei leita.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>Fail ei ole loetav.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Fail on liiga suur ({{ size }} {{ suffix }}). Suurim lubatud suurus on {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>Faili sisutÃ¼Ã¼p on vigane ({{ type }}). Lubatud sisutÃ¼Ã¼bid on {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>VÃ¤Ã¤rtus peaks olema {{ limit }} vÃµi vÃ¤hem.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>VÃ¤Ã¤rtus on liiga pikk. Pikkus peaks olema {{ limit }} tÃ¤hemÃ¤rki vÃµi vÃ¤hem.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>VÃ¤Ã¤rtus peaks olema {{ limit }} vÃµi rohkem.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>VÃ¤Ã¤rtus on liiga lÃ¼hike. Pikkus peaks  olema {{ limit }} tÃ¤hemÃ¤rki vÃµi rohkem.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>VÃ¤Ã¤rtus ei tohiks olla tÃ¼hi.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>VÃ¤Ã¤rtus ei tohiks olla 'null'.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>VÃ¤Ã¤rtus peaks olema 'null'.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>VÃ¤Ã¤rtus on vigane.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>VÃ¤Ã¤rtus pole korrektne aeg.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>VÃ¤Ã¤rtus pole korrektne URL.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>VÃ¤Ã¤rtused peaksid olema vÃµrdsed.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Fail on liiga suur. Maksimaalne lubatud suurus on {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>Fail on liiga suur.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>Faili ei saa Ã¼les laadida.</target>
+             </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.eu.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.eu.xlf
new file mode 100644
index 0000000..08b854b
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.eu.xlf
@@ -0,0 +1,155 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>Balio honek faltsua izan beharko luke (false).</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>Balio honek egiazkoa izan beharko luke (true).</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>Balio honek {{ type }} motakoa izan beharko luke.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>Balio honek hutsik egon beharko luke.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>Hautatu duzun balioa ez da aukera egoki bat.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>Gutxienez {{ limit }} aukera hautatu behar dituzu.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>Gehienez {{ limit }} aukera hautatu behar dituzu.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>Emandako balio bat edo gehiago ez dira egokiak.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>{{ fields }} eremuak ez ziren espero.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>{{ fields }} eremuak falta dira.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>Balio hau ez da data egoki bat.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>Balio hau ez da data eta ordu egoki bat.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>Balio hau ez da helbide elektroniko egoki bat.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>Ezin izan da fitxategia aurkitu.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>Fitxategia ez dago irakurgai.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Fitxategia handiegia da ({{ size }} {{ suffix }}). Baimendutako tamainu handiena {{ limit }} {{ suffix }} da.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>Fitxategiaren mime mota ez da egokia ({{ type }}). Hauek dira baimendutako mime motak: {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>Balio honek {{ limit }} edo gutxiago izan beharko luke.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>Balio hau luzeegia da. {{ limit }} karaktere edo gutxiago eduki beharko lituzke.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>Balio honek {{ limit }} edo handiago izan beharko luke.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>Balio hau motzegia da. {{ limit }} karaktere edo gehiago eduki beharko lituzke.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>Balio honek ez luke hutsik egon behar.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>Balio honek ez luke nulua izan behar.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>Balio honek nulua izan beharko luke.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>Balio hau ez da egokia.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>Balio hau ez da ordu egoki bat.</target>
+           </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>Balio hau ez da URL egoki bat.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>Bi balioak berdinak izan beharko lirateke.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Fitxategia handiegia da. Baimendutako tamainu handiena {{ limit }} {{ suffix }} da.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>Fitxategia handiegia da.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>Ezin izan da fitxategia igo.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>Balio honek zenbaki egoki bat izan beharko luke.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This file is not a valid image.</source>
+                <target>Fitxategi hau ez da irudi egoki bat.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This is not a valid IP address.</source>
+                <target>Honako hau ez da IP helbide egoki bat.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This value is not a valid language.</source>
+                <target>Balio hau ez da hizkuntza egoki bat.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid locale.</source>
+                <target>Balio hau ez da lokalizazio egoki bat.</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid country.</source>
+                <target>Balio hau ez da herrialde egoki bat.</target>
+            </trans-unit>            
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.fa.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.fa.xlf
new file mode 100644
index 0000000..bc60334
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.fa.xlf
@@ -0,0 +1,219 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target state="needs-review-translation">Ø§ÛŒÙ† Ù…Ù‚Ø¯Ø§Ø± Ø¨Ø§ÛŒØ¯ Ù†Ø§Ø¯Ø±Ø³Øª(False) Ø¨Ø§Ø´Ø¯.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>Ø§ÛŒÙ† Ù…Ù‚Ø¯Ø§Ø± Ø¨Ø§ÛŒØ¯ Ø¯Ø±Ø³Øª(True) Ø¨Ø§Ø´Ø¯.</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>Ø§ÛŒÙ† Ù…Ù‚Ø¯Ø§Ø± Ø¨Ø§ÛŒØ¯ Ø§Ø² Ù†ÙˆØ¹ {{ type }} Ø¨Ø§Ø´Ø¯.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>Ø§ÛŒÙ† ÙÛŒÙ„Ø¯ Ø¨Ø§ÛŒØ¯ Ø®Ø§Ù„ÛŒ Ø¨Ø§Ø´Ø¯.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>Ú¯Ø²ÛŒÙ†Ù‡ Ø§Ù†ØªØ®Ø§Ø¨ÛŒ Ù…Ø¹ØªØ¨Ø± Ù†ÛŒØ³Øª.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>Ø¨Ø§ÛŒØ¯ Ø­Ø¯Ø§Ù‚Ù„ {{ limit }} Ú¯Ø²ÛŒÙ†Ù‡ Ø§Ù†ØªØ®Ø§Ø¨ Ú©Ù†ÛŒØ¯.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>Ø­Ø¯Ø§Ú©Ø«Ø± {{ limit }} Ú¯Ø²ÛŒÙ†Ù‡ Ù…ÛŒ ØªÙˆØ§Ù†ÛŒØ¯ Ø§Ù†ØªØ®Ø§Ø¨ Ú©Ù†ÛŒØ¯.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>ÛŒÚ© ÛŒØ§ Ú†Ù†Ø¯ Ù…Ù‚Ø¯Ø§Ø± Ù†Ø§Ù…Ø¹ØªØ¨Ø± ÙˆØ¬ÙˆØ¯ Ø¯Ø§Ø±Ø¯.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>ÙÛŒÙ„Ø¯Ù‡Ø§ÛŒ {{ fields }} Ø§Ø¶Ø§ÙÛŒ Ù‡Ø³ØªÙ†Ø¯.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>ÙÛŒÙ„Ø¯Ù‡Ø§ÛŒ {{ fields }} Ú©Ù… Ù‡Ø³ØªÙ†Ø¯.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>Ø§ÛŒÙ† Ù…Ù‚Ø¯Ø§Ø± ÛŒÚ© ØªØ§Ø±ÛŒØ® Ù…Ø¹ØªØ¨Ø± Ù†ÛŒØ³Øª.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>Ø§ÛŒÙ† Ù…Ù‚Ø¯Ø§Ø± ÛŒÚ© ØªØ§Ø±ÛŒØ® Ùˆ Ø²Ù…Ø§Ù† Ù…Ø¹ØªØ¨Ø± Ù†ÛŒØ³Øª.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>Ø§ÛŒÙ† ÛŒÚ© Ø±Ø§ÛŒØ§Ù†Ø§Ù…Ù‡ Ù…Ø¹ØªØ¨Ø± Ù†ÛŒØ³Øª.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>ÙØ§ÛŒÙ„ Ù¾ÛŒØ¯Ø§ Ù†Ø´Ø¯.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>ÙØ§ÛŒÙ„ Ù‚Ø§Ø¨Ù„ÛŒØª Ø®ÙˆØ§Ù†Ø¯Ù† Ù†Ø¯Ø§Ø±Ø¯.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>ÙØ§ÛŒÙ„ Ø¨ÛŒØ´ Ø§Ø² Ø§Ù†Ø¯Ø§Ø²Ù‡ Ø¨Ø²Ø±Ú¯ Ø§Ø³Øª({{ size }} {{ suffix }}). Ø­Ø¯Ø§Ú©Ø«Ø± Ø§Ù†Ø¯Ø§Ø²Ù‡ Ù…Ø¬Ø§Ø² Ø¨Ø±Ø§Ø¨Ø± {{ limit }} {{ suffix }} Ø§Ø³Øª.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>Ø§ÛŒÙ† Ù†ÙˆØ¹ ÙØ§ÛŒÙ„ Ù…Ø¬Ø§Ø² Ù†ÛŒØ³Øª({{ type }}). Ù†ÙˆØ¹ Ù‡Ø§ÛŒ Ù…Ø¬Ø§Ø² {{ types }} Ù‡Ø³ØªÙ†Ø¯.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>Ø§ÛŒÙ† Ù…Ù‚Ø¯Ø§Ø± Ø¨Ø§ÛŒØ¯ Ú©ÙˆÚ†Ú©ØªØ± ÛŒØ§ Ù…Ø³Ø§ÙˆÛŒ {{ limit }} Ø¨Ø§Ø´Ø¯.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>Ø¨Ø³ÛŒØ§Ø± Ø·ÙˆÙ„Ø§Ù†ÛŒ Ø§Ø³Øª.Ø­Ø¯Ø§Ú©Ø«Ø± ØªØ¹Ø¯Ø§Ø¯ Ø­Ø±ÙˆÙ Ù…Ø¬Ø§Ø² Ø¨Ø±Ø§Ø¨Ø± {{ limit }} Ø§Ø³Øª.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>Ø§ÛŒÙ† Ù…Ù‚Ø¯Ø§Ø± Ø¨Ø§ÛŒØ¯ Ø¨Ø±Ø§Ø¨Ø± Ùˆ ÛŒØ§ Ø¨ÛŒØ´ØªØ± Ø§Ø² {{ limit }} Ø¨Ø§Ø´Ø¯.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>Ø¨Ø³ÛŒØ§Ø± Ú©ÙˆØªØ§Ù‡ Ø§Ø³Øª.ØªØ¹Ø¯Ø§Ø¯ Ø­Ø±ÙˆÙ Ø¨Ø§ÛŒØ¯ Ø­Ø¯Ø§Ù‚Ù„ {{ limit }} Ø¨Ø§Ø´Ø¯.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>Ø§ÛŒÙ† Ù…Ù‚Ø¯Ø§Ø± Ù†Ø¨Ø§ÛŒØ¯ ØªÙ‡ÛŒ Ø¨Ø§Ø´Ø¯.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>Ø¨Ø§ÛŒØ¯ Ù…Ù‚Ø¯Ø§Ø±ÛŒ Ø¯Ø§Ø´ØªÙ‡ Ø¨Ø§Ø´Ø¯..</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>Ù†Ø¨Ø§ÛŒØ¯ Ù…Ù‚Ø¯Ø§Ø±ÛŒ Ø¯Ø§Ø´ØªÙ‡ Ø¨Ø§Ø´Ø¯.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>Ø§ÛŒÙ† Ù…Ù‚Ø¯Ø§Ø± Ù…Ø¹ØªØ¨Ø± Ù†ÛŒØ³Øª.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>Ø§ÛŒÙ† Ù…Ù‚Ø¯Ø§Ø± ÛŒÚ© Ø²Ù…Ø§Ù† ØµØ­ÛŒØ­ Ù†ÛŒØ³Øª.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>Ø§ÛŒÙ† ÛŒÚ© URL Ù…Ø¹ØªØ¨Ø± Ù†ÛŒØ³Øª.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>Ø¯Ùˆ Ù…Ù‚Ø¯Ø§Ø± Ø¨Ø§ÛŒØ¯ Ø¨Ø±Ø§Ø¨Ø± Ø¨Ø§Ø´Ù†Ø¯.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>ÙØ§ÛŒÙ„ Ø¨ÛŒØ´ Ø§Ø² Ø§Ù†Ø¯Ø§Ø²Ù‡ Ø¨Ø²Ø±Ú¯ Ø§Ø³Øª. Ø­Ø¯Ø§Ú©Ø«Ø± Ø§Ù†Ø¯Ø§Ø²Ù‡ Ù…Ø¬Ø§Ø² Ø¨Ø±Ø§Ø¨Ø± {{ limit }} {{ suffix }} Ø§Ø³Øª.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>ÙØ§ÛŒÙ„ Ø¨ÛŒØ´ Ø§Ø² Ø§Ù†Ø¯Ø§Ø²Ù‡ Ø¨Ø²Ø±Ú¯ Ø§Ø³Øª.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±ÛŒ ÙØ§ÛŒÙ„ Ø¨Ø§ Ø´Ú©Ø³Øª Ù…ÙˆØ§Ø¬Ù‡ Ø´Ø¯.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>Ø§ÛŒÙ† Ù…Ù‚Ø¯Ø§Ø± Ø¨Ø§ÛŒØ¯ ÛŒÚ© Ø¹Ø¯Ø¯ Ù…Ø¹ØªØ¨Ø± Ø¨Ø§Ø´Ø¯.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This file is not a valid image.</source>
+                <target>Ø§ÛŒÙ† ÙØ§ÛŒÙ„ ÛŒÚ© ØªØµÙˆÛŒØ± Ù†ÛŒØ³Øª.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This is not a valid IP address.</source>
+                <target>Ø§ÛŒÙ† Ù…Ù‚Ø¯Ø§Ø± ÛŒÚ© IP Ù…Ø¹ØªØ¨Ø± Ù†ÛŒØ³Øª.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This value is not a valid language.</source>
+                <target>Ø§ÛŒÙ† Ù…Ù‚Ø¯Ø§Ø± ÛŒÚ© Ø²Ø¨Ø§Ù† ØµØ­ÛŒØ­ Ù†ÛŒØ³Øª.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid locale.</source>
+                <target>Ø§ÛŒÙ† Ù…Ù‚Ø¯Ø§Ø± ÛŒÚ© Ù…Ø­Ù„ ØµØ­ÛŒØ­ Ù†ÛŒØ³Øª.</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid country.</source>
+                <target>Ø§ÛŒÙ† Ù…Ù‚Ø¯Ø§Ø± ÛŒÚ© Ú©Ø´ÙˆØ± ØµØ­ÛŒØ­ Ù†ÛŒØ³Øª.</target>
+            </trans-unit>
+            <trans-unit id="41">
+                <source>This value is already used.</source>
+                <target>Ø§ÛŒÙ† Ù…Ù‚Ø¯Ø§Ø± Ù‚Ø¨Ù„Ø§ Ù…ÙˆØ±Ø¯ Ø§Ø³ØªÙØ§Ø¯Ù‡ Ù‚Ø±Ø§Ø± Ú¯Ø±ÙØªÙ‡ Ø§Ø³Øª.</target>
+            </trans-unit>
+            <trans-unit id="42">
+                <source>The size of the image could not be detected.</source>
+                <target>Ø§Ù†Ø¯Ø§Ø²Ù‡ ØªØµÙˆÛŒØ± Ù‚Ø§Ø¨Ù„ Ø´Ù†Ø§Ø³Ø§ÛŒÛŒ Ù†ÛŒØ³Øª.</target>
+            </trans-unit>
+            <trans-unit id="43">
+                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
+                <target>Ø·ÙˆÙ„ ØªØµÙˆÛŒØ± Ø¨Ø³ÛŒØ§Ø± Ø¨Ø²Ø±Ú¯ Ø§Ø³Øª ({{ width }}px). Ø¨Ø´ÛŒÙ†Ù‡ Ø·ÙˆÙ„ Ù…Ø¬Ø§Ø² {{ max_width }}px Ø§Ø³Øª.</target>
+            </trans-unit>
+            <trans-unit id="44">
+                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
+                <target>Ø·ÙˆÙ„ ØªØµÙˆÛŒØ± Ø¨Ø³ÛŒØ§Ø± Ú©ÙˆÚ†Ú© Ø§Ø³Øª ({{ width }}px). Ú©Ù…ÛŒÙ†Ù‡ Ø·ÙˆÙ„ Ù…ÙˆØ±Ø¯Ù†Ø¸Ø± {{ min_width }}px Ø§Ø³Øª.</target>
+            </trans-unit>
+            <trans-unit id="45">
+                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
+                <target>Ø§Ø±ØªÙØ§Ø¹ ØªØµÙˆÛŒØ± Ø¨Ø³ÛŒØ§Ø± Ø¨Ø²Ø±Ú¯ Ø§Ø³Øª ({{ height }}px). Ø¨Ø´ÛŒÙ†Ù‡ Ø§Ø±ØªÙØ§Ø¹ Ù…Ø¬Ø§Ø² {{ max_height }}px Ø§Ø³Øª.</target>
+            </trans-unit>
+            <trans-unit id="46">
+                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
+                <target>Ø§Ø±ØªÙØ§Ø¹ ØªØµÙˆÛŒØ± Ø¨Ø³ÛŒØ§Ø± Ú©ÙˆÚ†Ú© Ø§Ø³Øª ({{ height }}px). Ú©Ù…ÛŒÙ†Ù‡ Ø§Ø±ØªÙØ§Ø¹ Ù…ÙˆØ±Ø¯Ù†Ø¸Ø± {{ min_height }}px Ø§Ø³Øª.</target>
+            </trans-unit>
+            <trans-unit id="47">
+                <source>This value should be the user current password.</source>
+                <target>Ø§ÛŒÙ† Ù…Ù‚Ø¯Ø§Ø± Ù…ÛŒ Ø¨Ø§ÛŒØ³Øª Ú©Ù„Ù…Ù‡ Ø¹Ø¨ÙˆØ± Ú©Ù†ÙˆÙ†ÛŒ Ú©Ø§Ø±Ø¨Ø± Ø¨Ø§Ø´Ø¯.</target>
+            </trans-unit>
+            <trans-unit id="48">
+                <source>This value should have exactly {{ limit }} characters.</source>
+                <target>Ø§ÛŒÙ† Ù…Ù‚Ø¯Ø§Ø± Ù…ÛŒ Ø¨Ø§ÛŒØ³Øª Ø¯Ù‚ÛŒÙØ§ {{ limit }} Ú©Ø§Ø±Ø§Ú©ØªØ± Ø¯Ø§Ø´ØªÙ‡ Ø¨Ø§Ø´Ø¯.|Ø§ÛŒÙ† Ù…Ù‚Ø¯Ø±Ø§ Ù…ÛŒ Ø¨Ø§ÛŒØ´Øª Ø¯Ù‚ÛŒÙ‚Ø§ {{ limit }} Ú©Ø§Ø±Ø§Ú©ØªØ± Ø¯Ø§Ø´ØªÙ‡ Ø¨Ø§Ø´Ø¯.</target>
+            </trans-unit>
+            <trans-unit id="49">
+                <source>The file was only partially uploaded.</source>
+                <target>ÙØ§ÛŒÙ„ Ø¨Ù‡ ØµÙˆØ±Øª Ø¬Ø²ÛŒÛŒ Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±ÛŒ Ø´Ø¯Ù‡ Ø§Ø³Øª.</target>
+            </trans-unit>
+            <trans-unit id="50">
+                <source>No file was uploaded.</source>
+                <target>Ù‡ÛŒÚ† ÙØ§ÛŒÙ„ÛŒ Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±ÛŒ Ù†Ø´Ø¯.</target>
+            </trans-unit>
+            <trans-unit id="51">
+                <source>No temporary folder was configured in php.ini.</source>
+                <target>ÙÙˆÙ„Ø¯Ø± Ù…ÙˆÙ‚Øª Ø¯Ø± php.ini Ù¾ÛŒÚ©Ø±Ø¨Ù†Ø¯ÛŒ Ù†Ø´Ø¯Ù‡ Ø§Ø³Øª.</target>
+            </trans-unit>
+            <trans-unit id="52">
+                <source>Cannot write temporary file to disk.</source>
+                <target>ÙØ§ÛŒÙ„ Ù…ÙˆÙ‚Øª Ø±Ø§ Ù†Ù…ÛŒ ØªÙˆØ§Ù† Ø¯Ø± Ø¯ÛŒØ³Ú© Ù†ÙˆØ´Øª.</target>
+            </trans-unit>
+            <trans-unit id="53">
+                <source>A PHP extension caused the upload to fail.</source>
+                <target>Ø§Ú©Ø³ØªÙ†Ø´Ù† PHP Ù…ÙˆØ¬Ø¨ Ø´Ø¯ Ú©Ù‡ Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±ÛŒ ÙØ§ÛŒÙ„ Ø¨Ø§ Ø´Ú©Ø³Øª Ù…ÙˆØ§Ø¬Ù‡ Ø´ÙˆØ¯.</target>
+            </trans-unit>
+            <trans-unit id="54">
+                <source>This collection should contain {{ limit }} elements or more.</source>
+                <target>Ø§ÛŒÙ† Ù…Ø¬Ù…ÙˆØ¹Ù‡ Ù…ÛŒ Ø¨Ø§ÛŒØ³Øª Ø¯Ø§Ø±Ø§ÛŒ {{ limit }} Ø¹Ù†ØµØ± ÛŒØ§ Ø¨ÛŒØ´ØªØ± Ø¨Ø§Ø´Ø¯.|Ø§ÛŒÙ† Ù…Ø¬Ù…ÙˆØ¹Ù‡ Ù…ÛŒ Ø¨Ø§ÛŒØ³Øª Ø¯Ø§Ø±Ø§ÛŒ {{ limit }} Ø¹Ù†ØµØ± ÛŒØ§ Ø¨ÛŒØ´ØªØ± Ø¨Ø§Ø´Ø¯.</target>
+            </trans-unit>
+            <trans-unit id="55">
+                <source>This collection should contain {{ limit }} elements or less.</source>
+                <target>Ø§ÛŒÙ† Ù…Ø¬Ù…ÙˆØ¹Ù‡ Ù…ÛŒ Ø¨Ø§ÛŒØ³Øª Ø¯Ø§Ø±Ø§ÛŒ Ø­Ø¯Ø§Ù‚Ù„ {{ limit }} Ø¹Ù†ØµØ± ÛŒØ§ Ú©Ù…ØªØ± Ø¨Ø§Ø´Ø¯.|Ø§ÛŒÙ† Ù…Ø¬Ù…ÙˆØ¹Ù‡ Ù…ÛŒ Ø¨Ø§ÛŒØ³Øª Ø¯Ø§Ø±Ø§ÛŒ {{ limit }} Ø¹Ù†ØµØ± ÛŒØ§ Ú©Ù…ØªØ± Ø¨Ø§Ø´Ø¯.</target>
+            </trans-unit>
+            <trans-unit id="56">
+                <source>This collection should contain exactly {{ limit }} elements.</source>
+                <target>Ø§ÛŒÙ† Ù…Ø¬Ù…ÙˆØ¹Ù‡ Ù…ÛŒ Ø¨Ø§ÛŒØ³Øª Ø¨Ù‡ Ø·ÙˆØ± Ø¯Ù‚ÛŒÙ‚ Ø¯Ø§Ø±Ø§ {{ limit }} Ø¹Ù†ØµØ± Ø¨Ø§Ø´Ø¯.|Ø§ÛŒÙ† Ù…Ø¬Ù…ÙˆØ¹Ù‡ Ù…ÛŒ Ø¨Ø§ÛŒØ³Øª Ø¨Ù‡ Ø·ÙˆØ± Ø¯Ù‚ÛŒÙ‚ Ø¯Ø§Ø±Ø§ÛŒ {{ limit }} Ù‚Ù„Ù… Ø¨Ø§Ø´Ø¯.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.fi.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.fi.xlf
new file mode 100644
index 0000000..e790f9e
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.fi.xlf
@@ -0,0 +1,131 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>Arvon tulee olla epÃ¤tosi.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>Arvon tulee olla tosi.</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>Arvon tulee olla tyyppiÃ¤ {{ type }}.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>Arvon tulee olla tyhjÃ¤.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>Arvon tulee olla yksi annetuista vaihtoehdoista.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>Sinun tulee valita vÃ¤hintÃ¤Ã¤n {{ limit }} vaihtoehtoa.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>Sinun tulee valitan enintÃ¤Ã¤n {{ limit }} vaihtoehtoa.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>One or more of the given values is invalid.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target> Odottamattomia kenttiÃ¤ {{ fields }}.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>KentÃ¤t {{ fields }} puuttuvat.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>Annettu arvo ei ole kelvollinen pÃ¤ivÃ¤mÃ¤Ã¤rÃ¤.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>Annettu arvo ei ole kelvollinen pÃ¤ivÃ¤mÃ¤Ã¤rÃ¤ ja kellonaika.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>Annettu arvo ei ole kelvollinen sÃ¤hkÃ¶postiosoite.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>Tiedostoa ei lÃ¶ydy.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>Tiedostoa ei voida lukea.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Tiedostonkoko ({{ size }} {{ suffix }}) on liian iso. Suurin sallittu tiedostonkoko on {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>Tiedostotyyppi ({{ type }}) on virheellinen. Sallittuja tiedostotyyppejÃ¤ ovat {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>Arvon tulee olla {{ limit }} tai vÃ¤hemmÃ¤n.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>Liian pitkÃ¤ syÃ¶te. SyÃ¶te saa olla enintÃ¤Ã¤n {{ limit }} merkkiÃ¤.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>Arvon tulee olla {{ limit }} tai enemmÃ¤n.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>Liian lyhyt syÃ¶te. SyÃ¶tteen tulee olla vÃ¤hintÃ¤Ã¤n {{ limit }} merkkiÃ¤.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>KenttÃ¤ ei voi olla tyhjÃ¤.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>SyÃ¶te ei voi olla null.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>SyÃ¶tteen tulee olla null.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>Virheellinen arvo.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>Annettu arvo ei ole kelvollinen kellonaika.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>Annettu arvo ei ole kelvollinen URL-osoite.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>Kahden annetun arvon tulee olla samat.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Annettu tiedosto on liian iso. Suurin sallittu tiedostokoko on {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>Tiedosto on liian iso.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>Tiedoston siirto epÃ¤onnistui.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.fr.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.fr.xlf
new file mode 100644
index 0000000..4ba9bee
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.fr.xlf
@@ -0,0 +1,219 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>Cette valeur doit Ãªtre fausse.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>Cette valeur doit Ãªtre vraie.</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>Cette valeur doit Ãªtre de type {{ type }}.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>Cette valeur doit Ãªtre vide.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>Cette valeur doit Ãªtre l'un des choix proposÃ©s.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>Vous devez sÃ©lectionner au moins {{ limit }} choix.|Vous devez sÃ©lectionner au moins {{ limit }} choix.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>Vous devez sÃ©lectionner au maximum {{ limit }} choix.|Vous devez sÃ©lectionner au maximum {{ limit }} choix.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>Une ou plusieurs des valeurs soumises sont invalides.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>Les champs {{ fields }} n'ont pas Ã©tÃ© prÃ©vus.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>Les champs {{ fields }} sont manquants.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>Cette valeur n'est pas une date valide.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>Cette valeur n'est pas une date valide.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>Cette valeur n'est pas une adresse email valide.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>Le fichier n'a pas Ã©tÃ© trouvÃ©.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>Le fichier n'est pas lisible.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Le fichier est trop volumineux ({{ size }} {{ suffix }}). Sa taille ne doit pas dÃ©passer {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>Le type du fichier est invalide ({{ type }}). Les types autorisÃ©s sont {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>Cette valeur doit Ãªtre infÃ©rieure ou Ã©gale Ã  {{ limit }}.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>Cette chaine est trop longue. Elle doit avoir au maximum {{ limit }} caractÃ¨re.|Cette chaine est trop longue. Elle doit avoir au maximum {{ limit }} caractÃ¨res.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>Cette valeur doit Ãªtre supÃ©rieure ou Ã©gale Ã  {{ limit }}.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>Cette chaine est trop courte. Elle doit avoir au minimum {{ limit }} caractÃ¨re.|Cette chaine est trop courte. Elle doit avoir au minimum {{ limit }} caractÃ¨res.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>Cette valeur ne doit pas Ãªtre vide.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>Cette valeur ne doit pas Ãªtre nulle.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>Cette valeur doit Ãªtre nulle.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>Cette valeur n'est pas valide.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>Cette valeur n'est pas une heure valide.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>Cette valeur n'est pas une URL valide.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>Les deux valeurs doivent Ãªtre identiques.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Le fichier est trop volumineux. Sa taille ne doit pas dÃ©passer {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>Le fichier est trop volumineux.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>Le tÃ©lÃ©chargement de ce fichier est impossible.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>Cette valeur doit Ãªtre un nombre.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This file is not a valid image.</source>
+                <target>Ce fichier n'est pas une image valide.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This is not a valid IP address.</source>
+                <target>Cette adresse IP n'est pas valide.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This value is not a valid language.</source>
+                <target>Cette langue n'est pas valide.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid locale.</source>
+                <target>Ce paramÃ¨tre rÃ©gional n'est pas valide.</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid country.</source>
+                <target>Ce pays n'est pas valide.</target>
+            </trans-unit>
+            <trans-unit id="41">
+                <source>This value is already used.</source>
+                <target>Cette valeur est dÃ©jÃ  utilisÃ©e.</target>
+            </trans-unit>
+            <trans-unit id="42">
+                <source>The size of the image could not be detected.</source>
+                <target>La taille de l'image n'a pas pu Ãªtre dÃ©tectÃ©e.</target>
+            </trans-unit>
+            <trans-unit id="43">
+                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
+                <target>La largeur de l'image est trop grande ({{ width }}px). La largeur maximale autorisÃ©e est de {{ max_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="44">
+                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
+                <target>La largeur de l'image est trop petite ({{ width }}px). La largeur minimale attendue est de {{ min_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="45">
+                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
+                <target>La hauteur de l'image est trop grande ({{ height }}px). La hauteur maximale autorisÃ©e est de {{ max_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="46">
+                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
+                <target>La hauteur de l'image est trop petite ({{ height }}px). La hauteur minimale attendue est de {{ min_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="47">
+                <source>This value should be the user current password.</source>
+                <target>Cette valeur doit Ãªtre le mot de passe actuel de l'utilisateur.</target>
+            </trans-unit>
+            <trans-unit id="48">
+                <source>This value should have exactly {{ limit }} characters.</source>
+                <target>Cette chaine doit avoir exactement {{ limit }} caractÃ¨re.|Cette chaine doit avoir exactement {{ limit }} caractÃ¨res.</target>
+            </trans-unit>
+            <trans-unit id="49">
+                <source>The file was only partially uploaded.</source>
+                <target>Le fichier a Ã©tÃ© partiellement transfÃ©rÃ©.</target>
+            </trans-unit>
+            <trans-unit id="50">
+                <source>No file was uploaded.</source>
+                <target>Aucun fichier n'a Ã©tÃ© transfÃ©rÃ©.</target>
+            </trans-unit>
+            <trans-unit id="51">
+                <source>No temporary folder was configured in php.ini.</source>
+                <target>Aucun rÃ©pertoire temporaire n'a Ã©tÃ© configurÃ© dans le php.ini.</target>
+            </trans-unit>
+            <trans-unit id="52">
+                <source>Cannot write temporary file to disk.</source>
+                <target>Impossible d'Ã©crire le fichier temporaire sur le disque.</target>
+            </trans-unit>
+            <trans-unit id="53">
+                <source>A PHP extension caused the upload to fail.</source>
+                <target>Une extension PHP a empÃªchÃ© le transfert du fichier.</target>
+            </trans-unit>
+            <trans-unit id="54">
+                <source>This collection should contain {{ limit }} elements or more.</source>
+                <target>Cette collection doit contenir {{ limit }} Ã©lÃ©ment ou plus.|Cette collection doit contenir {{ limit }} Ã©lÃ©ments ou plus.</target>
+            </trans-unit>
+            <trans-unit id="55">
+                <source>This collection should contain {{ limit }} elements or less.</source>
+                <target>Cette collection doit contenir {{ limit }} Ã©lÃ©ment ou moins.|Cette collection doit contenir {{ limit }} Ã©lÃ©ments ou moins.</target>
+            </trans-unit>
+            <trans-unit id="56">
+                <source>This collection should contain exactly {{ limit }} elements.</source>
+                <target>Cette collection doit contenir exactement {{ limit }} Ã©lÃ©ment.|Cette collection doit contenir exactement {{ limit }} Ã©lÃ©ments.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.he.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.he.xlf
new file mode 100644
index 0000000..5597838
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.he.xlf
@@ -0,0 +1,219 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>×”×¢×¨×š ×¦×¨×™×š ×œ×”×™×•×ª ×©×§×¨.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>×”×¢×¨×š ×¦×¨×™×š ×œ×”×™×•×ª ××ž×ª.</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>×”×¢×¨×š ×¦×¨×™×š ×œ×”×™×•×ª ×ž×¡×•×’ {{ type }}.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>×”×¢×¨×š ×¦×¨×™×š ×œ×”×™×•×ª ×¨×™×§.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>×”×¢×¨×š ×©×‘×—×¨×ª ××™× ×• ×—×•×§×™.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>××ª×” ×¦×¨×™×š ×œ×‘×—×•×¨ ×œ×¤×—×•×ª {{ limit }} ××¤×©×¨×•×™×•×ª.|××ª×” ×¦×¨×™×š ×œ×‘×—×•×¨ ×œ×¤×—×•×ª {{ limit }} ××¤×©×¨×•×™×•×ª.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>××ª×” ×¦×¨×™×š ×œ×‘×—×•×¨ ×œ×›×œ ×”×™×•×ª×¨ {{ limit }} ××¤×©×¨×•×™×•×ª.|××ª×” ×¦×¨×™×š ×œ×‘×—×•×¨ ×œ×›×œ ×”×™×•×ª×¨ {{ limit }} ××¤×©×¨×•×™×•×ª.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>××—×“ ××• ×™×•×ª×¨ ×ž×”×¢×¨×›×™× ××™× ×• ×—×•×§×™.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>×”×©×“×•×ª {{ fields }} ×œ× ×”×™×• ×¦×¤×•×™×™×.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>×”×©×“×•×ª {{ fields }} ×—×¡×¨×™×.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>×”×¢×¨×š ××™× ×• ×ª××¨×™×š ×—×•×§×™.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>×”×¢×¨×š ××™× ×• ×ª××¨×™×š ×•×©×¢×” ×—×•×§×™×™×.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>×›×ª×•×‘×ª ×”×ž×™×™×œ ××™× ×” ×ª×§×™× ×”.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>×”×§×•×‘×¥ ×œ× × ×ž×¦×.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>×œ× × ×™×ª×Ÿ ×œ×§×¨×•× ××ª ×”×§×•×‘×¥.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>×”×§×•×‘×¥ ×’×“×•×œ ×ž×“×™ ({{ size }} {{ suffix }}). ×”×’×•×“×œ ×”×ž×¨×‘×™ ×”×ž×•×ª×¨ ×”×•× {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>×¡×•×’ MIME ×©×œ ×”×§×•×‘×¥ ××™× ×• ×—×•×§×™ ({{ type }}). ×ž×•×ª×¨×™× ×¡×•×’×™ MIME {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>×”×¢×¨×š ×¦×¨×™×œ ×œ×”×›×™×œ {{ limit }} ×ª×•×•×™× ×œ×›×œ ×”×™×•×ª×¨.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>×”×¢×¨×š ××¨×•×š ×ž×™×“×™. ×”×•× ×¦×¨×™×š ×œ×”×›×™×œ {{ limit }} ×ª×•×•×™× ×œ×›×œ ×”×™×•×ª×¨.|×”×¢×¨×š ××¨×•×š ×ž×™×“×™. ×”×•× ×¦×¨×™×š ×œ×”×›×™×œ {{ limit }} ×ª×•×•×™× ×œ×›×œ ×”×™×•×ª×¨.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>×”×¢×¨×š ×¦×¨×™×š ×œ×”×›×™×œ {{ limit }} ×ª×•×•×™× ×œ×¤×—×•×ª.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>×”×¢×¨×š ×§×¦×¨ ×ž×™×“×™×¥ ×”×•× ×¦×¨×™×š ×œ×”×›×™×œ {{ limit }} ×ª×•×•×™× ×œ×¤×—×•×ª.|×”×¢×¨×š ×§×¦×¨ ×ž×™×“×™×¥ ×”×•× ×¦×¨×™×š ×œ×”×›×™×œ {{ limit }} ×ª×•×•×™× ×œ×¤×—×•×ª.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>×”×¢×¨×š ×œ× ××ž×•×¨ ×œ×”×™×•×ª ×¨×™×§.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>×”×¢×¨×š ×œ× ××ž×•×¨ ×œ×”×™×•×ª ×¨×™×§.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>×”×¢×¨×š ×¦×¨×™×š ×œ×”×™×•×ª ×¨×™×§.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>×”×¢×¨×š ××™× ×• ×—×•×§×™.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>×”×¢×¨×š ××™× ×• ×–×ž×Ÿ ×ª×§×™×Ÿ.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>×–××ª ××™× ×” ×›×ª×•×‘×ª ××ª×¨ ×ª×§×™× ×”.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>×©× ×™ ×”×¢×¨×›×™× ×¦×¨×™×›×™× ×œ×”×™×•×ª ×©×•×•×™×.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>×”×§×•×‘×¥ ×’×“×•×œ ×ž×“×™. ×”×’×•×“×œ ×”×ž×¨×‘×™ ×”×ž×•×ª×¨ ×”×•× {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>×”×§×•×‘×¥ ×’×“×•×œ ×ž×“×™.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>×œ× × ×™×ª×Ÿ ×œ×¢×œ×•×ª ××ª ×”×§×•×‘×¥.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>×”×¢×¨×š ×¦×¨×™×š ×œ×”×™×•×ª ×ž×¡×¤×¨ ×—×•×§×™.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This file is not a valid image.</source>
+                <target>×”×§×•×‘×¥ ×”×–×” ××™× ×• ×ª×ž×•× ×” ×ª×§×™× ×”.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This is not a valid IP address.</source>
+                <target>×–×• ××™× ×” ×›×ª×•×‘×ª IP ×—×•×§×™×ª.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This value is not a valid language.</source>
+                <target>×”×¢×¨×š ××™× ×• ×©×¤×” ×—×•×§×™×ª.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid locale.</source>
+                <target>×”×¢×¨×š ××™× ×• ××–×•×¨ ×ª×§×£.</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid country.</source>
+                <target>×”×¢×¨×š ××™× ×• ××¨×¥ ×—×•×§×™×ª.</target>
+            </trans-unit>
+            <trans-unit id="41">
+                <source>This value is already used.</source>
+                <target>×”×¢×¨×š ×›×‘×¨ ×‘×©×™×ž×•×©.</target>
+            </trans-unit>
+            <trans-unit id="42">
+                <source>The size of the image could not be detected.</source>
+                <target>×œ× × ×™×ª×Ÿ ×œ×§×‘×•×¢ ××ª ×’×•×“×œ ×”×ª×ž×•× ×”.</target>
+            </trans-unit>
+            <trans-unit id="43">
+                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
+                <target>×¨×•×—×‘ ×”×ª×ž×•× ×” ×’×“×•×œ ×ž×“×™ ({{ width }}px). ×”×¨×•×—×‘ ×”×ž×§×¡×™×ž×œ×™ ×”×•× {{ max_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="44">
+                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
+                <target>×¨×•×—×‘ ×”×ª×ž×•× ×” ×§×˜×Ÿ ×ž×“×™ ({{ width }}px). ×”×¨×•×—×‘ ×”×ž×™× ×™×ž×œ×™ ×”×•× {{ min_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="45">
+                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
+                <target>×’×•×‘×” ×”×ª×ž×•× ×” ×’×“×•×œ ×ž×“×™ ({{ height }}px). ×”×’×•×‘×” ×”×ž×§×¡×™×ž×œ×™ ×”×•× {{ max_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="46">
+                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
+                <target>×’×•×‘×” ×”×ª×ž×•× ×” ×§×˜×Ÿ ×ž×“×™ ({{ height }}px). ×”×’×•×‘×” ×”×ž×™× ×™×ž×œ×™ ×”×•× {{ min_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="47">
+                <source>This value should be the user current password.</source>
+                <target>×”×¢×¨×š ×¦×¨×™×š ×œ×”×™×•×ª ×¡×™×¡×ž×ª ×”×ž×©×ª×ž×© ×”× ×•×›×—×™.</target>
+            </trans-unit>
+            <trans-unit id="48">
+                <source>This value should have exactly {{ limit }} characters.</source>
+                <target>×”×¢×¨×š ×¦×¨×™×š ×œ×”×™×•×ª ×‘×“×™×•×§ {{ limit }} ×ª×•×•×™×.|×”×¢×¨×š ×¦×¨×™×š ×œ×”×™×•×ª ×‘×“×™×•×§ {{ limit }} ×ª×•×•×™×.</target>
+            </trans-unit>
+            <trans-unit id="49">
+                <source>The file was only partially uploaded.</source>
+                <target>×”×§×•×‘×¥ ×”×•×¢×œ×” ×‘××•×¤×Ÿ ×—×œ×§×™.</target>
+            </trans-unit>
+            <trans-unit id="50">
+                <source>No file was uploaded.</source>
+                <target>×”×§×•×‘×¥ ×œ× ×”×•×¢×œ×”.</target>
+            </trans-unit>
+            <trans-unit id="51">
+                <source>No temporary folder was configured in php.ini.</source>
+                <target>×œ× ×”×•×’×“×¨×” ×ª×™×§×™×™×” ×–×ž× ×™×ª ×‘ php.ini.</target>
+            </trans-unit>
+            <trans-unit id="52">
+                <source>Cannot write temporary file to disk.</source>
+                <target>×œ× × ×™×ª×Ÿ ×œ×›×ª×•×‘ ×§×•×‘×¥ ×–×ž× ×™ ×œ×“×™×¡×§.</target>
+            </trans-unit>
+            <trans-unit id="53">
+                <source>A PHP extension caused the upload to fail.</source>
+                <target>×¡×™×•×ž×ª PHP ×’×¨× ×œ×”×¢×œ××” ×œ×”×™×›×©×œ.</target>
+            </trans-unit>
+            <trans-unit id="54">
+                <source>This collection should contain {{ limit }} elements or more.</source>
+                <target>×”××•×¡×£ ××ž×•×¨ ×œ×”×›×™×œ {{ limit }} ××œ×ž× ×˜×™× ××• ×™×•×ª×¨.|×”××•×¡×£ ××ž×•×¨ ×œ×”×›×™×œ {{ limit }} ××œ×ž× ×˜×™× ××• ×™×•×ª×¨.</target>
+            </trans-unit>
+            <trans-unit id="55">
+                <source>This collection should contain {{ limit }} elements or less.</source>
+                <target>×”××•×¡×£ ××ž×•×¨ ×œ×”×›×™×œ {{ limit }} ××œ×ž× ×˜×™× ××• ×¤×—×•×ª.|×”××•×¡×£ ××ž×•×¨ ×œ×”×›×™×œ {{ limit }} ××œ×ž× ×˜×™× ××• ×¤×—×•×ª.</target>
+            </trans-unit>
+            <trans-unit id="56">
+                <source>This collection should contain exactly {{ limit }} elements.</source>
+                <target>×”××•×¡×£ ×¦×¨×™×š ×œ×”×›×™×œ ×‘×“×™×•×§ {{ limit }} ××œ×ž× ×˜×™×.|×”××•×¡×£ ×¦×¨×™×š ×œ×”×›×™×œ ×‘×“×™×•×§ {{ limit }} ××œ×ž× ×˜×™×.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.hr.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.hr.xlf
new file mode 100644
index 0000000..f6bb1c9
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.hr.xlf
@@ -0,0 +1,207 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>Ova vrijednost treba biti netoÄna (false).</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>Ova vrijednost treba biti toÄna (true).</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>Ova vrijednost treba biti tipa {{ type }}.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>Ova vrijednost treba biti prazna.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>Ova vrijednost treba biti jedna od ponuÄ‘enih.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>Izaberite barem {{ limit }} moguÄ‡nosti.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>Izaberite najviÅ¡e {{ limit }} moguÄ‡nosti.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>Jedna ili viÅ¡e danih vrijednosti nije ispravna.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>Polja {{ fields }} nisu bila oÄekivana.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>Polja {{ fields }} nedostaju.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>Ova vrijednost nije ispravan datum.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>Ova vrijednost nije ispravan datum-vrijeme.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>Ova vrijednost nije ispravna e-mail adresa.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>Datoteka ne moÅ¾e biti pronaÄ‘ena.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>Datoteka nije Äitljiva.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Datoteka je prevelika ({{ size }} {{ suffix }}). NajveÄ‡a dozvoljena veliÄina je {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>Mime tip datoteke nije ispravan ({{ type }}). Dozvoljeni mime tipovi su {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>Ova vrijednost treba biti {{ limit }} ili manje.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>Ova vrijednost je predugaÄka. Treba imati {{ limit }} znakova ili manje.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>Ova vrijednost treba biti {{ limit }} ili viÅ¡e.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>Ova vrijednost je prekratka. Treba imati {{ limit }} znakova ili viÅ¡e.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>Ova vrijednost ne smije biti prazna.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>Ova vrijednost ne smije biti null.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>Ova vrijednost treba biti null.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>Ova vrijednost nije ispravna.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>Ova vrijednost nije ispravno vrijeme.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>Ova vrijednost nije ispravan URL.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>Obje vrijednosti trebaju biti jednake.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Ova datoteka je prevelika. NajveÄ‡a dozvoljena veliÄina je {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>Ova datoteka je prevelika.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>Ova datoteka ne moÅ¾e biti prenesena.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>Ova vrijednost treba biti ispravan broj.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This file is not a valid image.</source>
+                <target>Ova datoteka nije ispravna slika.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This is not a valid IP address.</source>
+                <target>Ovo nije ispravna IP adresa.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This value is not a valid language.</source>
+                <target>Ova vrijednost nije ispravan jezik.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid locale.</source>
+                <target>Ova vrijednost nije ispravana regionalna oznaka.</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid country.</source>
+                <target>Ova vrijednost nije ispravna zemlja.</target>
+            </trans-unit>
+            <trans-unit id="41">
+                <source>This value is already used.</source>
+                <target>Ova vrijednost je veÄ‡ iskoriÅ¡tena.</target>
+            </trans-unit>
+            <trans-unit id="42">
+                <source>The size of the image could not be detected.</source>
+                <target>VeliÄina slike se ne moÅ¾e odrediti.</target>
+            </trans-unit>
+            <trans-unit id="43">
+                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
+                <target>Å irina slike je prevelika ({{ width }}px). NajveÄ‡a dozvoljena Å¡irina je {{ max_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="44">
+                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
+                <target>Å irina slike je premala ({{ width }}px). Najmanja dozvoljena Å¡irina je {{ min_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="45">
+                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
+                <target>Visina slike je prevelika ({{ height }}px). NajveÄ‡a dozvoljena visina je {{ max_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="46">
+                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
+                <target>Visina slike je premala ({{ height }}px). Najmanja dozvoljena visina je {{ min_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="47">
+                <source>This value should be the user current password.</source>
+                <target>Ova vrijednost treba biti trenutna korisniÄka lozinka.</target>
+            </trans-unit>
+            <trans-unit id="48">
+                <source>This value should have exactly {{ limit }} characters.</source>
+                <target>Ova vrijednost treba imati toÄno {{ limit }} znakova.</target>
+            </trans-unit>
+            <trans-unit id="49">
+                <source>The file was only partially uploaded.</source>
+                <target>Datoteka je samo djelomiÄno prenesena.</target>
+            </trans-unit>
+            <trans-unit id="50">
+                <source>No file was uploaded.</source>
+                <target>Niti jedna datoteka nije prenesena.</target>
+            </trans-unit>
+            <trans-unit id="51">
+                <source>No temporary folder was configured in php.ini.</source>
+                <target>U php.ini datoteci nije konfiguriran privremeni folder.</target>
+            </trans-unit>
+            <trans-unit id="52">
+                <source>Cannot write temporary file to disk.</source>
+                <target>Ne mogu zapisati privremenu datoteku na disk.</target>
+            </trans-unit>
+            <trans-unit id="53">
+                <source>A PHP extension caused the upload to fail.</source>
+                <target>Prijenos datoteke nije uspio zbog PHP ekstenzije.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.hu.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.hu.xlf
new file mode 100644
index 0000000..0056165
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.hu.xlf
@@ -0,0 +1,219 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>Ez az Ã©rtÃ©k hamis legyen.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>Ez az Ã©rtÃ©k igaz legyen.</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>Ez az Ã©rtÃ©k {{ type }} tÃ­pusÃº legyen.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>Ez az Ã©rtÃ©k legyen Ã¼res.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>Ez az Ã©rtÃ©k a megadottak egyike legyen.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>LegalÃ¡bb {{ limit }} Ã©rtÃ©ket kell kivÃ¡lasztani.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>Legfeljebb {{ limit }} Ã©rtÃ©ket lehet kivÃ¡lasztani.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>Egy vagy tÃ¶bb Ã©rvÃ©nytelen a megadott Ã©rtÃ©kek kÃ¶zÃ¼l.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>VÃ¡ratlan mezÅ‘k: {{ fields }}.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>A(z) {{ fields }} mezÅ‘k hiÃ¡nyoznak.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>Ez az Ã©rtÃ©k nem egy Ã©rvÃ©nyes dÃ¡tum.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>Ez az Ã©rtÃ©k nem egy Ã©rvÃ©nyes idÅ‘pont.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>Ez az Ã©rtÃ©k nem egy Ã©rvÃ©nyes e-mail cÃ­m.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>A fÃ¡jl nem talÃ¡lhatÃ³.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>A fÃ¡jl nem olvashatÃ³.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>A fÃ¡jl tÃºl nagy ({{ size }} {{ suffix }}). A legnagyobb megengedett mÃ©ret {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>A fÃ¡jl mime tÃ­pusa Ã©rvÃ©nytelen ({{ type }}). Az engedÃ©lyzett mime tÃ­pusok: {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>Ez az Ã©rtÃ©k {{ limit }} vagy kevesebb legyen.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>Ez az Ã©rtÃ©k tÃºl hosszÃº. {{ limit }} karaktert vagy kevesebbet tartalmazzon.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>Ez az Ã©rtÃ©k {{ limit }} vagy tÃ¶bb legyen.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>Ez az Ã©rtÃ©k tÃºl rÃ¶vid. {{ limit }} karaktert vagy tÃ¶bbet tartalmazzon.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>Ez az Ã©rtÃ©k nem lehet Ã¼res.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>Ez az Ã©rtÃ©k nem lehet null.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>Ennek az Ã©rtÃ©knek nullnak kÃ©ne lennie.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>Ez az Ã©rtÃ©k nem Ã©rvÃ©nyes.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>Ez az Ã©rtÃ©k nem egy Ã©rvÃ©nyes idÅ‘pont.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>Ez az Ã©rtÃ©k nem egy szabÃ¡lyos URL.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>A kÃ©t Ã©rtÃ©knek azonosnak kell lennie.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>A fÃ¡jl tÃºl nagy. A megengedett maximÃ¡lis mÃ©ret: {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>A fÃ¡jl tÃºl nagy.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>A fÃ¡jl nem tÃ¶lthetÅ‘ fel.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>Ez az Ã©rtÃ©k egy Ã©rvÃ©nyes szÃ¡m legyen.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This file is not a valid image.</source>
+                <target>Ez a fÃ¡jl nem egy Ã©rvÃ©nyes kÃ©p.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This is not a valid IP address.</source>
+                <target>Ez nem egy Ã©rvÃ©nyes IP cÃ­m.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This value is not a valid language.</source>
+                <target>Ez az Ã©rtÃ©k nem egy Ã©rvÃ©nyes nyelv.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid locale.</source>
+                <target>Ez az Ã©rtÃ©k nem egy Ã©rvÃ©nyes terÃ¼leti beÃ¡llÃ­tÃ¡s.</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid country.</source>
+                <target>Ez az Ã©rtÃ©k nem egy Ã©rvÃ©nyes orszÃ¡g.</target>
+            </trans-unit>
+            <trans-unit id="41">
+                <source>This value is already used.</source>
+                <target>Ez az Ã©rtÃ©k mÃ¡r hasznÃ¡lva van.</target>
+            </trans-unit>
+            <trans-unit id="42">
+                <source>The size of the image could not be detected.</source>
+                <target>A kÃ©p mÃ©retÃ©t nem lehet megÃ¡llapÃ­tani.</target>
+            </trans-unit>
+            <trans-unit id="43">
+                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
+                <target>A kÃ©p szÃ©lessÃ©ge tÃºl nagy ({{ width }}px). A megengedett legnagyobb szÃ©lessÃ©g {{ max_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="44">
+                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
+                <target>A kÃ©p szÃ©lessÃ©ge tÃºl kicsit ({{ width }}px). Az elvÃ¡rt legkisebb szÃ©lessÃ©g {{ min_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="45">
+                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
+                <target>A kÃ©p magassÃ¡ga tÃºl nagy ({{ height }}px). A megengedett legnagyobb magassÃ¡g {{ max_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="46">
+                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
+                <target>A kÃ©p magassÃ¡ga tÃºl kicsi ({{ height }}px). Az elvÃ¡rt legkisebb magassÃ¡g {{ min_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="47">
+                <source>This value should be the user current password.</source>
+                <target>Ez az Ã©rtÃ©k a felhasznÃ¡lÃ³ jelenlegi jelszava legyen.</target>
+            </trans-unit>
+            <trans-unit id="48">
+                <source>This value should have exactly {{ limit }} characters.</source>
+                <target>Ez az Ã©rtÃ©k pontosan {{ limit }} karaktert tartalmazzon.</target>
+            </trans-unit>
+            <trans-unit id="49">
+                <source>The file was only partially uploaded.</source>
+                <target>A fÃ¡jl csak rÃ©szben lett feltÃ¶ltve.</target>
+            </trans-unit>
+            <trans-unit id="50">
+                <source>No file was uploaded.</source>
+                <target>Nem lett fÃ¡jl feltÃ¶ltve.</target>
+            </trans-unit>
+            <trans-unit id="51">
+                <source>No temporary folder was configured in php.ini.</source>
+                <target>Nincs ideiglenes kÃ¶nyvtÃ¡r beÃ¡llÃ­tva a php.ini-ben.</target>
+            </trans-unit>
+            <trans-unit id="52">
+                <source>Cannot write temporary file to disk.</source>
+                <target>Nem Ã­rhatÃ³ ideiglenes fÃ¡jl a lemezre.</target>
+            </trans-unit>
+            <trans-unit id="53">
+                <source>A PHP extension caused the upload to fail.</source>
+                <target>Egy PHP bÅ‘vÃ­tmÃ©ny miatt a feltÃ¶ltÃ©s nem sikerÃ¼lt.</target>
+            </trans-unit>
+            <trans-unit id="54">
+                <source>This collection should contain {{ limit }} elements or more.</source>
+                <target>Ez a gyÅ±jtemÃ©ny {{ limit }} elemet vagy tÃ¶bbet tartalmazzon.</target>
+            </trans-unit>
+            <trans-unit id="55">
+                <source>This collection should contain {{ limit }} elements or less.</source>
+                <target>Ez a gyÅ±jtemÃ©ny {{ limit }} elemet vagy kevesebbet tartalmazzon.</target>
+            </trans-unit>
+            <trans-unit id="56">
+                <source>This collection should contain exactly {{ limit }} elements.</source>
+                <target>Ez a gyÅ±jetemÃ©ny pontosan {{ limit }} elemet tartalmazzon.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.hy.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.hy.xlf
new file mode 100644
index 0000000..7b161c9
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.hy.xlf
@@ -0,0 +1,187 @@
+ï»¿<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>Ô±Ö€ÕªÕ¥Ö„Õ¨ ÕºÕ¥Õ¿Ö„ Õ§ Õ¬Õ«Õ¶Õ« Õ¯Õ¥Õ²Õ®.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>Ô±Ö€ÕªÕ¥Ö„Õ¨ ÕºÕ¥Õ¿Ö„ Õ§ Õ¬Õ«Õ¶Õ« Õ³Õ·Õ´Õ¡Ö€Õ«Õ¿.</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>Ô±Ö€ÕªÕ¥Ö„Õ¨ ÕºÕ¥Õ¿Ö„ Õ§ Õ¬Õ«Õ¶Õ« {{ type }} Õ¿Õ¥Õ½Õ¡Õ¯Õ«.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>Ô±Ö€ÕªÕ¥Ö„Õ¨ ÕºÕ¥Õ¿Ö„ Õ§ Õ¬Õ«Õ¶Õ« Õ¤Õ¡Õ¿Õ¡Ö€Õ¯.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>ÕÕ¥Ö€ Õ¨Õ¶Õ¿Ö€Õ¡Õ® Õ¡Ö€ÕªÕ¥Ö„Õ¨ Õ¡Õ¶Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬Õ« Õ§.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>Ô´Õ¸Ö‚Ö„ ÕºÕ¥Õ¿Ö„ Õ§ Õ¨Õ¶Õ¿Ö€Õ¥Ö„ Õ¡Õ´Õ¥Õ¶Õ¡Ö„Õ«Õ¹Õ¨ {{ limit }} Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¶Õ¥Ö€.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>Ô´Õ¸Ö‚Ö„ ÕºÕ¥Õ¿Ö„ Õ§ Õ¨Õ¶Õ¿Ö€Õ¥Ö„ Õ¸Õ¹ Õ¡Õ¾Õ¥Õ¬Õ« Ö„Õ¡Õ¶ {{ limit }} Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¶Õ¥Ö€.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>Õ„Õ¥Õ¯ Õ¯Õ¡Õ´ Õ¡Õ¾Õ¥Õ¬Õ« Õ¿Ö€Õ¾Õ¡Õ® Õ¡Ö€ÕªÕ¥Ö„Õ¶Õ¥Ö€Õ¨ Õ¡Õ¶Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬Õ« Õ¥Õ¶.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>{{ fields }} Õ¿Õ¸Õ²Õ¥Ö€Õ¨ Õ¹Õ§Õ«Õ¶ Õ½ÕºÕ¡Õ½Õ¾Õ¸Ö‚Õ´.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>{{ fields }} Õ¿Õ¸Õ²Õ¥Ö€Õ¨ Õ¢Õ¡ÖÕ¡Õ¯Õ¡ÕµÕ¸Ö‚Õ´ Õ¥Õ¶.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>Ô±Ö€ÕªÕ¥Ö„Õ¨ Õ½Õ­Õ¡Õ¬ Õ¡Õ´Õ½Õ¡Õ©Õ«Õ¾ Õ§.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>Ô±Õ´Õ½Õ¡Õ©Õ¾Õ« Ö‡ ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Õ« Õ¡Ö€ÕªÕ¥Ö„Õ¨ Õ¡Õ¶Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬Õ« Õ§.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>Ô·Õ¬-ÖƒÕ¸Õ½Õ¿Õ« Õ¡Ö€ÕªÕ¥Ö„Õ¨ Õ¡Õ¶Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬Õ« Õ§.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>Õ–Õ¡ÕµÕ¬Õ¨ Õ¹Õ« Õ£Õ¿Õ¶Õ¾Õ¥Õ¬.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>Õ–Õ¡ÕµÕ¬Õ¨ Õ¡Õ¶Õ¨Õ¶Õ©Õ¥Õ¼Õ¶Õ¥Õ¬Õ« Õ§.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Õ–Õ¡ÕµÕ¬Õ¨ Õ¹Õ¡ÖƒÕ¡Õ¦Õ¡Õ¶Ö Õ´Õ¥Õ® Õ§ ({{ size }} {{ suffix }}): Õ„Õ¡Ö„Õ½Õ«Õ´Õ¡Õ¬ Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬Õ« Õ¹Õ¡ÖƒÕ½Õ¨Õ {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>MIME-Õ¿Õ¥Õ½Õ¡Õ¯Õ¨ Õ¡Õ¶Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬Õ« Õ§({{ type }}): Õ–Õ¡ÕµÕ¬Õ¥Ö€Õ« Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬Õ« MIME-Õ¿Õ¥Õ½Õ¡Õ¯Õ¶Õ¥Ö€Õ¶ Õ¥Õ¶: {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>Ô±Ö€ÕªÕ¥Ö„Õ¨ ÕºÕ¥Õ¿Ö„ Õ§ Õ¬Õ«Õ¶Õ« {{ limit }} Õ¯Õ¡Õ´ ÖƒÕ¸Ö„Ö€.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>Ô±Ö€ÕªÕ¥Ö„Õ¨ Õ¹Õ¡ÖƒÕ¡Õ¦Õ¡Õ¶Ö Õ¥Ö€Õ¯Õ¡Ö€ Õ§: ÕŠÕ¥Õ¿Ö„ Õ§ Õ¬Õ«Õ¶Õ« {{ limit }} Õ¯Õ¡Õ´ Õ¡Õ¾Õ¥Õ¬ Õ½Õ«Õ´Õ¾Õ¸Õ¬Õ¶Õ¥Ö€.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>Ô±Ö€ÕªÕ¥Ö„Õ¨ ÕºÕ¥Õ¿ Õ§ Õ¬Õ«Õ¶Õ« {{ limit }} Õ¯Õ¡Õ´ Õ·Õ¡Õ¿.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>Ô±Ö€ÕªÕ¥Ö„Õ¨ Õ¹Õ¡ÖƒÕ¡Õ¦Õ¡Õ¶Ö Õ¯Õ¡Ö€Õ³ Õ§: ÕŠÕ¥Õ¿Ö„ Õ§ Õ¬Õ«Õ¶Õ« {{ limit }} Õ¯Õ¡Õ´ Õ¡Õ¾Õ¥Õ¬Õ« Õ½Õ«Õ´Õ¾Õ¸Õ¬Õ¶Õ¥Ö€.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>Ô±Ö€ÕªÕ¥Ö„Õ¨ Õ¹ÕºÕ¥Õ¿Ö„ Õ§ Õ¤Õ¡Õ¿Õ¡Ö€Õ¯ Õ¬Õ«Õ¶Õ«.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>Ô±Ö€ÕªÕ¥Ö„Õ¨ Õ¹ÕºÕ¥Õ¿Ö„ Õ§ Õ¬Õ«Õ¶Õ« null.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>Ô±Ö€ÕªÕ¥Ö„Õ¨ ÕºÕ¥Õ¿Ö„ Õ§ Õ¬Õ«Õ¶Õ« null.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>Ô±Õ¶Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬Õ« Õ¡Ö€ÕªÕ¥Ö„.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>ÔºÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Õ« Õ¡Ö€ÕªÕ¥Ö„Õ¨ Õ¡Õ¶Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬Õ« Õ§.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>Ô±Ö€ÕªÕ¥Ö„Õ¨  URL  Õ¹Õ§.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>ÔµÖ€Õ¯Õ¸Ö‚ Õ¡Ö€ÕªÕ¥Ö„Õ¶Õ¥Ö€Õ¨ ÕºÕ¥Õ¿Ö„ Õ§ Õ¶Õ¸Ö‚ÕµÕ¶Õ¨ Õ¬Õ«Õ¶Õ¥Õ¶.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Õ–Õ¡ÕµÕ¬Õ¨ Õ¹Õ¡ÖƒÕ¡Õ¦Õ¡Õ¶Ö Õ´Õ¥Õ® Õ§: Õ„Õ¡Ö„Õ½Õ«Õ´Õ¡Õ¬ Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬Õ« Õ¹Õ¡ÖƒÕ½Õ¨ {{ limit }} {{ suffix }} Õ§.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>Õ–Õ¡ÕµÕ¬Õ¨ Õ¹Õ¡ÖƒÕ¡Õ¦Õ¡Õ¶Ö Õ´Õ¥Õ® Õ§.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>Õ–Õ¡ÕµÕ¬Õ¨ Õ¹Õ« Õ¯Õ¡Ö€Õ¸Õ² Õ¢Õ¥Õ¼Õ¶Õ¾Õ¥Õ¬.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>Ô±Ö€ÕªÕ¥Ö„Õ¨ ÕºÕ¥Õ¿Ö„ Õ§ Õ¬Õ«Õ¶Õ« Õ©Õ«Õ¾.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This value is not a valid country.</source>
+                <target>Ô±Ö€ÕªÕ¥Ö„Õ¨ ÕºÕ¥Õ¿Ö„ Õ§ Õ¬Õ«Õ¶Õ« Õ¥Ö€Õ¯Õ«Ö€.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This file is not a valid image.</source>
+                <target>Õ–Õ¡ÕµÕ¬Õ¨ Õ¶Õ¯Õ¡Ö€Õ« Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬Õ« Ö†Õ¸Ö€Õ´Õ¡Õ¿ Õ¹Õ§.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This is not a valid IP address.</source>
+                <target>Ô±Ö€ÕªÕ¥Ö„Õ¨ Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬Õ« IP Õ°Õ¡Õ½ÖÕ¥ Õ¹Õ§.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid language.</source>
+                <target>Ô±Ö€ÕªÕ¥Ö„Õ¨ Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬Õ« Õ¬Õ¥Õ¦Õ¸Ö‚ Õ¹Õ§.</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid locale.</source>
+                <target>Ô±Ö€ÕªÕ¥Ö„Õ¨ Õ¹Õ« Õ°Õ¡Õ¶Õ¤Õ«Õ½Õ¡Õ¶Õ¸Ö‚Õ´ Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬Õ« Õ¿Õ¥Õ²Õ¡ÕµÕ¶Õ¡ÖÕ¸Ö‚Õ´.</target>
+            </trans-unit>
+            <trans-unit id="41">
+                <source>This value is already used.</source>
+                <target>Ô±ÕµÕ¤ Õ¡Ö€ÕªÕ¥Ö„Õ¨ Õ¡Ö€Õ¤Õ¥Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¾Õ¸Ö‚Õ´ Õ§.</target>
+            </trans-unit>
+            <trans-unit id="42">
+                <source>The size of the image could not be detected.</source>
+                <target>Õ†Õ¯Õ¡Ö€Õ« Õ¹Õ¡ÖƒÕ½Õ¥Ö€Õ¨ Õ¹Õ½Õ¿Õ¡ÖÕ¾Õ¥Ö Õ¸Ö€Õ¸Õ·Õ¥Õ¬.</target>
+            </trans-unit>
+            <trans-unit id="43">
+                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
+                <target>Õ†Õ¯Õ¡Ö€Õ« Õ¬Õ¡ÕµÕ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¹Õ¡ÖƒÕ¡Õ¦Õ¡Õ¶Ö Õ´Õ¥Õ® Õ§({{ width }}px). Õ„Õ¡Ö„Õ½Õ«Õ´Õ¡Õ¬ Õ¹Õ¡ÖƒÕ¶ Õ§ {{ max_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="44">
+                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
+                <target>Õ†Õ¯Õ¡Ö€Õ« Õ¬Õ¡ÕµÕ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¹Õ¡ÖƒÕ¡Õ¦Õ¡Õ¶Ö ÖƒÕ¸Ö„Ö€ Õ§ ({{ width }}px). Õ„Õ«Õ¶Õ«Õ´Õ¡Õ¬ Õ¹Õ¡ÖƒÕ¶ Õ§ {{ min_ width }}px.</target>
+            </trans-unit>
+            <trans-unit id="45">
+                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
+                <target>Õ†Õ¯Õ¡Ö€Õ« Õ¢Õ¡Ö€Õ±Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¹Õ¡ÖƒÕ¡Õ¦Õ¡Õ¶Ö Õ´Õ¥Õ® Õ§ ({{ height }}px). Õ„Õ¡Ö„Õ½Õ«Õ´Õ¡Õ¬ Õ¹Õ¡ÖƒÕ¶ Õ§ {{ max_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="46">
+                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
+                <target>Õ†Õ¯Õ¡Ö€Õ« Õ¢Õ¡Ö€Õ±Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¹Õ¡ÖƒÕ¡Õ¦Õ¡Õ¶Ö ÖƒÕ¸Ö„Ö€ Õ§ ({{ height }}px). Õ„Õ«Õ¶Õ«Õ´Õ¡Õ¬ Õ¹Õ¡ÖƒÕ¶ Õ§ {{ min_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="47">
+                <source>This value should be the user current password.</source>
+                <target>Ô±ÕµÕ½ Õ¡Ö€ÕªÕ¥Ö„Õ¨ ÕºÕ¥Õ¿Ö„ Õ§ Õ¬Õ«Õ¶Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¸Õ²Õ« Õ¶Õ¥Ö€Õ¯Õ¡ Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö€Õ¨.</target>
+            </trans-unit>
+            <trans-unit id="48">
+                <source>This value should have exactly {{ limit }} characters.</source>
+                <target>Ô±ÕµÕ½ Õ¡Ö€ÕªÕ¥Ö„Õ¨ ÕºÕ¥Õ¿Ö„ Õ§ Õ¸Ö‚Õ¶Õ¥Õ¶Õ¡ Õ³Õ«Õ·Õ¿ {{ limit }} Õ½Õ«Õ´Õ¾Õ¸Õ¬Õ¶Õ¥Ö€.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
\ No newline at end of file
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.id.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.id.xlf
new file mode 100644
index 0000000..4469a04
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.id.xlf
@@ -0,0 +1,187 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>Nilai ini harus salah.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>Nilai ini harus benar.</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>Nilai ini harus bertipe {{ type }}.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>Nilai ini harus kosong.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>Nilai ini harus salah satu dari pilihan yang diberikan.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>Anda harus memilih paling tidak {{ limit }} pilihan.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>Anda harus memilih paling banyak {{ limit }} pilihan.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>Satu atau lebih nilai yang diberikan tidak sah.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>Kolom {{ fields }} tidak seperti yang diharapkan.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>Kolom {{ fields }} hilang.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>Nilai ini bukan merupakan tanggal yang sah.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>Nilai ini bukan merupakan tanggal dan waktu yang sah.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>Nilai ini bukan alamat email yang sah.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>Berkas tidak ditemukan.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>Berkas tidak bisa dibaca.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Ukuran berkas terlalu besar ({{ size }} {{ suffix }}). Ukuran maksimum yang diijinkan adalah {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>Jenis berkas tidak sah ({{ type }}). Jenis berkas yang diijinkan adalah {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>Nilai ini harus {{ limit }} atau kurang.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>Nilai ini terlalu panjang. Seharusnya {{ limit }} karakter atau kurang.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>Nilai ini harus {{ limit }} atau lebih.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>Nilai ini terlalu pendek. Seharusnya {{ limit }} karakter atau lebih.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>Nilai ini tidak boleh kosong.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>Nilai ini tidak boleh 'null'.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>Nilai ini harus 'null'.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>Nilai ini tidak sah.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>Nilai ini bukan merupakan waktu yang sah.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>Nilai ini bukan URL yang sah.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>Isi keduanya harus sama.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Ukuran berkas terlalu besar. Ukuran maksimum yang diijinkan adalah {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>Ukuran berkas terlalu besar.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>Berkas tidak dapat diunggah.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>Nilai ini harus angka yang sah.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This file is not a valid image.</source>
+                <target>Berkas ini tidak termasuk gambar.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This is not a valid IP address.</source>
+                <target>Ini bukan alamat IP yang sah.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This value is not a valid language.</source>
+                <target>Nilai ini bukan bahasa yang sah.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid locale.</source>
+                <target>Nilai ini bukan lokal yang sah.</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid country.</source>
+                <target>Nilai ini bukan negara yang sah.</target>
+            </trans-unit>
+            <trans-unit id="41">
+                <source>This value is already used.</source>
+                <target>Nilai ini sudah digunakan.</target>
+            </trans-unit>
+            <trans-unit id="42">
+                <source>The size of the image could not be detected.</source>
+                <target>Ukuran dari gambar tidak bisa dideteksi.</target>
+            </trans-unit>
+            <trans-unit id="43">
+                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
+                <target>Lebar gambar terlalu besar ({{ width }}px). Ukuran lebar maksimum adalah {{ max_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="44">
+                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
+                <target>Lebar gambar terlalu kecil ({{ width}}px). Ukuran lebar minimum yang diharapkan adalah {{ min_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="45">
+                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
+                <target>Tinggi gambar terlalu besar ({{ height }}px). Ukuran tinggi maksimum adalah {{ max_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="46">
+                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
+                <target>Tinggi gambar terlalu kecil ({{ height }}px). Ukuran tinggi minimum yang diharapkan adalah {{ min_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="47">
+                <source>This value should be the user current password.</source>
+                <target>Nilai ini harus kata sandi pengguna saat ini.</target>
+            </trans-unit>
+            <trans-unit id="48">
+                <source>This value should have exactly {{ limit }} characters.</source>
+                <target>Nilai ini harus memiliki tepat {{ limit }} karakter.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.it.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.it.xlf
new file mode 100644
index 0000000..94725af
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.it.xlf
@@ -0,0 +1,219 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>Questo valore dovrebbe essere falso.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>Questo valore dovrebbe essere vero.</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>Questo valore dovrebbe essere di tipo {{ type }}.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>Questo valore dovrebbe essere vuoto.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>Questo valore dovrebbe essere una delle opzioni disponibili.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>Si dovrebbe selezionare almeno {{ limit }} opzione.|Si dovrebbero selezionare almeno {{ limit }} opzioni.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>Si dovrebbe selezionare al massimo {{ limit }} opzione.|Si dovrebbero selezionare al massimo {{ limit }} opzioni.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>Uno o piÃ¹ valori inseriti non sono validi.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>I campi {{ fields }} non sono validi.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>I campi {{ fields }} sono mancanti.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>Questo valore non Ã¨ una data valida.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>Questo valore non Ã¨ una data e ora valida.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>Questo valore non Ã¨ un indirizzo email valido.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>Non Ã¨ stato possibile trovare il file.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>Il file non Ã¨ leggibile.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Il file Ã¨ troppo grande ({{ size }} {{ suffix }}). La dimensione massima consentita Ã¨ {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>Il mime type del file non Ã¨ valido ({{ type }}). I tipi permessi sono {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>Questo valore dovrebbe essere {{ limit }} o inferiore.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>Questo valore Ã¨ troppo lungo. Dovrebbe essere al massimo di {{ limit }} carattere.|Questo valore Ã¨ troppo lungo. Dovrebbe essere al massimo di {{ limit }} caratteri.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>Questo valore dovrebbe essere {{ limit }} o superiore.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>Questo valore Ã¨ troppo corto. Dovrebbe essere almeno di {{ limit }} carattere.|Questo valore Ã¨ troppo corto. Dovrebbe essere almeno di {{ limit }} caratteri.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>Questo valore non dovrebbe essere vuoto.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>Questo valore non dovrebbe essere nullo.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>Questo valore dovrebbe essere nullo.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>Questo valore non Ã¨ valido.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>Questo valore non Ã¨ un'ora valida.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>Questo valore non Ã¨ un URL valido.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>I due valori dovrebbero essere uguali.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Il file Ã¨ troppo grande. La dimensione massima Ã¨ {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>Il file Ã¨ troppo grande.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>Il file non puÃ² essere caricato.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>Questo valore dovrebbe essere un numero.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This file is not a valid image.</source>
+                <target>Questo file non Ã¨ una immagine valida.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This is not a valid IP address.</source>
+                <target>Questo valore non Ã¨ un indirizzo IP valido.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This value is not a valid language.</source>
+                <target>Questo valore non Ã¨ una lingua valida.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid locale.</source>
+                <target>Questo valore non Ã¨ una impostazione regionale valida.</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid country.</source>
+                <target>Questo valore non Ã¨ una nazione valida.</target>
+            </trans-unit>
+            <trans-unit id="41">
+                <source>This value is already used.</source>
+                <target>Questo valore Ã¨ giÃ  stato utilizzato.</target>
+            </trans-unit>
+            <trans-unit id="42">
+                <source>The size of the image could not be detected.</source>
+                <target>La dimensione dell'immagine non puÃ² essere determinata.</target>
+            </trans-unit>
+            <trans-unit id="43">
+                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
+                <target>La larghezza dell'immagine Ã¨ troppo grande ({{ width }}px). La larghezza massima Ã¨ di {{ max_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="44">
+                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
+                <target>La larghezza dell'immagine Ã¨ troppo piccola ({{ width }}px). La larghezza minima Ã¨ di {{ min_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="45">
+                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
+                <target>L'altezza dell'immagine Ã¨ troppo grande ({{ height }}px). L'altezza massima Ã¨ di {{ max_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="46">
+                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
+                <target>L'altezza dell'immagine Ã¨ troppo piccola ({{ height }}px). L'altezza minima Ã¨ di {{ min_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="47">
+                <source>This value should be the user current password.</source>
+                <target>Questo valore dovrebbe essere la password attuale dell'utente.</target>
+            </trans-unit>
+            <trans-unit id="48">
+                <source>This value should have exactly {{ limit }} characters.</source>
+                <target>Questo valore dovrebbe contenere esattamente {{ limit }} carattere.|Questo valore dovrebbe contenere esattamente {{ limit }} caratteri.</target>
+            </trans-unit>
+            <trans-unit id="49">
+                <source>The file was only partially uploaded.</source>
+                <target>Il file Ã¨ stato caricato solo parzialmente.</target>
+            </trans-unit>
+            <trans-unit id="50">
+                <source>No file was uploaded.</source>
+                <target>Nessun file Ã¨ stato caricato.</target>
+            </trans-unit>
+            <trans-unit id="51">
+                <source>No temporary folder was configured in php.ini.</source>
+                <target>Nessuna cartella temporanea Ã¨ stata configurata nel php.ini.</target>
+            </trans-unit>
+            <trans-unit id="52">
+                <source>Cannot write temporary file to disk.</source>
+                <target>Impossibile scrivere il file temporaneo sul disco.</target>
+            </trans-unit>
+            <trans-unit id="53">
+                <source>A PHP extension caused the upload to fail.</source>
+                <target>Un'estensione PHP ha causato il fallimento del caricamento.</target>
+            </trans-unit>
+            <trans-unit id="54">
+                <source>This collection should contain {{ limit }} elements or more.</source>
+                <target>Questa collezione dovrebbe contenere almeno {{ limit }} elemento.|Questa collezione dovrebbe contenere almeno {{ limit }} elementi.</target>
+            </trans-unit>
+            <trans-unit id="55">
+                <source>This collection should contain {{ limit }} elements or less.</source>
+                <target>Questa collezione dovrebbe contenere massimo {{ limit }} elemento.|Questa collezione dovrebbe contenere massimo {{ limit }} elementi.</target>
+            </trans-unit>
+            <trans-unit id="56">
+                <source>This collection should contain exactly {{ limit }} elements.</source>
+                <target>Questa collezione dovrebbe contenere esattamente {{ limit }} elemento.|Questa collezione dovrebbe contenere esattamente {{ limit }} elementi.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.ja.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.ja.xlf
new file mode 100644
index 0000000..c8b4632
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.ja.xlf
@@ -0,0 +1,151 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>å€¤ã¯falseã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>å€¤ã¯trueã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“.</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>å€¤ã®åž‹ã¯{{ type }}ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>å€¤ã¯ç©ºã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>é¸æŠžã•ã‚ŒãŸå€¤ã¯é¸æŠžè‚¢ã¨ã—ã¦æœ‰åŠ¹ãªå€¤ã§ã¯ã‚ã‚Šã¾ã›ã‚“.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>{{ limit }}å€‹ä»¥ä¸Šé¸æŠžã—ã¦ãã ã•ã„.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>{{ limit }}å€‹ä»¥å†…ã§é¸æŠžã—ã¦ãã ã•ã„.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>1ã¤ã¾ãŸã¯è¤‡æ•°ã®é¸æŠžã•ã‚ŒãŸå€¤ãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰{{ fields }}ã¯ç„¡åŠ¹ã§ã™.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰{{ fields }}ã¯å¿…é ˆã§ã™.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>å€¤ãŒæœ‰åŠ¹ãªæ—¥ä»˜ã§ã¯ã‚ã‚Šã¾ã›ã‚“.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>å€¤ãŒæœ‰åŠ¹ãªæ—¥æ™‚ã§ã¯ã‚ã‚Šã¾ã›ã‚“.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>å€¤ãŒæœ‰åŠ¹ãªãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>ãƒ•ã‚¡ã‚¤ãƒ«ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>ãƒ•ã‚¡ã‚¤ãƒ«ã‚’èª­ã¿è¾¼ã‚ã¾ã›ã‚“.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚µã‚¤ã‚ºãŒå¤§ãã™ãŽã¾ã™({{ size }} {{ suffix }})ã€‚æœ‰åŠ¹ãªæœ€å¤§ã‚µã‚¤ã‚ºã¯{{ limit }} {{ suffix }}ã§ã™.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>ãƒ•ã‚¡ã‚¤ãƒ«ã®MIMEã‚¿ã‚¤ãƒ—ãŒç„¡åŠ¹ã§ã™({{ type }})ã€‚æœ‰åŠ¹ãªMIMEã‚¿ã‚¤ãƒ—ã¯{{ types }}ã§ã™.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>å€¤ã¯{{ limit }}ä»¥ä¸‹ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>å€¤ãŒé•·ã™ãŽã¾ã™ã€‚{{ limit }}æ–‡å­—ä»¥å†…ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>å€¤ã¯{{ limit }}ä»¥ä¸Šã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>å€¤ãŒçŸ­ã™ãŽã¾ã™ã€‚{{ limit }}æ–‡å­—ä»¥ä¸Šã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>å€¤ãŒç©ºã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>å€¤ãŒnullã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>å€¤ã¯nullã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>å€¤ãŒç„¡åŠ¹ã§ã™.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>å€¤ãŒæœ‰åŠ¹ãªæ™‚åˆ»ã§ã¯ã‚ã‚Šã¾ã›ã‚“.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>å€¤ãŒæœ‰åŠ¹ãªURLã§ã¯ã‚ã‚Šã¾ã›ã‚“.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>2ã¤ã®å€¤ãŒåŒã˜ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>This value is not a valid country.</source>
+                <target>å€¤ã¯æœ‰åŠ¹ãªå›½åã§ã¯ã‚ã‚Šã¾ã›ã‚“.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚µã‚¤ã‚ºãŒå¤§ãã™ãŽã¾ã™ã€‚æœ‰åŠ¹ãªæœ€å¤§ã‚µã‚¤ã‚ºã¯{{ limit }} {{ suffix }}ã§ã™.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file is too large.</source>
+                <target>ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚µã‚¤ã‚ºãŒå¤§ãã™ãŽã¾ã™.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>The file could not be uploaded.</source>
+                <target>ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ã‚¢ãƒƒãƒ—ãƒ­ãƒ¼ãƒ‰ã§ãã¾ã›ã‚“ã§ã—ãŸ.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This file is not a valid image.</source>
+                <target>ãƒ•ã‚¡ã‚¤ãƒ«ãŒç”»åƒã§ã¯ã‚ã‚Šã¾ã›ã‚“.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This is not a valid IP address.</source>
+                <target>å€¤ã¯æœ‰åŠ¹ãªIPã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This value is not a valid language.</source>
+                <target>å€¤ã¯æœ‰åŠ¹ãªè¨€èªžåã§ã¯ã‚ã‚Šã¾ã›ã‚“.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid locale.</source>
+                <target>å€¤ã¯æœ‰åŠ¹ãªãƒ­ã‚±ãƒ¼ãƒ«ã§ã¯ã‚ã‚Šã¾ã›ã‚“.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.lb.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.lb.xlf
new file mode 100644
index 0000000..63db49d
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.lb.xlf
@@ -0,0 +1,131 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>DÃ«se WÃ¤ert sollt falsch sinn.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>DÃ«se WÃ¤ert sollt wouer sinn.</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>DÃ«se WÃ¤ert sollt vum Typ {{ type }} sinn.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>DÃ«se WÃ¤ert sollt eidel sinn.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>DÃ«se WÃ¤ert sollt enger vun de WielmÃ©iglechkeeten entspriechen.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>Dir sollt mindestens {{ limit }} MÃ©iglechkeete wielen.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>Dir sollt hÃ©chstens {{ limit }} MÃ©iglechkeete wielen.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>One or more of the given values is invalid.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>D'Felder {{ fields }} goufen net erwaart.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>D'Felder {{ fields }} feelen.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>DÃ«se WÃ¤ert entsprÃ©cht kenger gÃ«lteger Datumsangab.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>DÃ«se WÃ¤ert entsprÃ©cht kenger gÃ«lteger Datums- an ZÃ¤itangab.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>DÃ«se WÃ¤ert ass keng gÃ«lteg Email-Adress.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>De Fichier gouf net fonnt.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>De Fichier ass net liesbar.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>De Fichier ass ze grouss ({{ size }} {{ suffix }}). DÃ©i zougeloosse MaximalgrÃ©isst bedrÃ©it {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>Den Typ vum Fichier ass ongÃ«lteg ({{ type }}). Erlaabten Type sinn {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>DÃ«se WÃ¤ert soll mÃ©i kleng oder glÃ¤ich {{ limit }} sinn.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>DÃ«s Zeecheketten ass ze laang. Se sollt hÃ©chstens {{ limit }} Zeechen hunn.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>DÃ«se WÃ¤ert sollt mÃ©i grouss oder glÃ¤ich {{ limit }} sinn.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>DÃ«s Zeecheketten ass ze kuerz. Se sollt mindestens {{ limit }} Zeechen hunn.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>DÃ«se WÃ¤ert sollt net eidel sinn.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>DÃ«st sollt keen Null-WÃ¤ert sinn.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>DÃ«st sollt keen Null-WÃ¤ert sinn.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>DÃ«se WÃ¤ert ass net gÃ«lteg.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>DÃ«se WÃ¤ert entsprÃ©cht kenger gÃ«lteger ZÃ¤itangab.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>DÃ«se WÃ¤ert ass keng gÃ«lteg URL.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>BÃ©id WÃ¤erter sollten identesch sinn.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>De fichier ass ze grouss. DÃ©i maximal GrÃ©isst dierf {{ limit }} {{ suffix }} net depassÃ©ieren.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>De Fichier ass ze grouss.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>De Fichier konnt net eropgeluede ginn.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
\ No newline at end of file
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.lt.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.lt.xlf
new file mode 100644
index 0000000..140e697
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.lt.xlf
@@ -0,0 +1,219 @@
+ï»¿<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>ReikÅ¡mÄ— turi bÅ«ti neigiama.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>ReikÅ¡mÄ— turi bÅ«ti teigiama.</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>Å ios reikÅ¡mÄ—s tipas turi bÅ«ti {{ type }}.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>Å i reikÅ¡mÄ— turi bÅ«ti tuÅ¡Äia.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>Neteisingas pasirinkimas.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>Turite pasirinkti bent {{ limit }} variantÄ….|Turite pasirinkti bent {{ limit }} variantus.|Turite pasirinkti bent {{ limit }} variantÅ³.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>Turite pasirinkti ne daugiau kaip {{ limit }} variantÄ….|Turite pasirinkti ne daugiau kaip {{ limit }} variantus.|Turite pasirinkti ne daugiau kaip {{ limit }} variantÅ³.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>Viena ar daugiau Ä¯vestÅ³ reikÅ¡miÅ³ yra netinkamos.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>Laukai {{ fields }} yra nenumatyti.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>TrÅ«kstami laukai {{ fields }}.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>Å i reikÅ¡mÄ— nÄ—ra data.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>Å i reikÅ¡mÄ— nera data ir laikas.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>Å i reikÅ¡mÄ— nÄ—ra tinkamas el. paÅ¡to adresas.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>Byla nerasta.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>Negalima nuskaityti bylos.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Byla yra per didelÄ— ({{ size }} {{ suffix }}). Maksimalus dydis {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>Netinkamas bylos tipas (mime type) ({{ type }}). Galimi bylÅ³ tipai {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>ReikÅ¡mÄ— turi bÅ«ti {{ limit }} arba maÅ¾iau.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>Per didelis simboliÅ³ skaiÄius. Turi susidaryti iÅ¡ {{ limit }} arba maÅ¾iau simboliÅ³.|Per didelis simboliÅ³ skaiÄius. Turi susidaryti iÅ¡ {{ limit }} arba maÅ¾iau simboliÅ³.|Per didelis simboliÅ³ skaiÄius. Turi susidaryti iÅ¡ {{ limit }} arba maÅ¾iau simboliÅ³.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>ReikÅ¡mÄ— turi bÅ«ti {{ limit }} arba daugiau.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>Per maÅ¾as simboliÅ³ skaiÄius. Turi susidaryti iÅ¡ {{ limit }} arba daugiau simboliÅ³.|Per maÅ¾as simboliÅ³ skaiÄius. Turi susidaryti iÅ¡ {{ limit }} arba daugiau simboliÅ³.|Per maÅ¾as simboliÅ³ skaiÄius. Turi susidaryti iÅ¡ {{ limit }} arba daugiau simboliÅ³.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>Å i reikÅ¡mÄ— negali bÅ«ti tuÅ¡Äia.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>Å i reikÅ¡mÄ— negali bÅ«ti null.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>Å i reikÅ¡mÄ— turi bÅ«ti null.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>Netinkama reikÅ¡mÄ—.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>Å i reikÅ¡mÄ— nÄ—ra laikas.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>Å i reikÅ¡mÄ— nÄ—ra tinkamas interneto adresas.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>Abi reikÅ¡mÄ—s turi bÅ«ti identiÅ¡kos.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Byla yra per didelÄ—. Maksimalus dydis yra {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>Byla per didelÄ—.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>Byla negali bÅ«ti Ä¯kelta.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>Å i reikÅ¡mÄ— turi bÅ«ti skaiÄius.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This value is not a valid country.</source>
+                <target>Å i reikÅ¡mÄ— nÄ—ra tinkama Å¡alis.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This file is not a valid image.</source>
+                <target>Byla nÄ—ra paveikslÄ—lis.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This is not a valid IP address.</source>
+                <target>Å i reikÅ¡mÄ— nÄ—ra tinkamas IP adresas.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid language.</source>
+                <target>Å i reikÅ¡mÄ— nÄ—ra tinkama kalba.</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid locale.</source>
+                <target>Å i reikÅ¡mÄ— nÄ—ra tinkama lokalÄ—.</target>
+            </trans-unit>
+            <trans-unit id="41">
+                <source>This value is already used.</source>
+                <target>Å i reikÅ¡mÄ— jau yra naudojama.</target>
+            </trans-unit>
+            <trans-unit id="42">
+                <source>The size of the image could not be detected.</source>
+                <target>Nepavyko nustatyti nuotraukos dydÅ¾io.</target>
+            </trans-unit>
+            <trans-unit id="43">
+                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
+                <target>Nuotraukos plotis per didelis ({{ width }}px). Maksimalus leidÅ¾iamas plotis yra {{ max_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="44">
+                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
+                <target>Nuotraukos plotis per maÅ¾as ({{ width }}px). Minimalus leidÅ¾iamas plotis yra {{ min_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="45">
+                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
+                <target>Nuotraukos aukÅ¡tis per didelis ({{ height }}px). Maksimalus leidÅ¾iamas aukÅ¡tis yra {{ max_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="46">
+                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
+                <target>Nuotraukos aukÅ¡tis per maÅ¾as ({{ height }}px). Minimalus leidÅ¾iamas aukÅ¡tis yra {{ min_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="47">
+                <source>This value should be the user current password.</source>
+                <target>Å i reikÅ¡mÄ— turi sutapti su dabartiniu vartotojo slaptaÅ¾odÅ¾iu.</target>
+            </trans-unit>
+            <trans-unit id="48">
+                <source>This value should have exactly {{ limit }} characters.</source>
+                <target>Å i reikÅ¡mÄ— turi turÄ—ti lygiai {{ limit }} simbolÄ¯.|Å i reikÅ¡mÄ— turi turÄ—ti lygiai {{ limit }} simbolius.|Å i reikÅ¡mÄ— turi turÄ—ti lygiai {{ limit }} simboliÅ³.</target>
+            </trans-unit>
+            <trans-unit id="49">
+                <source>The file was only partially uploaded.</source>
+                <target>Failas buvo tik dalinai Ä¯keltas.</target>
+            </trans-unit>
+            <trans-unit id="50">
+                <source>No file was uploaded.</source>
+                <target>Nebuvo Ä¯kelta jokiÅ³ failÅ³.</target>
+            </trans-unit>
+            <trans-unit id="51">
+                <source>No temporary folder was configured in php.ini.</source>
+                <target>NÄ—ra sukonfiguruoto jokio laikino katalogo php.ini faile.</target>
+            </trans-unit>
+            <trans-unit id="52">
+                <source>Cannot write temporary file to disk.</source>
+                <target>Nepavyko iÅ¡saugoti laikino failo.</target>
+            </trans-unit>
+            <trans-unit id="53">
+                <source>A PHP extension caused the upload to fail.</source>
+                <target>PHP plÄ—tinys sutrukdÄ— failo Ä¯kÄ—limÄ… ir jis nepavyko.</target>
+            </trans-unit>
+            <trans-unit id="54">
+                <source>This collection should contain {{ limit }} elements or more.</source>
+                <target>SÄ…raÅ¡e turi bÅ«ti {{ limit }} arba daugiau Ä¯raÅ¡Å³.|SÄ…raÅ¡e turi bÅ«ti {{ limit }} arba daugiau Ä¯raÅ¡Å³.|SÄ…raÅ¡e turi bÅ«ti {{ limit }} arba daugiau Ä¯raÅ¡Å³.</target>
+            </trans-unit>
+            <trans-unit id="55">
+                <source>This collection should contain {{ limit }} elements or less.</source>
+                <target>SÄ…raÅ¡e turi bÅ«ti {{ limit }} arba maÅ¾iau Ä¯raÅ¡Å³.|SÄ…raÅ¡e turi bÅ«ti {{ limit }} arba maÅ¾iau Ä¯raÅ¡Å³.|SÄ…raÅ¡e turi bÅ«ti {{ limit }} arba maÅ¾iau Ä¯raÅ¡Å³.</target>
+            </trans-unit>
+            <trans-unit id="56">
+                <source>This collection should contain exactly {{ limit }} elements.</source>
+                <target>SÄ…raÅ¡e turi bÅ«ti lygiai {{ limit }} Ä¯raÅ¡as.|SÄ…raÅ¡e turi bÅ«ti lygiai {{ limit }} Ä¯raÅ¡ai.|SÄ…raÅ¡e turi bÅ«ti lygiai {{ limit }} Ä¯raÅ¡Å³.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.mn.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.mn.xlf
new file mode 100644
index 0000000..ab4ab09
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.mn.xlf
@@ -0,0 +1,151 @@
+ï»¿<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>Ð­Ð½Ñ ÑƒÑ‚Ð³Ð° Ð±ÑƒÑ€ÑƒÑƒ Ð±Ð°Ð¹Ñ… Ñ‘ÑÑ‚Ð¾Ð¹.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>Ð­Ð½Ñ ÑƒÑ‚Ð³Ð° Ò¯Ð½ÑÐ½ Ð±Ð°Ð¹Ñ… Ñ‘ÑÑ‚Ð¾Ð¹.</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>Ð­Ð½Ñ ÑƒÑ‚Ð³Ð°  {{ type }} -Ð½ Ñ‚Ó©Ñ€Ó©Ð» Ð±Ð°Ð¹Ñ… Ñ‘ÑÑ‚Ð¾Ð¹.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>Ð­Ð½Ñ ÑƒÑ‚Ð³Ð° Ñ…Ð¾Ð¾ÑÐ¾Ð½ Ð±Ð°Ð¹Ñ… Ñ‘ÑÑ‚Ð¾Ð¹.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>Ð¡Ð¾Ð½Ð³Ð¾ÑÐ¾Ð½ ÑƒÑ‚Ð³Ð° Ð±ÑƒÑ€ÑƒÑƒ Ð±Ð°Ð¹Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>Ð¥Ð°Ð¼Ð³Ð¸Ð¹Ð½ Ð±Ð°Ð³Ð°Ð´Ð°Ð° {{ limit }} ÑƒÑ‚Ð³Ð° ÑÐ¾Ð½Ð³Ð¾Ð³Ð´ÑÐ¾Ð½ Ð±Ð°Ð¹Ñ… Ñ‘ÑÑ‚Ð¾Ð¹.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>Ð¥Ð°Ð¼Ð³Ð¸Ð¹Ð½ Ð¸Ñ…Ð´ÑÑ {{ limit }} ÑƒÑ‚Ð³Ð° ÑÐ¾Ð½Ð³Ð¾Ð³Ð´Ð¾Ñ… Ð±Ð¾Ð»Ð¾Ð¼Ð¶Ñ‚Ð¾Ð¹.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>Ó¨Ð³Ó©Ð³Ð´ÑÓ©Ð½ Ð½ÑÐ³ ÑÑÐ²ÑÐ» Ð½ÑÐ³ÑÑÑ Ð¾Ð»Ð¾Ð½ ÑƒÑ‚Ð³Ð° Ð±ÑƒÑ€ÑƒÑƒ Ð±Ð°Ð¹Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>Ð¢Ð°Ð»Ð±Ð°Ñ€ÑƒÑƒÐ´ {{ fields }} Ð·Ó©Ð²ÑˆÓ©Ó©Ñ€Ó©Ð³Ð´Ó©Ó©Ð³Ò¯Ð¹ Ð±Ð°Ð¹Ð½Ð°.</source>
+                <target>{{ fields }}.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>{{ fields }} Ñ‚Ð°Ð»Ð±Ð°Ñ€ÑƒÑƒÐ´ Ð´ÑƒÑ‚ÑƒÑƒ Ð±Ð°Ð¹Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>Ð­Ð½Ñ ÑƒÑ‚Ð³Ð° Ð±ÑƒÑ€ÑƒÑƒ date Ñ‚Ó©Ñ€Ó©Ð» Ð±Ð°Ð¹Ð½Ð° .</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>Ð­Ð½Ñ ÑƒÑ‚Ð³Ð° Ð±ÑƒÑ€ÑƒÑƒ Ñ†Ð°Ð³ Ñ‚Ó©Ñ€Ó©Ð» Ð±Ð°Ð¹Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>Ð˜-Ð¼Ð°Ð¹Ð» Ñ…Ð°ÑÐ³ Ð±ÑƒÑ€ÑƒÑƒ Ð±Ð°Ð¹Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>Ð¤Ð°Ð¹Ð» Ð¾Ð»Ð´ÑÐ¾Ð½Ð³Ò¯Ð¹.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>Ð¤Ð°Ð¹Ð» ÑƒÐ½ÑˆÐ¸Ð³Ð´Ð°Ñ…ÑƒÐ¹Ñ† Ð±Ð¸Ñˆ Ð±Ð°Ð¹Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Ð¤Ð°Ð¹Ð» Ñ…ÑÑ‚ÑÑ€Ñ…Ð¸Ð¹ Ñ‚Ð¾Ð¼ Ð±Ð°Ð¹Ð½Ð° ({{ size }} {{ suffix }}). Ð—Ó©Ð²ÑˆÓ©Ó©Ñ€Ó©Ð³Ð´Ó©Ñ… Ð´ÑÑÐ´ Ñ…ÑÐ¼Ð¶ÑÑ  {{ limit }} {{ suffix }} Ð±Ð°Ð¹Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>Ð¤Ð°Ð¹Ð»Ñ‹Ð½ MIME-Ñ‚Ó©Ñ€Ó©Ð» Ð½ÑŒ Ð±ÑƒÑ€ÑƒÑƒ Ð±Ð°Ð¹Ð½Ð° ({{ type }}). Ð—Ó©Ð²ÑˆÓ©Ó©Ñ€Ó©Ð³Ð´Ó©Ñ… MIME-Ñ‚Ó©Ñ€Ð»Ò¯Ò¯Ð´ {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>Ð­Ð½Ñ ÑƒÑ‚Ð³Ð°  {{ limit }} ÑŽÐ¼ÑƒÑƒ ÑÑÐ²ÑÐ» Ð±Ð°Ð³Ð° Ð±Ð°Ð¹Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>Ð­Ð½Ñ ÑƒÑ‚Ð³Ð° Ñ…ÑÑ‚ÑÑ€Ñ…Ð¸Ð¹ ÑƒÑ€Ñ‚ Ð±Ð°Ð¹Ð½Ð°. {{ limit }} Ñ‚ÑÐ¼Ð´ÑÐ³Ñ‚Ð¸Ð¹Ð½ ÑƒÑ€Ñ‚Ñ‚Ð°Ð¹ ÑŽÐ¼ÑƒÑƒ ÑÑÐ²ÑÐ» Ð±Ð°Ð³Ð° Ð±Ð°Ð¹Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>Ð­Ð½Ñ ÑƒÑ‚Ð³Ð° {{ limit }} ÑŽÐ¼ÑƒÑƒ ÑÑÐ²ÑÐ» Ð¸Ñ… Ð±Ð°Ð¹Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>Ð­Ð½Ñ ÑƒÑ‚Ð³Ð° Ñ…ÑÑ‚ÑÑ€Ñ…Ð¸Ð¹ Ð±Ð¾Ð³Ð¸Ð½Ð¾ Ð±Ð°Ð¹Ð½Ð°. {{ limit }} Ñ‚ÑÐ¼Ð´ÑÐ³Ñ‚ ÑÑÐ²ÑÐ» Ð¸Ñ… Ð±Ð°Ð¹Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>Ð­Ð½Ñ ÑƒÑ‚Ð³Ð° Ñ…Ð¾Ð¾ÑÐ¾Ð½ Ð±Ð°Ð¹Ð¶ Ð±Ð¾Ð»Ð¾Ñ…Ð³Ò¯Ð¹.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>Ð­Ð½Ñ ÑƒÑ‚Ð³Ð° null Ð±Ð°Ð¹Ð¶ Ð±Ð¾Ð»Ð¾Ñ…Ð³Ò¯Ð¹.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>Ð­Ð½Ñ ÑƒÑ‚Ð³Ð° null Ð±Ð°Ð¹Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>Ð­Ð½Ñ ÑƒÑ‚Ð³Ð° Ð±ÑƒÑ€ÑƒÑƒ Ð±Ð°Ð¹Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>Ð­Ð½Ñ ÑƒÑ‚Ð³Ð° Ð±ÑƒÑ€ÑƒÑƒ Ñ†Ð°Ð³ Ñ‚Ó©Ñ€Ó©Ð» Ð±Ð°Ð¹Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>Ð­Ð½Ñ ÑƒÑ‚Ð³Ð° Ð±ÑƒÑ€ÑƒÑƒ URL Ð±Ð°Ð¹Ð½Ð° .</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>Ð¥Ð¾Ñ‘Ñ€ ÑƒÑ‚Ð³ÑƒÑƒÐ´ Ð¸Ð¶Ð¸Ð» Ð±Ð°Ð¹Ñ… Ñ‘ÑÑ‚Ð¾Ð¹.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Ð¤Ð°Ð¹Ð» Ñ…ÑÑ‚ÑÑ€Ñ…Ð¸Ð¹ Ñ‚Ð¾Ð¼ Ð±Ð°Ð¹Ð½Ð°. Ð—Ó©Ð²ÑˆÓ©Ó©Ñ€Ó©Ð³Ð´Ó©Ñ… Ð´ÑÑÐ´ Ñ…ÑÐ¼Ð¶ÑÑ Ð½ÑŒ {{ limit }} {{ suffix }} Ð±Ð°Ð¹Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>Ð¤Ð°Ð¹Ð» Ñ…ÑÑ‚ÑÑ€Ñ…Ð¸Ð¹ Ñ‚Ð¾Ð¼ Ð±Ð°Ð¹Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>Ð¤Ð°Ð¹Ð» upload Ñ…Ð¸Ð¹Ð³Ð´ÑÑÐ½Ð³Ò¯Ð¹.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>Ð­Ð½Ñ ÑƒÑ‚Ð³Ð° Ð·Ó©Ð²Ñ…Ó©Ð½ Ñ‚Ð¾Ð¾ Ð±Ð°Ð¹Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This value is not a valid country.</source>
+                <target>Ð­Ð½Ñ ÑƒÑ‚Ð³Ð° Ò¯Ð½ÑÐ½ Ð±Ð¾Ð´Ð¸Ñ‚ ÑƒÐ»Ñ Ð±Ð¸Ñˆ Ð±Ð°Ð¹Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This file is not a valid image.</source>
+                <target>Ð¤Ð°Ð¹Ð» Ð·ÑƒÑ€Ð°Ð³ Ð±Ð¸Ñˆ Ð±Ð°Ð¹Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This is not a valid IP address.</source>
+                <target>IP Ñ…Ð°ÑÐ³ Ð·Ó©Ð² Ð±Ð¸Ñˆ Ð±Ð°Ð¹Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid language.</source>
+                <target>Ð­Ð½Ñ ÑƒÑ‚Ð³Ð° Ò¯Ð½ÑÐ½ Ð·Ó©Ð² Ñ…ÑÐ» Ð±Ð¸Ñˆ Ð±Ð°Ð¹Ð½Ð° .</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.nb.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.nb.xlf
new file mode 100644
index 0000000..248c642
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.nb.xlf
@@ -0,0 +1,155 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>Verdien skal vÃ¦re falsk.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>Verdien skal vÃ¦re sann.</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>Verdien skal vÃ¦re av typen {{ type }}.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>Verdien skal vÃ¦re blank.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>Verdien skal vÃ¦re en av de gitte valg.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>Du skal velge minst {{ limit }} valg.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>Du kan maks velge {{ limit }} valg.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>En eller flere av de oppgitte verdier er ugyldige.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>Feltene {{ fields }} var ikke forventet.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>Feltene {{ fields }} mangler.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>Verdien er ikke en gyldig dato.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>Verdien er ikke en gyldig dato og tid.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>Verdien er ikke en gyldig e-mail adresse.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>Filen kunne ikke finnes.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>Filen kan ikke leses.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Filen er for stor ({{ size }} {{ suffix }}). Tilatte maksimale stÃ¸rrelse {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>Mimetypen av filen er ugyldig ({{ type }}). Tilatte mimetyper er {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>Verdien skal vÃ¦re {{ limit }} eller mindre.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>Verdien er for lang. Den skal ha {{ limit }} bokstaver eller mindre.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>Verdien skal vÃ¦re {{ limit }} eller mer.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>Verdien er for kort. Den skal ha {{ limit }} tegn eller flere.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>Verdien mÃ¥ ikke vÃ¦re blank.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>Verdien mÃ¥ ikke vÃ¦re tom (null).</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>Verdien skal vÃ¦re tom (null).</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>Verdien er ikke gyldig.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>Verdien er ikke en gyldig tid.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>Verdien er ikke en gyldig URL.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>De to verdier skal vÃ¦re ens.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Filen er for stor. Den maksimale stÃ¸rrelse er {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>Filen er for stor.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>Filen kunne ikke lastes opp.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>Denne verdi skal vÃ¦re et gyldig tall.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This file is not a valid image.</source>
+                <target>Denne filen er ikke et gyldig bilde.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This is not a valid IP address.</source>
+                <target>Dette er ikke en gyldig IP adresse.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This value is not a valid language.</source>
+                <target>Denne verdi er ikke et gyldig sprÃ¥k.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid locale.</source>
+                <target>Denne verdi er ikke en gyldig lokalitet.</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid country.</source>
+                <target>Denne verdi er ikke et gyldig land.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.nl.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.nl.xlf
new file mode 100644
index 0000000..90bde0b
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.nl.xlf
@@ -0,0 +1,219 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>Deze waarde mag niet waar zijn.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>Deze waarde moet waar zijn.</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>Deze waarde moet van het type {{ type }} zijn.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>Deze waarde moet leeg zijn.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>De geselecteerde waarde is geen geldige optie.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>Selecteer ten minste {{ limit }} optie.|Selecteer ten minste {{ limit }} opties.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>Selecteer maximaal {{ limit }} optie.|Selecteer maximaal {{ limit }} opties.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>EÃ©n of meer van de ingegeven waarden zijn ongeldig.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>De velden {{ fields }} werden niet verwacht.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>De velden {{ fields }} ontbreken.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>Deze waarde is geen geldige datum.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>Deze waarde is geen geldige datum en tijd.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>Deze waarde is geen geldig e-mailadres.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>Het bestand is niet gevonden.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>Het bestand is niet leesbaar.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Het bestand is te groot ({{ size }} {{ suffix }}). Toegestane maximum grootte is {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>Het mime type van het bestand is ongeldig ({{ type }}). Toegestane mime types zijn {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>Deze waarde moet {{ limit }} of minder zijn.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>Deze waarde is te lang. Hij mag maximaal {{ limit }} teken bevatten.|Deze waarde is te lang. Hij mag maximaal {{ limit }} tekens bevatten.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>Deze waarde moet {{ limit }} of meer zijn.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>Deze waarde is te kort. Hij moet tenminste {{ limit }} teken bevatten.|Deze waarde is te kort. Hij moet tenminste {{ limit }} tekens bevatten.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>Deze waarde mag niet leeg zijn.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>Deze waarde mag niet null zijn.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>Deze waarde moet null zijn.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>Deze waarde is ongeldig.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>Deze waarde is geen geldige tijd.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>Deze waarde is geen geldige URL.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>De twee waarden moeten gelijk zijn.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Het bestand is te groot. Toegestane maximum grootte is {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>Het bestand is te groot.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>Het bestand kon niet geÃ¼pload worden.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>Deze waarde moet een geldig getal zijn.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This file is not a valid image.</source>
+                <target>Dit bestand is geen geldige afbeelding.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This is not a valid IP address.</source>
+                <target>Dit is geen geldig IP-adres.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This value is not a valid language.</source>
+                <target>Deze waarde representeert geen geldige taal.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid locale.</source>
+                <target>Deze waarde representeert geen geldige lokalisering.</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid country.</source>
+                <target>Deze waarde representeert geen geldig land.</target>
+            </trans-unit>
+            <trans-unit id="41">
+                <source>This value is already used.</source>
+                <target>Deze waarde wordt al gebruikt.</target>
+            </trans-unit>
+            <trans-unit id="42">
+                <source>The size of the image could not be detected.</source>
+                <target>De grootte van de afbeelding kon niet bepaald worden.</target>
+            </trans-unit>
+            <trans-unit id="43">
+                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
+                <target>De afbeelding is te breed ({{ width }}px). De maximaal toegestane breedte is {{ max_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="44">
+                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
+                <target>De afbeelding is niet breed genoeg ({{ width }}px). De minimaal verwachte breedte is {{ min_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="45">
+                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
+                <target>De afbeelding is te hoog ({{ height }}px). De maximaal toegestane hoogte is {{ max_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="46">
+                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
+                <target>De afbeelding is niet hoog genoeg ({{ height }}px). De minimaal verwachte hoogte is {{ min_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="47">
+                <source>This value should be the user current password.</source>
+                <target>Deze waarde moet het huidige wachtwoord van de gebruiker zijn.</target>
+            </trans-unit>
+            <trans-unit id="48">
+                <source>This value should have exactly {{ limit }} characters.</source>
+                <target>Deze waarde moet exact {{ limit }} tekens lang zijn.</target>
+            </trans-unit>
+            <trans-unit id="49">
+                <source>The file was only partially uploaded.</source>
+                <target>Het bestand is niet geheel geÃ¼pload.</target>
+            </trans-unit>
+            <trans-unit id="50">
+                <source>No file was uploaded.</source>
+                <target>Er is geen bestand geÃ¼pload.</target>
+            </trans-unit>
+            <trans-unit id="51">
+                <source>No temporary folder was configured in php.ini.</source>
+                <target>Er is geen tijdelijke map geconfigureerd in php.ini.</target>
+            </trans-unit>
+            <trans-unit id="52">
+                <source>Cannot write temporary file to disk.</source>
+                <target>Kan het tijdelijke bestand niet wegschrijven op disk.</target>
+            </trans-unit>
+            <trans-unit id="53">
+                <source>A PHP extension caused the upload to fail.</source>
+                <target>De upload is mislukt vanwege een PHP-extensie.</target>
+            </trans-unit>
+            <trans-unit id="54">
+                <source>This collection should contain {{ limit }} elements or more.</source>
+                <target>Deze collectie moet {{ limit }} element of meer bevatten.|Deze collectie moet {{ limit }} elementen of meer bevatten.</target>
+            </trans-unit>
+            <trans-unit id="55">
+                <source>This collection should contain {{ limit }} elements or less.</source>
+                <target>Deze collectie moet {{ limit }} element of minder bevatten.|Deze collectie moet {{ limit }} elementen of minder bevatten.</target>
+            </trans-unit>
+            <trans-unit id="56">
+                <source>This collection should contain exactly {{ limit }} elements.</source>
+                <target>Deze collectie moet exact {{ limit }} element bevatten.|Deze collectie moet exact {{ limit }} elementen bevatten.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.pl.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.pl.xlf
new file mode 100644
index 0000000..eee6b23
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.pl.xlf
@@ -0,0 +1,219 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>Ta wartoÅ›Ä‡ powinna byÄ‡ faÅ‚szem.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>Ta wartoÅ›Ä‡ powinna byÄ‡ prawdÄ….</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>Ta wartoÅ›Ä‡ powinna byÄ‡ typu {{ type }}.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>Ta wartoÅ›Ä‡ powinna byÄ‡ pusta.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>Ta wartoÅ›Ä‡ powinna byÄ‡ jednÄ… z podanych opcji.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>PowinieneÅ› wybraÄ‡ co najmniej {{ limit }} opcjÄ™.|PowinieneÅ› wybraÄ‡ co najmniej {{ limit }} opcje.|PowinieneÅ› wybraÄ‡ co najmniej {{ limit }} opcji.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>PowinieneÅ› wybraÄ‡ maksymalnie {{ limit }} opcjÄ™.|PowinieneÅ› wybraÄ‡ maksymalnie {{ limit }} opcje.|PowinieneÅ› wybraÄ‡ maksymalnie {{ limit }} opcji.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>Jedna lub wiÄ™cej z podanych wartoÅ›ci jest nieprawidÅ‚owa.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>Pola {{ fields }} nie byÅ‚y oczekiwane.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>Brakuje pÃ³l {{ fields }}.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>Ta wartoÅ›Ä‡ nie jest prawidÅ‚owÄ… datÄ….</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>Ta wartoÅ›Ä‡ nie jest prawidÅ‚owÄ… datÄ… i czasem.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>Ta wartoÅ›Ä‡ nie jest prawidÅ‚owym adresem email.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>Plik nie mÃ³gÅ‚ zostaÄ‡ odnaleziony.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>Nie moÅ¼na odczytaÄ‡ pliku.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Plik jest za duÅ¼y ({{ size }} {{ suffix }}). Maksymalny dozwolony rozmiar to {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>NieprawidÅ‚owy typ mime pliku ({{ type }}). Dozwolone typy mime to {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>Ta wartoÅ›Ä‡ powinna wynosiÄ‡ {{ limit }} lub mniej.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>Ta wartoÅ›Ä‡ jest zbyt dÅ‚uga. Powinna mieÄ‡ {{ limit }} lub mniej znakÃ³w.|Ta wartoÅ›Ä‡ jest zbyt dÅ‚uga. Powinna mieÄ‡ {{ limit }} lub mniej znakÃ³w.|Ta wartoÅ›Ä‡ jest zbyt dÅ‚uga. Powinna mieÄ‡ {{ limit }} lub mniej znakÃ³w.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>Ta wartoÅ›Ä‡ powinna wynosiÄ‡ {{ limit }} lub wiÄ™cej.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>Ta wartoÅ›Ä‡ jest zbyt krÃ³tka. Powinna mieÄ‡ {{ limit }} lub wiÄ™cej znakÃ³w.|Ta wartoÅ›Ä‡ jest zbyt krÃ³tka. Powinna mieÄ‡ {{ limit }} lub wiÄ™cej znakÃ³w.|Ta wartoÅ›Ä‡ jest zbyt krÃ³tka. Powinna mieÄ‡ {{ limit }} lub wiÄ™cej znakÃ³w.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>Ta wartoÅ›Ä‡ nie powinna byÄ‡ pusta.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>Ta wartoÅ›Ä‡ nie powinna byÄ‡ nullem.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>Ta wartoÅ›Ä‡ powinna byÄ‡ nullem.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>Ta wartoÅ›Ä‡ jest nieprawidÅ‚owa.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>Ta wartoÅ›Ä‡ nie jest prawidÅ‚owym czasem.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>Ta wartoÅ›Ä‡ nie jest prawidÅ‚owym adresem URL.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>Obie wartoÅ›ci powinny byÄ‡ rÃ³wne.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Plik jest za duÅ¼y. Maksymalny dozwolony rozmiar to {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>Plik jest za duÅ¼y.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>Plik nie mÃ³gÅ‚ byÄ‡ wgrany.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>Ta wartoÅ›Ä‡ powinna byÄ‡ prawidÅ‚owÄ… liczbÄ….</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This file is not a valid image.</source>
+                <target>Ten plik nie jest obrazem.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This is not a valid IP address.</source>
+                <target>To nie jest prawidÅ‚owy adres IP.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This value is not a valid language.</source>
+                <target>Ta wartoÅ›Ä‡ nie jest prawidÅ‚owym jÄ™zykiem.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid locale.</source>
+                <target>Ta wartoÅ›Ä‡ nie jest prawidÅ‚owÄ… lokalizacjÄ….</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid country.</source>
+                <target>Ta wartoÅ›Ä‡ nie jest prawidÅ‚owÄ… nazwÄ… kraju.</target>
+            </trans-unit>
+            <trans-unit id="41">
+                <source>This value is already used.</source>
+                <target>Ta wartoÅ›Ä‡ jest juÅ¼ wykorzystywana.</target>
+            </trans-unit>
+            <trans-unit id="42">
+                <source>The size of the image could not be detected.</source>
+                <target>Nie moÅ¼na wykryÄ‡ rozmiaru obrazka.</target>
+            </trans-unit>
+            <trans-unit id="43">
+                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
+                <target>SzerokoÅ›Ä‡ obrazka jest zbyt duÅ¼a ({{ width }}px). Maksymalna dopuszczalna szerokoÅ›Ä‡ to {{ max_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="44">
+                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
+                <target>SzerokoÅ›Ä‡ obrazka jest zbyt maÅ‚a ({{ width }}px). Oczekiwana minimalna szerokoÅ›Ä‡ to {{ min_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="45">
+                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
+                <target>WysokoÅ›Ä‡ obrazka jest zbyt duÅ¼a ({{ height }}px). Maksymalna dopuszczalna wysokoÅ›Ä‡ to {{ max_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="46">
+                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
+                <target>WysokoÅ›Ä‡ obrazka jest zbyt maÅ‚a ({{ height }}px). Oczekiwana minimalna wysokoÅ›Ä‡ to {{ min_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="47">
+                <source>This value should be the user current password.</source>
+                <target>Ta wartoÅ›Ä‡ powinna byÄ‡ aktualnym hasÅ‚em uÅ¼ytkownika.</target>
+            </trans-unit>
+            <trans-unit id="48">
+                <source>This value should have exactly {{ limit }} characters.</source>
+                <target>Ta wartoÅ›Ä‡ powinna mieÄ‡ dokÅ‚adnie {{ limit }} znakÃ³w.</target>
+            </trans-unit>
+            <trans-unit id="49">
+                <source>The file was only partially uploaded.</source>
+                <target>Plik zostaÅ‚ wgrany tylko czÄ™Å›ciowo.</target>
+            </trans-unit>
+            <trans-unit id="50">
+                <source>No file was uploaded.</source>
+                <target>Å»aden plik nie zostaÅ‚ wgrany.</target>
+            </trans-unit>
+            <trans-unit id="51">
+                <source>No temporary folder was configured in php.ini.</source>
+                <target>Nie skonfigurowano folderu tymczasowego w php.ini.</target>
+            </trans-unit>
+            <trans-unit id="52">
+                <source>Cannot write temporary file to disk.</source>
+                <target>Nie moÅ¼na zapisaÄ‡ pliku tymczasowego na dysku.</target>
+            </trans-unit>
+            <trans-unit id="53">
+                <source>A PHP extension caused the upload to fail.</source>
+                <target>Rozszerzenie PHP spowodowaÅ‚o bÅ‚Ä…d podczas wgrywania.</target>
+            </trans-unit>
+            <trans-unit id="54">
+                <source>This collection should contain {{ limit }} elements or more.</source>
+                <target>Ten zbiÃ³r powinien zawieraÄ‡ {{ limit }} lub wiÄ™cej elementÃ³w.</target>
+            </trans-unit>
+            <trans-unit id="55">
+                <source>This collection should contain {{ limit }} elements or less.</source>
+                <target>Ten zbiÃ³r powinien zawieraÄ‡ {{ limit }} lub mniej elementÃ³w.</target>
+            </trans-unit>
+            <trans-unit id="56">
+                <source>This collection should contain exactly {{ limit }} elements.</source>
+                <target>Ten zbiÃ³r powinien zawieraÄ‡ dokÅ‚adnie {{ limit }} element.|Ten zbiÃ³r powinien zawieraÄ‡ dokÅ‚adnie {{ limit }} elementy.|Ten zbiÃ³r powinien zawieraÄ‡ dokÅ‚adnie {{ limit }} elementÃ³w.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
\ No newline at end of file
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.pt.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.pt.xlf
new file mode 100644
index 0000000..bbe3447
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.pt.xlf
@@ -0,0 +1,219 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>Este valor deveria ser falso.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>Este valor deveria ser verdadeiro.</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>Este valor deveria ser do tipo {{ type }}.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>Este valor deveria ser vazio.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>O valor selecionado nÃ£o Ã© uma opÃ§Ã£o vÃ¡lida.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>VocÃª deveria selecionar {{ limit }} opÃ§Ã£o no mÃ­nimo.|VocÃª deveria selecionar {{ limit }} opÃ§Ãµes no mÃ­nimo.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>VocÃª deve selecionar, no mÃ¡ximo {{ limit }} opÃ§Ã£o.|VocÃª deve selecionar, no mÃ¡ximo {{ limit }} opÃ§Ãµes.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>Um ou mais dos valores introduzidos nÃ£o sÃ£o vÃ¡lidos.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>Os campos {{ fields }} nÃ£o eram esperados.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>Os campos {{ fields }} estÃ£o ausentes.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>Este valor nÃ£o Ã© uma data vÃ¡lida.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>Este valor nÃ£o Ã© uma data-hora vÃ¡lida.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>Este valor nÃ£o Ã© um endereÃ§o de e-mail vÃ¡lido.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>O arquivo nÃ£o pÃ´de ser encontrado.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>O arquivo nÃ£o pÃ´de ser lido.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>O arquivo Ã© muito grande ({{ size }} {{ suffix }}). O tamanho mÃ¡ximo permitido Ã© de {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>O tipo mime do arquivo Ã© invÃ¡lido ({{ type }}). Os tipos mime permitidos sÃ£o {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>Este valor deveria ser {{ limit }} ou menor.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>O valor Ã© muito longo. Deveria ter {{ limit }} caracteres ou menos.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>Este valor deveria ser {{ limit }} ou mais.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>O valor Ã© muito curto. Deveria de ter {{ limit }} caracteres ou mais.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>Este valor nÃ£o deveria ser branco/vazio.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>Este valor nÃ£o deveria ser nulo.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>Este valor deveria ser nulo.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>Este valor nÃ£o Ã© vÃ¡lido.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>Este valor nÃ£o Ã© uma hora vÃ¡lida.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>Este valor nÃ£o Ã© um URL vÃ¡lido.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>Os dois valores deveriam ser iguais.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>O arquivo Ã© muito grande. O tamanho mÃ¡ximo permitido Ã© de {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>O ficheiro Ã© muito grande.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>NÃ£o foi possÃ­vel carregar o ficheiro.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>Este valor deveria de ser um nÃºmero vÃ¡lido.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This file is not a valid image.</source>
+                <target>Este ficheito nÃ£o Ã© uma imagem.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This is not a valid IP address.</source>
+                <target>Este endereÃ§o de IP nÃ£o Ã© vÃ¡lido.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This value is not a valid language.</source>
+                <target>Este valor nÃ£o Ã© uma linguagem vÃ¡lida.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid locale.</source>
+                <target>Este valor nÃ£o Ã© um 'locale' vÃ¡lido.</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid country.</source>
+                <target>Este valor nÃ£o Ã© um PaÃ­s vÃ¡lido.</target>
+            </trans-unit>
+            <trans-unit id="41">
+                <source>This value is already used.</source>
+                <target>Este valor jÃ¡ estÃ¡ a ser usado.</target>
+            </trans-unit>
+            <trans-unit id="42">
+                <source>The size of the image could not be detected.</source>
+                <target>O tamanho da imagem nÃ£o foi detetado.</target>
+            </trans-unit>
+            <trans-unit id="43">
+                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
+                <target>A largura da imagem ({{ width }}px) Ã© muito grande. A largura mÃ¡xima da imagem Ã©: {{ max_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="44">
+                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
+                <target>A largura da imagem ({{ width }}px) Ã© muito pequena. A largura minÃ­ma da imagem Ã© de: {{ min_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="45">
+                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
+                <target>A altura da imagem ({{ height }}px) Ã© muito grande. A altura mÃ¡xima da imagem Ã© de: {{ max_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="46">
+                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
+                <target>A altura da imagem ({{ height }}px) Ã© muito pequena. A altura minÃ­ma da imagem Ã© de: {{ min_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="47">
+                <source>This value should be the user current password.</source>
+                <target>Este valor deveria de ser a password atual do utilizador.</target>
+            </trans-unit>
+            <trans-unit id="48">
+                <source>This value should have exactly {{ limit }} characters.</source>
+                <target>Este valor tem de ter exatamente {{ limit }} carateres.</target>
+            </trans-unit>
+            <trans-unit id="49">
+                <source>The file was only partially uploaded.</source>
+                <target>SÃ³ foi enviado parte do ficheiro.</target>
+            </trans-unit>
+            <trans-unit id="50">
+                <source>No file was uploaded.</source>
+                <target>Nenhum ficheiro foi enviado.</target>
+            </trans-unit>
+            <trans-unit id="51">
+                <source>No temporary folder was configured in php.ini.</source>
+                <target>NÃ£o existe nenhum directÃ³rio temporÃ¡ria configurado no ficheiro php.ini.</target>
+            </trans-unit>
+            <trans-unit id="52">
+                <source>Cannot write temporary file to disk.</source>
+                <target>NÃ£o foi possÃ­vel escrever ficheiros temporÃ¡rios no disco.</target>
+            </trans-unit>
+            <trans-unit id="53">
+                <source>A PHP extension caused the upload to fail.</source>
+                <target>Uma extensÃ£o PHP causou a falha no envio.</target>
+            </trans-unit>
+            <trans-unit id="54">
+                <source>This collection should contain {{ limit }} elements or more.</source>
+                <target>Esta coleÃ§Ã£o deve conter {{ limit }} elemento ou mais.|Esta coleÃ§Ã£o deve conter {{ limit }} elementos ou mais.</target>
+            </trans-unit>
+            <trans-unit id="55">
+                <source>This collection should contain {{ limit }} elements or less.</source>
+                <target>Esta coleÃ§Ã£o deve conter {{ limit }} elemento ou menos.|Esta coleÃ§Ã£o deve conter {{ limit }} elementos ou menos.</target>
+            </trans-unit>
+            <trans-unit id="56">
+                <source>This collection should contain exactly {{ limit }} elements.</source>
+                <target>Esta coleÃ§Ã£o deve conter exatamente {{ limit }} elemento.|Esta coleÃ§Ã£o deve conter exatamente {{ limit }} elementos.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.pt_BR.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.pt_BR.xlf
new file mode 100644
index 0000000..6195bbb
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.pt_BR.xlf
@@ -0,0 +1,219 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>Este valor deve ser falso.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>Este valor deve ser verdadeiro.</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>Este valor deve ser do tipo {{ type }}.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>Este valor deve ser vazio.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>O valor selecionado nÃ£o Ã© uma opÃ§Ã£o vÃ¡lida.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>VocÃª deve selecionar, no mÃ­nimo, {{ limit }} opÃ§Ã£o.|VocÃª deve selecionar, no mÃ­nimo, {{ limit }} opÃ§Ãµes</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>VocÃª deve selecionar, no mÃ¡ximo, {{ limit }} opÃ§Ã£o.|VocÃª deve selecionar, no mÃ¡ximo, {{ limit }} opÃ§Ãµes.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>Um ou mais valores informados sÃ£o invÃ¡lidos.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>Os campos {{ fields }} nÃ£o sÃ£o esperados.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>Os campos {{ fields }} estÃ£o ausentes.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>Este valor nÃ£o Ã© uma data vÃ¡lida.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>Este valor nÃ£o Ã© uma data e hora vÃ¡lida.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>Este valor nÃ£o Ã© um endereÃ§o de e-mail vÃ¡lido.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>O arquivo nÃ£o foi encontrado.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>O arquivo nÃ£o pode ser lido.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>O arquivo Ã© muito grande ({{ size }} {{ suffix }}). O tamanho mÃ¡ximo permitido Ã© {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>O tipo mime do arquivo Ã© invÃ¡lido ({{ type }}). Os tipos mime permitidos sÃ£o {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>Este valor deve ser {{ limit }} ou menos.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>Este valor Ã© muito longo. Deve ter {{ limit }} caractere ou menos.|Este valor Ã© muito longo. Deve ter {{ limit }} caracteres ou menos.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>Este valor deve ser {{ limit }} ou mais.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>Este valor Ã© muito curto. Deve ter {{ limit }} caractere ou mais.|Este valor Ã© muito curto. Deve ter {{ limit }} caracteres ou mais.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>Este valor nÃ£o deve ser vazio.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>Este valor nÃ£o deve ser nulo.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>Este valor deve ser nulo.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>Este valor nÃ£o Ã© vÃ¡lido.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>Este valor nÃ£o Ã© uma hora vÃ¡lida.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>Este valor nÃ£o Ã© uma URL vÃ¡lida.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>Os dois valores devem ser iguais.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>O arquivo Ã© muito grande. O tamanho mÃ¡ximo permitido Ã© de {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>O arquivo Ã© muito grande.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>O arquivo nÃ£o pode ser enviado.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>Este valor deve ser um nÃºmero vÃ¡lido.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This file is not a valid image.</source>
+                <target>Este arquivo nÃ£o Ã© uma imagem vÃ¡lida.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This is not a valid IP address.</source>
+                <target>Este nÃ£o Ã© um endereÃ§o de IP vÃ¡lido.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This value is not a valid language.</source>
+                <target>Este valor nÃ£o Ã© um idioma vÃ¡lido.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid locale.</source>
+                <target>Este valor nÃ£o Ã© uma localidade vÃ¡lida.</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid country.</source>
+                <target>Este valor nÃ£o Ã© um paÃ­s vÃ¡lido.</target>
+            </trans-unit>
+            <trans-unit id="41">
+                <source>This value is already used.</source>
+                <target>Este valor jÃ¡ estÃ¡ sendo usado.</target>
+            </trans-unit>
+            <trans-unit id="42">
+                <source>The size of the image could not be detected.</source>
+                <target>O tamanho da imagem nÃ£o pode ser detectado.</target>
+            </trans-unit>
+            <trans-unit id="43">
+                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
+                <target>A largura da imagem Ã© muito grande ({{ width }}px). A largura mÃ¡xima permitida Ã© de {{ max_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="44">
+                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
+                <target>A largura da imagem Ã© muito pequena ({{ width }}px). A largura mÃ­nima esperada Ã© de {{ min_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="45">
+                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
+                <target>A altura da imagem Ã© muito grande ({{ height }}px). A altura mÃ¡xima permitida Ã© de {{ max_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="46">
+                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
+                <target>A altura da imagem Ã© muito pequena ({{ height }}px). A altura mÃ­nima esperada Ã© de {{ min_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="47">
+                <source>This value should be the user current password.</source>
+                <target>Este valor deve ser a senha atual do usuÃ¡rio.</target>
+            </trans-unit>
+            <trans-unit id="48">
+                <source>This value should have exactly {{ limit }} characters.</source>
+                <target>Este valor deve ter exatamente {{ limit }} caractere.|Este valor deve ter exatamente {{ limit }} caracteres.</target>
+            </trans-unit>
+            <trans-unit id="49">
+                <source>The file was only partially uploaded.</source>
+                <target>O arquivo foi enviado apenas parcialmente.</target>
+            </trans-unit>
+            <trans-unit id="50">
+                <source>No file was uploaded.</source>
+                <target>Nenhum arquivo foi enviado.</target>
+            </trans-unit>
+            <trans-unit id="51">
+                <source>No temporary folder was configured in php.ini.</source>
+                <target>Nenhum diretÃ³rio temporÃ¡rio foi configurado no php.ini.</target>
+            </trans-unit>
+            <trans-unit id="52">
+                <source>Cannot write temporary file to disk.</source>
+                <target>NÃ£o foi possÃ­vel escrever o arquivo temporÃ¡rio no disco.</target>
+            </trans-unit>
+            <trans-unit id="53">
+                <source>A PHP extension caused the upload to fail.</source>
+                <target>Uma extensÃ£o PHP fez com que o envio falhasse.</target>
+            </trans-unit>
+            <trans-unit id="54">
+                <source>This collection should contain {{ limit }} elements or more.</source>
+                <target>Esta coleÃ§Ã£o deve conter {{ limit }} elemento ou mais.|Esta coleÃ§Ã£o deve conter {{ limit }} elementos ou mais.</target>
+            </trans-unit>
+            <trans-unit id="55">
+                <source>This collection should contain {{ limit }} elements or less.</source>
+                <target>Esta coleÃ§Ã£o deve conter {{ limit }} elemento ou menos.|Esta coleÃ§Ã£o deve conter {{ limit }} elementos ou menos.</target>
+            </trans-unit>
+            <trans-unit id="56">
+                <source>This collection should contain exactly {{ limit }} elements.</source>
+                <target>Esta coleÃ§Ã£o deve conter exatamente {{ limit }} elemento.|Esta coleÃ§Ã£o deve conter exatamente {{ limit }} elementos.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.ro.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.ro.xlf
new file mode 100644
index 0000000..4e6588f
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.ro.xlf
@@ -0,0 +1,219 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>AceastÄƒ valoare ar trebui sÄƒ fie falsÄƒ (false).</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>AceastÄƒ valoare ar trebui sÄƒ fie adevarÄƒtÄƒ (true).</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>AceastÄƒ valoare ar trebui sÄƒ fie de tipul {{ type }}.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>AceastÄƒ valoare ar trebui sa fie goalÄƒ.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>Valoarea selectatÄƒ nu este o opÈ›iune validÄƒ.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>Trebuie sÄƒ selectaÈ›i cel puÈ›in {{ limit }} opÈ›iuni.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>Trebuie sÄƒ selectaÈ›i cel mult {{ limit }} opÈ›iuni.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>Una sau mai multe dintre valorile furnizate sunt invalide.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>CÃ¢mpurile {{ fields }} nu erau aÈ™teptate.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>CÃ¢mpurile {{ fields }} lipsesc.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>AceastÄƒ valoare nu reprezintÄƒ o datÄƒ validÄƒ.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>AceastÄƒ valoare nu reprezintÄƒ o datÄƒ È™i orÄƒ o valide.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>AceastÄƒ valoare nu reprezintÄƒ o adresÄƒ de e-mail validÄƒ.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>FiÈ™ierul nu a putut fi gÄƒsit.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>FiÈ™ierul nu poate fi citit.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>FiÈ™ierul este prea mare ({{ size }} {{ suffix }}). Dimensiunea maximÄƒ permisÄƒ este {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>Tipul fiÈ™ierului este invalid ({{ type }}). Tipurile permise de fiÈ™iere sunt ({{ types }}).</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>AceastÄƒ valoare ar trebui sÄƒ fie cel mult {{ limit }}.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>AceastÄƒ valoare este prea lungÄƒ. Ar trebui sÄƒ aibÄƒ maxim {{ limit }} caracter.|AceastÄƒ valoare este prea lungÄƒ. Ar trebui sÄƒ aibÄƒ maxim {{ limit }} caractere.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>AceastÄƒ valoare ar trebui sÄƒ fie cel puÈ›in {{ limit }}.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>AceastÄƒ valoare este prea scurtÄƒ. Ar trebui sÄƒ aibÄƒ minim {{ limit }} caracter.|AceastÄƒ valoare este prea scurtÄƒ. Ar trebui sÄƒ aibÄƒ minim {{ limit }} caractere.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>AceastÄƒ valoare nu ar trebui sÄƒ fie goalÄƒ.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>AceastÄƒ valoare nu ar trebui sÄƒ fie nulÄƒ (null).</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>AceastÄƒ valoare ar trebui sÄƒ fie nulÄƒ (null).</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>AceastÄƒ valoare nu este validÄƒ.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>AceastÄƒ valoare nu reprezintÄƒ o orÄƒ validÄƒ.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>AceastÄƒ valoare nu reprezintÄƒ un URL (link) valid.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>Cele douÄƒ valori ar trebui sÄƒ fie egale.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>FiÈ™ierul este prea mare. MÄƒrimea maximÄƒ permisÄƒ este {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>FiÈ™ierul este prea mare.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>FiÈ™ierul nu a putut fi Ã®ncÄƒrcat.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>AceastÄƒ valoare nu reprezintÄƒ un numÄƒr valid.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This file is not a valid image.</source>
+                <target>Acest fiÈ™ier nu este o imagine validÄƒ.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This is not a valid IP address.</source>
+                <target>AceastÄƒ valoare nu este o adresÄƒ IP validÄƒ.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This value is not a valid language.</source>
+                <target>AceastÄƒ valoare nu reprezintÄƒ o limbÄƒ corectÄƒ.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid locale.</source>
+                <target>AceastÄƒ valoare nu reprezintÄƒ un dialect (o limbÄƒ) corect.</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid country.</source>
+                <target>AceastÄƒ valoare nu este o È›arÄƒ validÄƒ.</target>
+            </trans-unit>
+            <trans-unit id="41">
+                <source>This value is already used.</source>
+                <target>AceastÄƒ valoare este folositÄƒ deja.</target>
+            </trans-unit>
+            <trans-unit id="42">
+                <source>The size of the image could not be detected.</source>
+                <target>MÄƒrimea imaginii nu a putut fi detectatÄƒ.</target>
+            </trans-unit>
+            <trans-unit id="43">
+                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
+                <target>LÄƒÈ›imea imaginii este prea mare ({{ width }}px). LÄƒÈ›imea maximÄƒ permisÄƒ este de {{ max_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="44">
+                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
+                <target>LÄƒÈ›imea imaginii este prea micÄƒ ({{ width }}px). LÄƒÈ›imea minimÄƒ permisÄƒ este de {{ min_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="45">
+                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
+                <target>ÃŽnlÄƒÈ›imea imaginii este prea mare ({{ height }}px). ÃŽnÄƒlÈ›imea maximÄƒ permisÄƒ este de {{ max_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="46">
+                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
+                <target>ÃŽnlÄƒÈ›imea imaginii este prea micÄƒ ({{ height }}px). ÃŽnÄƒlÈ›imea minimÄƒ permisÄƒ este de {{ min_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="47">
+                <source>This value should be the user current password.</source>
+                <target>AceastÄƒ valoare trebuie sÄƒ fie parola curentÄƒ a utilizatorului.</target>
+            </trans-unit>
+            <trans-unit id="48">
+                <source>This value should have exactly {{ limit }} characters.</source>
+                <target>AceastÄƒ valoare trebuie sÄƒ conÈ›inÄƒ exact {{ limit }} caracter.|AceastÄƒ valoare trebuie sÄƒ conÈ›inÄƒ exact {{ limit }} caractere.</target>
+            </trans-unit>
+            <trans-unit id="49">
+                <source>The file was only partially uploaded.</source>
+                <target>FiÈ™ierul a fost Ã®ncÄƒrcat parÈ›ial.</target>
+            </trans-unit>
+            <trans-unit id="50">
+                <source>No file was uploaded.</source>
+                <target>Nu a fost Ã®ncÄƒrcat nici un fiÈ™ier.</target>
+            </trans-unit>
+            <trans-unit id="51">
+                <source>No temporary folder was configured in php.ini.</source>
+                <target>Nu este configurat nici un director temporar in php.ini.</target>
+            </trans-unit>
+            <trans-unit id="52">
+                <source>Cannot write temporary file to disk.</source>
+                <target>Nu a fost posibilÄƒ scrierea fiÈ™ierului temporar pe disk.</target>
+            </trans-unit>
+            <trans-unit id="53">
+                <source>A PHP extension caused the upload to fail.</source>
+                <target>O extensie PHP a prevenit Ã®ncÄƒrcarea cu succes a fiÈ™ierului.</target>
+            </trans-unit>
+            <trans-unit id="54">
+                <source>This collection should contain {{ limit }} elements or more.</source>
+                <target>AceastÄƒ colecÈ›ie trebuie sÄƒ conÈ›inÄƒ cel puÈ›in {{ limit }} elemente.</target>
+            </trans-unit>
+            <trans-unit id="55">
+                <source>This collection should contain {{ limit }} elements or less.</source>
+                <target>AceastÄƒ colecÈ›ie trebuie sÄƒ conÈ›inÄƒ cel mult {{ limit }} elemente.</target>
+            </trans-unit>
+            <trans-unit id="56">
+                <source>This collection should contain exactly {{ limit }} elements.</source>
+                <target>AceastÄƒ colecÈ›ie trebuie sÄƒ conÈ›inÄƒ {{ limit }} elemente.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.ru.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.ru.xlf
new file mode 100644
index 0000000..3517600
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.ru.xlf
@@ -0,0 +1,219 @@
+ï»¿<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð´Ð¾Ð»Ð¶Ð½Ð¾ Ð±Ñ‹Ñ‚ÑŒ Ð»Ð¾Ð¶Ð½Ñ‹Ð¼.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð´Ð¾Ð»Ð¶Ð½Ð¾ Ð±Ñ‹Ñ‚ÑŒ Ð¸ÑÑ‚Ð¸Ð½Ð½Ñ‹Ð¼.</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>Ð¢Ð¸Ð¿ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ Ð±Ñ‹Ñ‚ÑŒ {{ type }}.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð´Ð¾Ð»Ð¶Ð½Ð¾ Ð±Ñ‹Ñ‚ÑŒ Ð¿ÑƒÑÑ‚Ñ‹Ð¼.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ðµ Ð’Ð°Ð¼Ð¸ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ð¾.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>Ð’Ñ‹ Ð´Ð¾Ð»Ð¶Ð½Ñ‹ Ð²Ñ‹Ð±Ñ€Ð°Ñ‚ÑŒ Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ {{ limit }} Ð²Ð°Ñ€Ð¸Ð°Ð½Ñ‚.|Ð’Ñ‹ Ð´Ð¾Ð»Ð¶Ð½Ñ‹ Ð²Ñ‹Ð±Ñ€Ð°Ñ‚ÑŒ Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ {{ limit }} Ð²Ð°Ñ€Ð¸Ð°Ð½Ñ‚Ð°.|Ð’Ñ‹ Ð´Ð¾Ð»Ð¶Ð½Ñ‹ Ð²Ñ‹Ð±Ñ€Ð°Ñ‚ÑŒ Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ {{ limit }} Ð²Ð°Ñ€Ð¸Ð°Ð½Ñ‚Ð¾Ð².</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>Ð’Ñ‹ Ð´Ð¾Ð»Ð¶Ð½Ñ‹ Ð²Ñ‹Ð±Ñ€Ð°Ñ‚ÑŒ Ð½Ðµ Ð±Ð¾Ð»ÐµÐµ Ñ‡ÐµÐ¼ {{ limit }} Ð²Ð°Ñ€Ð¸Ð°Ð½Ñ‚.|Ð’Ñ‹ Ð´Ð¾Ð»Ð¶Ð½Ñ‹ Ð²Ñ‹Ð±Ñ€Ð°Ñ‚ÑŒ Ð½Ðµ Ð±Ð¾Ð»ÐµÐµ Ñ‡ÐµÐ¼ {{ limit }} Ð²Ð°Ñ€Ð¸Ð°Ð½Ñ‚Ð°.|Ð’Ñ‹ Ð´Ð¾Ð»Ð¶Ð½Ñ‹ Ð²Ñ‹Ð±Ñ€Ð°Ñ‚ÑŒ Ð½Ðµ Ð±Ð¾Ð»ÐµÐµ Ñ‡ÐµÐ¼ {{ limit }} Ð²Ð°Ñ€Ð¸Ð°Ð½Ñ‚Ð¾Ð².</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>ÐžÐ´Ð½Ð¾ Ð¸Ð»Ð¸ Ð½ÐµÑÐºÐ¾Ð»ÑŒÐºÐ¾ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ñ… Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ð¹ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ð¾.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>ÐŸÐ¾Ð»Ñ {{ fields }} Ð½Ðµ Ð¾Ð¶Ð¸Ð´Ð°Ð»Ð¸ÑÑŒ.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>ÐŸÐ¾Ð»Ñ {{ fields }} Ð¾Ñ‚ÑÑƒÑ‚ÑÑ‚Ð²ÑƒÑŽÑ‚.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð½Ðµ ÑÐ²Ð»ÑÐµÑ‚ÑÑ Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð¾Ð¹ Ð´Ð°Ñ‚Ð¾Ð¹.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð´Ð°Ñ‚Ñ‹ Ð¸ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ð¾.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð°Ð´Ñ€ÐµÑÐ° ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ð¹ Ð¿Ð¾Ñ‡Ñ‚Ñ‹ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ð¾.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>Ð¤Ð°Ð¹Ð» Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ‚ Ð±Ñ‹Ñ‚ÑŒ Ð½Ð°Ð¹Ð´ÐµÐ½.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>Ð¤Ð°Ð¹Ð» Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ‚ Ð±Ñ‹Ñ‚ÑŒ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ð½.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Ð¤Ð°Ð¹Ð» ÑÐ»Ð¸ÑˆÐºÐ¾Ð¼ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ð¹ ({{ size }} {{ suffix }}). ÐœÐ°ÐºÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ñ‹Ð¹ Ð´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ñ‹Ð¹ Ñ€Ð°Ð·Ð¼ÐµÑ€ {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>MIME-Ñ‚Ð¸Ð¿ Ñ„Ð°Ð¹Ð»Ð° Ð½ÐµÐ´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼ ({{ type }}). Ð”Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ñ‹ MIME-Ñ‚Ð¸Ð¿Ñ‹ Ñ„Ð°Ð¹Ð»Ð¾Ð² {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð´Ð¾Ð»Ð¶Ð½Ð¾ Ð±Ñ‹Ñ‚ÑŒ {{ limit }} Ð¸Ð»Ð¸ Ð¼ÐµÐ½ÑŒÑˆÐµ.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ ÑÐ»Ð¸ÑˆÐºÐ¾Ð¼ Ð´Ð»Ð¸Ð½Ð½Ð¾Ðµ. Ð”Ð¾Ð»Ð¶Ð½Ð¾ Ð±Ñ‹Ñ‚ÑŒ Ñ€Ð°Ð²Ð½Ð¾ {{ limit }} ÑÐ¸Ð¼Ð²Ð¾Ð»Ñƒ Ð¸Ð»Ð¸ Ð¼ÐµÐ½ÑŒÑˆÐµ.|Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ ÑÐ»Ð¸ÑˆÐºÐ¾Ð¼ Ð´Ð»Ð¸Ð½Ð½Ð¾Ðµ. Ð”Ð¾Ð»Ð¶Ð½Ð¾ Ð±Ñ‹Ñ‚ÑŒ Ñ€Ð°Ð²Ð½Ð¾ {{ limit }} ÑÐ¸Ð¼Ð²Ð¾Ð»Ð°Ð¼ Ð¸Ð»Ð¸ Ð¼ÐµÐ½ÑŒÑˆÐµ.|Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ ÑÐ»Ð¸ÑˆÐºÐ¾Ð¼ Ð´Ð»Ð¸Ð½Ð½Ð¾Ðµ. Ð”Ð¾Ð»Ð¶Ð½Ð¾ Ð±Ñ‹Ñ‚ÑŒ Ñ€Ð°Ð²Ð½Ð¾ {{ limit }} ÑÐ¸Ð¼Ð²Ð¾Ð»Ð°Ð¼ Ð¸Ð»Ð¸ Ð¼ÐµÐ½ÑŒÑˆÐµ.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð´Ð¾Ð»Ð¶Ð½Ð¾ Ð±Ñ‹Ñ‚ÑŒ {{ limit }} Ð¸Ð»Ð¸ Ð±Ð¾Ð»ÑŒÑˆÐµ.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ ÑÐ»Ð¸ÑˆÐºÐ¾Ð¼ ÐºÐ¾Ñ€Ð¾Ñ‚ÐºÐ¾Ðµ. Ð”Ð¾Ð»Ð¶Ð½Ð¾ Ð±Ñ‹Ñ‚ÑŒ Ñ€Ð°Ð²Ð½Ð¾ {{ limit }} ÑÐ¸Ð¼Ð²Ð¾Ð»Ñƒ Ð¸Ð»Ð¸ Ð±Ð¾Ð»ÑŒÑˆÐµ.|Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ ÑÐ»Ð¸ÑˆÐºÐ¾Ð¼ ÐºÐ¾Ñ€Ð¾Ñ‚ÐºÐ¾Ðµ. Ð”Ð¾Ð»Ð¶Ð½Ð¾ Ð±Ñ‹Ñ‚ÑŒ Ñ€Ð°Ð²Ð½Ð¾ {{ limit }} ÑÐ¸Ð¼Ð²Ð¾Ð»Ð°Ð¼ Ð¸Ð»Ð¸ Ð±Ð¾Ð»ÑŒÑˆÐµ.|Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ ÑÐ»Ð¸ÑˆÐºÐ¾Ð¼ ÐºÐ¾Ñ€Ð¾Ñ‚ÐºÐ¾Ðµ. Ð”Ð¾Ð»Ð¶Ð½Ð¾ Ð±Ñ‹Ñ‚ÑŒ Ñ€Ð°Ð²Ð½Ð¾ {{ limit }} ÑÐ¸Ð¼Ð²Ð¾Ð»Ð°Ð¼ Ð¸Ð»Ð¸ Ð±Ð¾Ð»ÑŒÑˆÐµ.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð½Ðµ Ð´Ð¾Ð»Ð¶Ð½Ð¾ Ð±Ñ‹Ñ‚ÑŒ Ð¿ÑƒÑÑ‚Ñ‹Ð¼.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð½Ðµ Ð´Ð¾Ð»Ð¶Ð½Ð¾ Ð±Ñ‹Ñ‚ÑŒ null.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð´Ð¾Ð»Ð¶Ð½Ð¾ Ð±Ñ‹Ñ‚ÑŒ null.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ð¾.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ð¾.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ URL Ð½ÐµÐ´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ð¾.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>ÐžÐ±Ð° Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ‹ Ð±Ñ‹Ñ‚ÑŒ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñ‹Ð¼Ð¸.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Ð¤Ð°Ð¹Ð» ÑÐ»Ð¸ÑˆÐºÐ¾Ð¼ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ð¹. ÐœÐ°ÐºÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ñ‹Ð¹ Ð´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ñ‹Ð¹ Ñ€Ð°Ð·Ð¼ÐµÑ€ {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>Ð¤Ð°Ð¹Ð» ÑÐ»Ð¸ÑˆÐºÐ¾Ð¼ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ð¹.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>Ð¤Ð°Ð¹Ð» Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ‚ Ð±Ñ‹Ñ‚ÑŒ Ð·Ð°Ð³Ñ€ÑƒÐ¶ÐµÐ½.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð´Ð¾Ð»Ð¶Ð½Ð¾ Ð±Ñ‹Ñ‚ÑŒ Ñ‡Ð¸ÑÐ»Ð¾Ð¼.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This value is not a valid country.</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð½Ðµ ÑÐ²Ð»ÑÐµÑ‚ÑÑ Ð´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ð¾Ð¹ ÑÑ‚Ñ€Ð°Ð½Ð¾Ð¹.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This file is not a valid image.</source>
+                <target>Ð¤Ð°Ð¹Ð» Ð½Ðµ ÑÐ²Ð»ÑÐµÑ‚ÑÑ Ð´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ñ‹Ð¼ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¾Ð¼ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This is not a valid IP address.</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð½Ðµ ÑÐ²Ð»ÑÐµÑ‚ÑÑ Ð´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ñ‹Ð¼ IP Ð°Ð´Ñ€ÐµÑÐ¾Ð¼.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid language.</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð½Ðµ ÑÐ²Ð»ÑÐµÑ‚ÑÑ Ð´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ñ‹Ð¼ ÑÐ·Ñ‹ÐºÐ¾Ð¼.</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid locale.</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð½Ðµ ÑÐ²Ð»ÑÐµÑ‚ÑÑ Ð´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ð¾Ð¹ Ð»Ð¾ÐºÐ°Ð»ÑŒÑŽ.</target>
+            </trans-unit>
+            <trans-unit id="41">
+                <source>This value is already used.</source>
+                <target>Ð­Ñ‚Ð¾ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ ÑƒÐ¶Ðµ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÐµÑ‚ÑÑ.</target>
+            </trans-unit>
+            <trans-unit id="42">
+                <source>The size of the image could not be detected.</source>
+                <target>ÐÐµ ÑƒÐ´Ð°Ð»Ð¾ÑÑŒ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ð¸Ñ‚ÑŒ Ñ€Ð°Ð·Ð¼ÐµÑ€ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ.</target>
+            </trans-unit>
+            <trans-unit id="43">
+                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
+                <target>Ð¨Ð¸Ñ€Ð¸Ð½Ð° Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ÑÐ»Ð¸ÑˆÐºÐ¾Ð¼ Ð±Ð¾Ð»ÑŒÑˆÐ°Ñ ({{ width }}px). ÐœÐ°ÐºÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð° {{ max_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="44">
+                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
+                <target>Ð¨Ð¸Ñ€Ð¸Ð½Ð° Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ÑÐ»Ð¸ÑˆÐºÐ¾Ð¼ Ð¼Ð°Ð»Ð° ({{ width }}px). ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð° {{ min_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="45">
+                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
+                <target>Ð’Ñ‹ÑÐ¾Ñ‚Ð° Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ÑÐ»Ð¸ÑˆÐºÐ¾Ð¼ Ð±Ð¾Ð»ÑŒÑˆÐ°Ñ ({{ height }}px). ÐœÐ°ÐºÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ð°Ñ Ð²Ñ‹ÑÐ¾Ñ‚Ð° {{ max_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="46">
+                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
+                <target>Ð’Ñ‹ÑÐ¾Ñ‚Ð° Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ÑÐ»Ð¸ÑˆÐºÐ¾Ð¼ Ð¼Ð°Ð»Ð° ({{ height }}px). ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ð°Ñ Ð²Ñ‹ÑÐ¾Ñ‚Ð° {{ min_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="47">
+                <source>This value should be the user current password.</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð´Ð¾Ð»Ð¶Ð½Ð¾ Ð±Ñ‹Ñ‚ÑŒ Ñ‚ÐµÐºÑƒÑ‰Ð¸Ð¼ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¼ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ.</target>
+            </trans-unit>
+            <trans-unit id="48">
+                <source>This value should have exactly {{ limit }} characters.</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð´Ð¾Ð»Ð¶Ð½Ð¾ Ð±Ñ‹Ñ‚ÑŒ Ñ€Ð°Ð²Ð½Ð¾ {{ limit }} ÑÐ¸Ð¼Ð²Ð¾Ð»Ñƒ.|Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð´Ð¾Ð»Ð¶Ð½Ð¾ Ð±Ñ‹Ñ‚ÑŒ Ñ€Ð°Ð²Ð½Ð¾ {{ limit }} ÑÐ¸Ð¼Ð²Ð¾Ð»Ð°Ð¼.|Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð´Ð¾Ð»Ð¶Ð½Ð¾ Ð±Ñ‹Ñ‚ÑŒ Ñ€Ð°Ð²Ð½Ð¾ {{ limit }} ÑÐ¸Ð¼Ð²Ð¾Ð»Ð°Ð¼.</target>
+            </trans-unit>
+            <trans-unit id="49">
+                <source>The file was only partially uploaded.</source>
+                <target>Ð¤Ð°Ð¹Ð» Ð±Ñ‹Ð» Ð·Ð°Ð³Ñ€ÑƒÐ¶ÐµÐ½ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ñ‡Ð°ÑÑ‚Ð¸Ñ‡Ð½Ð¾.</target>
+            </trans-unit>
+            <trans-unit id="50">
+                <source>No file was uploaded.</source>
+                <target>Ð¤Ð°Ð¹Ð» Ð½Ðµ Ð±Ñ‹Ð» Ð·Ð°Ð³Ñ€ÑƒÐ¶ÐµÐ½.</target>
+            </trans-unit>
+            <trans-unit id="51">
+                <source>No temporary folder was configured in php.ini.</source>
+                <target>ÐÐµ Ð½Ð°ÑÑ‚Ñ€Ð¾ÐµÐ½Ð° Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð² php.ini.</target>
+            </trans-unit>
+            <trans-unit id="52">
+                <source>Cannot write temporary file to disk.</source>
+                <target>ÐÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ Ð·Ð°Ð¿Ð¸ÑÐ°Ñ‚ÑŒ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ð¹ Ñ„Ð°Ð¹Ð» Ð½Ð° Ð´Ð¸ÑÐº.</target>
+            </trans-unit>
+            <trans-unit id="53">
+                <source>A PHP extension caused the upload to fail.</source>
+                <target>Ð Ð°ÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ðµ PHP Ð²Ñ‹Ð·Ð²Ð°Ð»Ð¾ Ð¾ÑˆÐ¸Ð±ÐºÑƒ Ð¿Ñ€Ð¸ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐµ.</target>
+            </trans-unit>
+            <trans-unit id="54">
+                <source>This collection should contain {{ limit }} elements or more.</source>
+                <target>Ð­Ñ‚Ð° ÐºÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ñ‚ÑŒ {{ limit }} ÑÐ»ÐµÐ¼ÐµÐ½Ñ‚ Ð¸Ð»Ð¸ Ð±Ð¾Ð»ÑŒÑˆÐµ.|Ð­Ñ‚Ð° ÐºÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ñ‚ÑŒ {{ limit }} ÑÐ»ÐµÐ¼ÐµÐ½Ñ‚Ð° Ð¸Ð»Ð¸ Ð±Ð¾Ð»ÑŒÑˆÐµ.|Ð­Ñ‚Ð° ÐºÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ñ‚ÑŒ {{ limit }} ÑÐ»ÐµÐ¼ÐµÐ½Ñ‚Ð¾Ð² Ð¸Ð»Ð¸ Ð±Ð¾Ð»ÑŒÑˆÐµ.</target>
+            </trans-unit>
+            <trans-unit id="55">
+                <source>This collection should contain {{ limit }} elements or less.</source>
+                <target>Ð­Ñ‚Ð° ÐºÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ñ‚ÑŒ {{ limit }} ÑÐ»ÐµÐ¼ÐµÐ½Ñ‚ Ð¸Ð»Ð¸ Ð¼ÐµÐ½ÑŒÑˆÐµ.|Ð­Ñ‚Ð° ÐºÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ñ‚ÑŒ {{ limit }} ÑÐ»ÐµÐ¼ÐµÐ½Ñ‚Ð° Ð¸Ð»Ð¸ Ð¼ÐµÐ½ÑŒÑˆÐµ.|Ð­Ñ‚Ð° ÐºÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ñ‚ÑŒ {{ limit }} ÑÐ»ÐµÐ¼ÐµÐ½Ñ‚Ð¾Ð² Ð¸Ð»Ð¸ Ð¼ÐµÐ½ÑŒÑˆÐµ.</target>
+            </trans-unit>
+            <trans-unit id="56">
+                <source>This collection should contain exactly {{ limit }} elements.</source>
+                <target>Ð­Ñ‚Ð° ÐºÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ñ‚ÑŒ Ñ€Ð¾Ð²Ð½Ð¾ {{ limit }} ÑÐ»ÐµÐ¼ÐµÐ½Ñ‚.|Ð­Ñ‚Ð° ÐºÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ñ‚ÑŒ Ñ€Ð¾Ð²Ð½Ð¾ {{ limit }} ÑÐ»ÐµÐ¼ÐµÐ½Ñ‚Ð°.|Ð­Ñ‚Ð° ÐºÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ñ‚ÑŒ Ñ€Ð¾Ð²Ð½Ð¾ {{ limit }} ÑÐ»ÐµÐ¼ÐµÐ½Ñ‚Ð¾Ð².</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.sk.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.sk.xlf
new file mode 100644
index 0000000..9fc16a1
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.sk.xlf
@@ -0,0 +1,207 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>TÃ¡to hodnota by mala byÅ¥ nastavenÃ¡ na false.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>TÃ¡to hodnota by mala byÅ¥ nastavenÃ¡ na true.</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>TÃ¡to hodnota by mala byÅ¥ typu {{ type }}.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>TÃ¡to hodnota by mala byÅ¥ prÃ¡zdna.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>TÃ¡to hodnota by mala byÅ¥ jednou z poskytnutÃ½ch moÅ¾nostÃ­.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>Mali by ste vybraÅ¥ minimÃ¡lne {{ limit }} moÅ¾nosti.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>Mali by ste vybraÅ¥ najviac {{ limit }} moÅ¾nosti.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>One or more of the given values is invalid.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>Polia {{ fields }} neboli oÄakÃ¡vanÃ©.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>ChÃ½bajÃº polia {{ fields }} .</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>Tato hodnota nemÃ¡ platnÃ½ formÃ¡t dÃ¡tumu.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>TÃ¡to hodnota nemÃ¡ platnÃ½ formÃ¡t dÃ¡tumu a Äasu.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>TÃ¡to hodnota nie je platnÃ¡ emailovÃ¡ adresa.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>SÃºbor sa nenaÅ¡iel.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>SÃºbor nie je ÄitateÄ¾nÃ½.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>SÃºbor je prÃ­liÅ¡ veÄ¾kÃ½ ({{ size }} {{ suffix }}). MaximÃ¡lna povolenÃ¡ veÄ¾kosÅ¥ je {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>SÃºbor typu ({{ type }}) nie je podporovanÃ½. PodporovanÃ© typy sÃº {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>TÃ¡to hodnota by mala byÅ¥ {{ limit }} alebo menej.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>TÃ¡to hodnota obsahuje viac znakov ako je povolenÃ©. Mala by obsahovaÅ¥ najviac {{ limit }} znakov.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>TÃ¡to hodnota by mala byÅ¥ viac ako {{ limit }}.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>TÃ¡to hodnota nemÃ¡ dostatoÄnÃ½ poÄet znakov. MinimÃ¡lny poÄet znakov je {{ limit }}.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>TÃ¡to hodnota by mala byÅ¥ vyplnenÃ¡.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>TÃ¡to hodnota by nemala byÅ¥ null.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>TÃ¡to hodnota by mala byÅ¥ null.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>TÃ¡to hodnota nie je platnÃ¡.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>Tato hodnota nemÃ¡ sprÃ¡vny formÃ¡t Äasu.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>TÃ¡to hodnota nie je platnou URL adresou.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>Tieto dve hodnoty by mali byÅ¥ rovnakÃ©.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>SÃºbor je prÃ­liÅ¡ veÄ¾kÃ½. MaximÃ¡lna povolenÃ¡ veÄ¾kosÅ¥ je {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>SÃºbor je prÃ­liÅ¡ veÄ¾kÃ½.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>SÃºbor sa nepodarilo nahraÅ¥.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>TÃ¡to hodnota by mala byÅ¥ ÄÃ­slo.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This file is not a valid image.</source>
+                <target>Tento sÃºbor nie je obrÃ¡zok.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This is not a valid IP address.</source>
+                <target>Toto nie je platnÃ¡ IP adresa.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This value is not a valid language.</source>
+                <target>Tento jazyk neexistuje.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid locale.</source>
+                <target>TÃ¡to lokalizÃ¡cia neexistuje.</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid country.</source>
+                <target>TÃ¡to krajina neexistuje.</target>
+            </trans-unit>
+            <trans-unit id="41">
+                <source>This value is already used.</source>
+                <target>TÃ¡to hodnota sa uÅ¾ pouÅ¾Ã­va.</target>
+            </trans-unit>
+            <trans-unit id="42">
+                <source>The size of the image could not be detected.</source>
+                <target>Nepodarilo sa zistiÅ¥ rozmery obrÃ¡zku.</target>
+            </trans-unit>
+            <trans-unit id="43">
+                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
+                <target>ObrÃ¡zok je prÃ­liÅ¡ Å¡irokÃ½ ({{ width }}px). MaximÃ¡lna povolenÃ¡ Å¡Ã­rka obrÃ¡zku je {{ max_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="44">
+                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
+                <target>ObrÃ¡zok je prÃ­liÅ¡ Ãºzky ({{ width }}px). MinimÃ¡lna Å¡Ã­rka obrÃ¡zku by mala byÅ¥ {{ min_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="45">
+                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
+                <target>>ObrÃ¡zok je prÃ­liÅ¡ vysokÃ½ ({{ height }}px). MaximÃ¡lna povolenÃ¡ vÃ½Å¡ka obrÃ¡zku je {{ max_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="46">
+                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
+                <target>ObrÃ¡zok je prÃ­liÅ¡ nÃ­zky ({{ height }}px). MinimÃ¡lna vÃ½Å¡ka obrÃ¡zku by mala byÅ¥ {{ min_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="47">
+                <source>This value should be the user current password.</source>
+                <target>TÃ¡to hodnota by mala byÅ¥ aktuÃ¡lne heslo pouÅ¾Ã­vateÄ¾a.</target>
+            </trans-unit>
+            <trans-unit id="48">
+                <source>This value should have exactly {{ limit }} characters.</source>
+                <target>TÃ¡to hodnota by mala maÅ¥ presne {{ limit }} znakov.</target>
+            </trans-unit>
+            <trans-unit id="49">
+                <source>The file was only partially uploaded.</source>
+                <target>Bola nahranÃ¡ len ÄasÅ¥ sÃºboru.</target>
+            </trans-unit>
+            <trans-unit id="50">
+                <source>No file was uploaded.</source>
+                <target>Å½iadny sÃºbor nebol nahranÃ½.</target>
+            </trans-unit>
+            <trans-unit id="51">
+                <source>No temporary folder was configured in php.ini.</source>
+                <target>V php.ini nie je nastavenÃ¡ cesta k adresÃ¡ru pre doÄasnÃ© sÃºbory.</target>
+            </trans-unit>
+            <trans-unit id="52">
+                <source>Cannot write temporary file to disk.</source>
+                <target>DoÄasnÃ½ sÃºbor sa nepodarilo zapÃ­saÅ¥ na disk.</target>
+            </trans-unit>
+            <trans-unit id="53">
+                <source>A PHP extension caused the upload to fail.</source>
+                <target>RozÅ¡Ã­renie PHP zabrÃ¡nilo nahraniu sÃºboru.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.sl.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.sl.xlf
new file mode 100644
index 0000000..fa37c28
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.sl.xlf
@@ -0,0 +1,219 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>Vrednost bi morala biti nepravilna (false).</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>Vrednost bi morala biti pravilna (true).</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>Vrednost mora biti naslednjega tipa {{ type }}.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>Vrednost mora biti prazna.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>Vrednost naj bo ena izmed podanih moÅ¾nosti.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>Izberite vsaj {{ limit }} moÅ¾nosti.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>Izberete lahko najveÄ {{ limit }} moÅ¾nosti.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>Ena ali veÄ podanih vrednosti ni veljavnih.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>Naslednja polja {{ fields }} niso bila priÄakovana.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>Naslednja polja {{ fields }} ne obstajajo.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>Vrednost ne vsebuje veljavnega datuma.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>Vrednost ne vsebuje veljavnega datuma in Äasa.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>Vpisana vrednost ni veljaven email naslov.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>Datoteke ni mogoÄe najti.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>Datoteke ni mogoÄe prebrati.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Datoteka je prevelika ({{ size }} {{ suffix }}). NajveÄja dovoljena velikost je {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>NapaÄna Mime vrednost datoteke ({{ type }}). Dovoljene mime vrednosti so {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>Vrednost mora biti manjÅ¡a od {{ limit }}.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>Vpisana vrednost je predolga. NajveÄja dolÅ¾ina je {{ limit }} znakov.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>Vpisana vrednost naj vsebuje vsaj {{ limit }} znakov.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>Vpisana vrednost je prekratka. VpiÅ¡ite vsaj {{ limit }} znakov.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>Vrednost ne sme biti prazna.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>Vrednost ne sme biti nedefinirana (null).</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>Vrednost mora biti nedefinirana (null).</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>Vrednost ni pravilna.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>Vrednost ne vsebuje veljavnega Äasa.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>Vrednost ne vsebuje veljavnega URL naslova.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>Vrednosti morata biti enaki.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Datoteka je prevelika. NajveÄja dovoljena velikost je {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>Datoteka je prevelika.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>Datoteke ni bilo mogoÄe naloÅ¾iti.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>Vrednost mora biti veljavna Å¡tevilka.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This file is not a valid image.</source>
+                <target>Datoteka ni veljavna slika.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This is not a valid IP address.</source>
+                <target>IP naslov ni veljaven.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This value is not a valid language.</source>
+                <target>Vrednost ni veljaven jezik.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid locale.</source>
+                <target>Vrednost ni veljavna lokalnost.</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid country.</source>
+                <target>Vrednost ni veljavna drÅ¾ava.</target>
+            </trans-unit>
+            <trans-unit id="41">
+                <source>This value is already used.</source>
+                <target>Ta vrednost je Å¾e uporabljena.</target>
+            </trans-unit>
+            <trans-unit id="42">
+                <source>The size of the image could not be detected.</source>
+                <target>Velikost slike ni bilo mogoÄe zaznati.</target>
+            </trans-unit>
+            <trans-unit id="43">
+                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
+                <target>Å irina slike je preÅ¡iroka ({{ width }}px). NajveÄja dovoljena Å¡irina je {{ max_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="44">
+                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
+                <target>Å irina slike je premajhna ({{ width }}px). NajmanjÅ¡a predvidena Å¡irina je {{ min_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="45">
+                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
+                <target>ViÅ¡ina slike je premajhna ({{ height }}px). NajveÄja dovoljena viÅ¡ina je {{ max_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="46">
+                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
+                <target>ViÅ¡ina slike je premajhna ({{ height }}px). NajmanjÅ¡a predvidena viÅ¡ina je {{ min_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="47">
+                <source>This value should be the user current password.</source>
+                <target>Vrednost bi morala biti trenutno uporabnikovo geslo.</target>
+            </trans-unit>
+            <trans-unit id="48">
+                <source>This value should have exactly {{ limit }} characters.</source>
+                <target>Vrednost bi morala imeti toÄno {{ limit }} znakov.</target>
+            </trans-unit>
+            <trans-unit id="49">
+                <source>The file was only partially uploaded.</source>
+                <target>Datoteka je bila le delno naloÅ¾ena.</target>
+            </trans-unit>
+            <trans-unit id="50">
+                <source>No file was uploaded.</source>
+                <target>Datoteka ni bila naloÅ¾ena.</target>
+            </trans-unit>
+            <trans-unit id="51">
+                <source>No temporary folder was configured in php.ini.</source>
+                <target>ZaÄasna mapa ni nastavljena v php.ini.</target>
+            </trans-unit>
+            <trans-unit id="52">
+                <source>Cannot write temporary file to disk.</source>
+                <target>Datoteke ni bilo mogoÄe zapisati na disk.</target>
+            </trans-unit>
+            <trans-unit id="53">
+                <source>A PHP extension caused the upload to fail.</source>
+                <target>Nalaganje ni uspelo (razlog: PHP extension).</target>
+            </trans-unit>
+            <trans-unit id="54">
+                <source>This collection should contain {{ limit }} elements or more.</source>
+                <target>Ta zbirka bi morala vsebovati {{ limit }} ali veÄ elementov.</target>
+            </trans-unit>
+            <trans-unit id="55">
+                <source>This collection should contain {{ limit }} elements or less.</source>
+                <target>Ta zbirka bi morala vsebovati {{ limit }} ali manj elementov.</target>
+            </trans-unit>
+            <trans-unit id="56">
+                <source>This collection should contain exactly {{ limit }} elements.</source>
+                <target>Ta zbirka bi morala vsebovati toÄno {{ limit }} element.|Ta zbirka bi morala vsebovati toÄno {{ limit }} elementa.|Ta zbirka bi morala vsebovati toÄno {{ limit }} elemente.|Ta zbirka bi morala vsebovati toÄno {{ limit }} elementov.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.sr_Cyrl.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.sr_Cyrl.xlf
new file mode 100644
index 0000000..c9c959e
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.sr_Cyrl.xlf
@@ -0,0 +1,219 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ñ‚Ñ€ÐµÐ±Ð° Ð´Ð° Ð±ÑƒÐ´Ðµ Ð½ÐµÑ‚Ð°Ñ‡Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ñ‚Ñ€ÐµÐ±Ð° Ð´Ð° Ð±ÑƒÐ´Ðµ Ñ‚Ð°Ñ‡Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ñ‚Ñ€ÐµÐ±Ð° Ð´Ð° Ð±ÑƒÐ´Ðµ Ñ‚Ð¸Ð¿Ð° {{ type }}.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ñ‚Ñ€ÐµÐ±Ð° Ð´Ð° Ð±ÑƒÐ´Ðµ Ð¿Ñ€Ð°Ð·Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ñ‚Ñ€ÐµÐ±Ð° Ð´Ð° Ð±ÑƒÐ´Ðµ Ñ˜ÐµÐ´Ð½Ð° Ð¾Ð´ Ð¿Ð¾Ð½ÑƒÑ’ÐµÐ½Ð¸Ñ….</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>Ð˜Ð·Ð°Ð±ÐµÑ€Ð¸Ñ‚Ðµ Ð±Ð°Ñ€ {{ limit }} Ð¼Ð¾Ð³ÑƒÑ›Ð½Ð¾ÑÑ‚.|Ð˜Ð·Ð°Ð±ÐµÑ€Ð¸Ñ‚Ðµ Ð±Ð°Ñ€ {{ limit }} Ð¼Ð¾Ð³ÑƒÑ›Ð½Ð¾ÑÑ‚Ð¸.|Ð˜Ð·Ð°Ð±ÐµÑ€Ð¸Ñ‚Ðµ Ð±Ð°Ñ€ {{ limit }} Ð¼Ð¾Ð³ÑƒÑ›Ð½Ð¾ÑÑ‚Ð¸.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>Ð˜Ð·Ð°Ð±ÐµÑ€Ð¸Ñ‚Ðµ Ð½Ð°Ñ˜Ð²Ð¸ÑˆÐµ {{ limit }} Ð¼Ð¾Ð³ÑƒÑ›Ð½Ð¾ÑÑ‚.|Ð˜Ð·Ð°Ð±ÐµÑ€Ð¸Ñ‚Ðµ Ð½Ð°Ñ˜Ð²Ð¸ÑˆÐµ {{ limit }} Ð¼Ð¾Ð³ÑƒÑ›Ð½Ð¾ÑÑ‚Ð¸.|Ð˜Ð·Ð°Ð±ÐµÑ€Ð¸Ñ‚Ðµ Ð½Ð°Ñ˜Ð²Ð¸ÑˆÐµ {{ limit }} Ð¼Ð¾Ð³ÑƒÑ›Ð½Ð¾ÑÑ‚Ð¸.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>ÐˆÐµÐ´Ð½Ð° Ð¸Ð»Ð¸ Ð²Ð¸ÑˆÐµ Ð²Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚Ð¸ Ñ˜Ðµ Ð½ÐµÐ²Ð°Ð»Ð¸Ð´Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>ÐŸÐ¾Ñ™Ð° {{ fields }} Ð½Ð¸ÑÑƒ Ð±Ð¸Ð»Ð° Ð¾Ñ‡ÐµÐºÐ¸Ð²Ð°Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>ÐŸÐ¾Ñ™Ð° {{ fields }} Ð½ÐµÐ´Ð¾ÑÑ‚Ð°Ñ˜Ñƒ.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ð½Ð¸Ñ˜Ðµ Ð²Ð°Ð»Ð¸Ð´Ð°Ð½ Ð´Ð°Ñ‚ÑƒÐ¼.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ð½Ð¸Ñ˜Ðµ Ð²Ð°Ð»Ð¸Ð´Ð°Ð½ Ð´Ð°Ñ‚ÑƒÐ¼-Ð²Ñ€ÐµÐ¼Ðµ.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ð½Ð¸Ñ˜Ðµ Ð²Ð°Ð»Ð¸Ð´Ð½Ð° Ð°Ð´Ñ€ÐµÑÐ° ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½ÑÐºÐµ Ð¿Ð¾ÑˆÑ‚Ðµ.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>Ð”Ð°Ñ‚Ð¾Ñ‚ÐµÐºÐ° Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð±Ð¸Ñ‚Ð¸ Ð¿Ñ€Ð¾Ð½Ð°Ñ’ÐµÐ½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>Ð”Ð°Ñ‚Ð¾Ñ‚ÐµÐºÐ° Ð½Ð¸Ñ˜Ðµ Ñ‡Ð¸Ñ‚Ñ™Ð¸Ð²Ð°.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Ð”Ð°Ñ‚Ð¾Ñ‚ÐµÐºÐ° Ñ˜Ðµ Ð¿Ñ€ÐµÐ²ÐµÐ»Ð¸ÐºÐ° ({{ size }} {{ suffix }}). ÐÐ°Ñ˜Ð²ÐµÑ›Ð° Ð´Ð¾Ð·Ð²Ð¾Ñ™ÐµÐ½Ð° Ð²ÐµÐ»Ð¸Ñ‡Ð¸Ð½Ð° Ñ˜Ðµ {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>ÐœÐ¸Ð¼Ðµ Ñ‚Ð¸Ð¿ Ð´Ð°Ñ‚Ð¾Ñ‚ÐµÐºÐµ Ð½Ð¸Ñ˜Ðµ Ð²Ð°Ð»Ð¸Ð´Ð°Ð½ ({{ type }}). Ð”Ð¾Ð·Ð²Ð¾Ñ™ÐµÐ½Ð¸ Ð¼Ð¸Ð¼Ðµ Ñ‚Ð¸Ð¿Ð¾Ð²Ð¸ ÑÑƒ {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ñ‚Ñ€ÐµÐ±Ð° Ð´Ð° Ð±ÑƒÐ´Ðµ {{ limit }} Ð¸Ð»Ð¸ Ð¼Ð°ÑšÐµ.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ñ˜Ðµ Ð¿Ñ€ÐµÐ´ÑƒÐ³Ð°Ñ‡ÐºÐ°. Ð¢Ñ€ÐµÐ±Ð° Ð´Ð° Ð¸Ð¼Ð° {{ limit }} ÐºÐ°Ñ€Ð°ÐºÑ‚ÐµÑ€ Ð¸Ð»Ð¸ Ð¼Ð°ÑšÐµ.|Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ñ˜Ðµ Ð¿Ñ€ÐµÐ´ÑƒÐ³Ð°Ñ‡ÐºÐ°. Ð¢Ñ€ÐµÐ±Ð° Ð´Ð° Ð¸Ð¼Ð° {{ limit }} ÐºÐ°Ñ€Ð°ÐºÑ‚ÐµÑ€Ð° Ð¸Ð»Ð¸ Ð¼Ð°ÑšÐµ.|Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ñ˜Ðµ Ð¿Ñ€ÐµÐ´ÑƒÐ³Ð°Ñ‡ÐºÐ°. Ð¢Ñ€ÐµÐ±Ð° Ð´Ð° Ð¸Ð¼Ð° {{ limit }} ÐºÐ°Ñ€Ð°ÐºÑ‚ÐµÑ€Ð° Ð¸Ð»Ð¸ Ð¼Ð°ÑšÐµ.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ñ‚Ñ€ÐµÐ±Ð° Ð´Ð° Ð±ÑƒÐ´Ðµ {{ limit }} Ð¸Ð»Ð¸ Ð²Ð¸ÑˆÐµ.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ñ˜Ðµ Ð¿Ñ€ÐµÐºÑ€Ð°Ñ‚ÐºÐ°. Ð¢Ñ€ÐµÐ±Ð° Ð´Ð° Ð¸Ð¼Ð° {{ limit }} ÐºÐ°Ñ€Ð°ÐºÑ‚ÐµÑ€ Ð¸Ð»Ð¸ Ð²Ð¸ÑˆÐµ.|Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ñ˜Ðµ Ð¿Ñ€ÐµÐºÑ€Ð°Ñ‚ÐºÐ°. Ð¢Ñ€ÐµÐ±Ð° Ð´Ð° Ð¸Ð¼Ð° {{ limit }} ÐºÐ°Ñ€Ð°ÐºÑ‚ÐµÑ€Ð° Ð¸Ð»Ð¸ Ð²Ð¸ÑˆÐµ.|Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ñ˜Ðµ Ð¿Ñ€ÐµÐºÑ€Ð°Ñ‚ÐºÐ°. Ð¢Ñ€ÐµÐ±Ð° Ð´Ð° Ð¸Ð¼Ð° {{ limit }} ÐºÐ°Ñ€Ð°ÐºÑ‚ÐµÑ€Ð° Ð¸Ð»Ð¸ Ð²Ð¸ÑˆÐµ.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ð½Ðµ Ñ‚Ñ€ÐµÐ±Ð° Ð´Ð° Ð±ÑƒÐ´Ðµ Ð¿Ñ€Ð°Ð·Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ð½Ðµ Ñ‚Ñ€ÐµÐ±Ð° Ð´Ð° Ð±ÑƒÐ´Ðµ null.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ñ‚Ñ€ÐµÐ±Ð° Ð´Ð° Ð±ÑƒÐ´Ðµ null.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ñ˜Ðµ Ð½ÐµÐ²Ð°Ð»Ð¸Ð´Ð½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ð½Ð¸Ñ˜Ðµ Ð²Ð°Ð»Ð¸Ð´Ð½Ð¾ Ð²Ñ€ÐµÐ¼Ðµ.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ð½Ð¸Ñ˜Ðµ Ð²Ð°Ð»Ð¸Ð´Ð°Ð½ URL.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>ÐžÐ±Ðµ Ð²Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚Ð¸ Ñ‚Ñ€ÐµÐ±Ð° Ð´Ð° Ð±ÑƒÐ´Ñƒ Ñ˜ÐµÐ´Ð½Ð°ÐºÐµ.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Ð”Ð°Ñ‚Ð¾Ñ‚ÐµÐºÐ° Ñ˜Ðµ Ð¿Ñ€ÐµÐ²ÐµÐ»Ð¸ÐºÐ°. ÐÐ°Ñ˜Ð²ÐµÑ›Ð° Ð´Ð¾Ð·Ð²Ð¾Ñ™ÐµÐ½Ð° Ð²ÐµÐ»Ð¸Ñ‡Ð¸Ð½Ð° Ñ˜Ðµ {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>Ð”Ð°Ñ‚Ð¾Ñ‚ÐµÐºÐ° Ñ˜Ðµ Ð¿Ñ€ÐµÐ²ÐµÐ»Ð¸ÐºÐ°.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>Ð”Ð°Ñ‚Ð¾Ñ‚ÐµÐºÐ° Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð±Ð¸Ñ‚Ð¸ Ð¾Ñ‚Ð¿Ñ€ÐµÐ¼Ñ™ÐµÐ½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ñ‚Ñ€ÐµÐ±Ð° Ð´Ð° Ð±ÑƒÐ´Ðµ Ð²Ð°Ð»Ð¸Ð´Ð°Ð½ Ð±Ñ€Ð¾Ñ˜.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This file is not a valid image.</source>
+                <target>ÐžÐ²Ð° Ð´Ð°Ñ‚Ð¾Ñ‚ÐµÐºÐ° Ð½Ð¸Ñ˜Ðµ Ð²Ð°Ð»Ð¸Ð´Ð½Ð° ÑÐ»Ð¸ÐºÐ°.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This is not a valid IP address.</source>
+                <target>ÐžÐ²Ð¾ Ð½Ð¸Ñ˜Ðµ Ð²Ð°Ð»Ð¸Ð´Ð½Ð° Ð˜ÐŸ Ð°Ð´Ñ€ÐµÑÐ°.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This value is not a valid language.</source>
+                <target>Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ð½Ð¸Ñ˜Ðµ Ð²Ð°Ð»Ð¸Ð´Ð°Ð½ Ñ˜ÐµÐ·Ð¸Ðº.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid locale.</source>
+                <target>Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ð½Ð¸Ñ˜Ðµ Ð²Ð°Ð»Ð¸Ð´Ð°Ð½ Ð»Ð¾ÐºÐ°Ð».</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid country.</source>
+                <target>Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ð½Ð¸Ñ˜Ðµ Ð²Ð°Ð»Ð¸Ð´Ð½Ð° Ð·ÐµÐ¼Ñ™Ð°.</target>
+            </trans-unit>
+            <trans-unit id="41">
+                <source>This value is already used.</source>
+                <target>Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ñ˜Ðµ Ð²ÐµÑ› Ð¸ÑÐºÐ¾Ñ€Ð¸ÑˆÑ›ÐµÐ½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="42">
+                <source>The size of the image could not be detected.</source>
+                <target>Ð’ÐµÐ»Ð¸Ñ‡Ð¸Ð½Ð° ÑÐ»Ð¸ÐºÐµ Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð±Ð¸Ñ‚Ð¸ Ð¾Ð´Ñ€ÐµÑ’ÐµÐ½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="43">
+                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
+                <target>Ð¨Ð¸Ñ€Ð¸Ð½Ð° ÑÐ»Ð¸ÐºÐµ Ñ˜Ðµ Ð¿Ñ€ÐµÐ²ÐµÐ»Ð¸ÐºÐ° ({{ width }}px). ÐÐ°Ñ˜ÐµÑ›Ð° Ð´Ð¾Ð·Ð²Ð¾Ñ™ÐµÐ½Ð° ÑˆÐ¸Ñ€Ð¸Ð½Ð° Ñ˜Ðµ {{ max_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="44">
+                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
+                <target>Ð¨Ð¸Ñ€Ð¸Ð½Ð° ÑÐ»Ð¸ÐºÐµ Ñ˜Ðµ Ð¿Ñ€ÐµÐ¼Ð°Ð»Ð° ({{ width }}px). ÐÐ°Ñ˜Ð¼Ð°ÑšÐ° Ð´Ð¾Ð·Ð²Ð¾Ñ™ÐµÐ½Ð° ÑˆÐ¸Ñ€Ð¸Ð½Ð° Ñ˜Ðµ {{ min_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="45">
+                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
+                <target>Ð’Ð¸ÑÐ¸Ð½Ð° ÑÐ»Ð¸ÐºÐµ Ñ˜Ðµ Ð¿Ñ€ÐµÐ²ÐµÐ»Ð¸ÐºÐ° ({{ height }}px). ÐÐ°Ñ˜ÐµÑ›Ð° Ð´Ð¾Ð·Ð²Ð¾Ñ™ÐµÐ½Ð° Ð²Ð¸ÑÐ¸Ð½Ð° Ñ˜Ðµ {{ max_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="46">
+                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
+                <target>Ð’Ð¸ÑÐ¸Ð½Ð° ÑÐ»Ð¸ÐºÐµ Ñ˜Ðµ Ð¿Ñ€ÐµÐ¼Ð°Ð»Ð° ({{ height }}px). ÐÐ°Ñ˜Ð¼Ð°ÑšÐ° Ð´Ð¾Ð·Ð²Ð¾Ñ™ÐµÐ½Ð° Ð²Ð¸ÑÐ¸Ð½Ð° Ñ˜Ðµ {{ min_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="47">
+                <source>This value should be the user current password.</source>
+                <target>Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ñ‚Ñ€ÐµÐ±Ð° Ð´Ð° Ð±ÑƒÐ´Ðµ Ñ‚Ñ€ÐµÐ½ÑƒÑ‚Ð½Ð° ÐºÐ¾Ñ€Ð¸ÑÐ½Ð¸Ñ‡ÐºÐ° Ð»Ð¾Ð·Ð¸Ð½ÐºÐ°.</target>
+            </trans-unit>
+            <trans-unit id="48">
+                <source>This value should have exactly {{ limit }} characters.</source>
+                <target>Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ñ‚Ñ€ÐµÐ±Ð° Ð´Ð° Ð¸Ð¼Ð° Ñ‚Ð°Ñ‡Ð½Ð¾ {{ limit }} ÐºÐ°Ñ€Ð°ÐºÑ‚ÐµÑ€.|Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ñ‚Ñ€ÐµÐ±Ð° Ð´Ð° Ð¸Ð¼Ð° Ñ‚Ð°Ñ‡Ð½Ð¾ {{ limit }} ÐºÐ°Ñ€Ð°ÐºÑ‚ÐµÑ€Ð°.|Ð’Ñ€ÐµÐ´Ð½Ð¾ÑÑ‚ Ñ‚Ñ€ÐµÐ±Ð° Ð´Ð° Ð¸Ð¼Ð° Ñ‚Ð°Ñ‡Ð½Ð¾ {{ limit }} ÐºÐ°Ñ€Ð°ÐºÑ‚ÐµÑ€Ð°.</target>
+            </trans-unit>
+            <trans-unit id="49">
+                <source>The file was only partially uploaded.</source>
+                <target>Ð”Ð°Ñ‚Ð¾Ñ‚ÐµÐºÐ° Ñ˜Ðµ ÑÐ°Ð¼Ð¾ Ð¿Ð°Ñ€Ñ†Ð¸Ñ˜Ð°Ð»Ð½Ð¾ Ð¾Ñ‚Ð¿Ñ€ÐµÐ¼Ñ™ÐµÐ½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="50">
+                <source>No file was uploaded.</source>
+                <target>Ð”Ð°Ñ‚Ð¾Ñ‚ÐµÐºÐ° Ð½Ð¸Ñ˜Ðµ Ð¾Ñ‚Ð¿Ñ€ÐµÐ¼Ñ™ÐµÐ½Ð°.</target>
+            </trans-unit>
+            <trans-unit id="51">
+                <source>No temporary folder was configured in php.ini.</source>
+                <target>ÐŸÑ€Ð¸Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ˜ÑƒÐ¼ Ð½Ð¸Ñ˜Ðµ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð¸ÑÐ°Ð½ Ñƒ php.ini.</target>
+            </trans-unit>
+            <trans-unit id="52">
+                <source>Cannot write temporary file to disk.</source>
+                <target>ÐÐµÐ¼Ð¾Ð³ÑƒÑ›Ðµ Ð¿Ð¸ÑÐ°ÑšÐµ Ð¿Ñ€Ð¸Ð²Ñ€ÐµÐ¼ÐµÐ½Ðµ Ð´Ð°Ñ‚Ð¾Ñ‚ÐµÐºÐµ Ð½Ð° Ð´Ð¸ÑÐº.</target>
+            </trans-unit>
+            <trans-unit id="53">
+                <source>A PHP extension caused the upload to fail.</source>
+                <target>PHP ÐµÐºÑÑ‚ÐµÐ½Ð·Ð¸Ñ˜Ð° Ñ˜Ðµ Ð¿Ñ€Ð¾ÑƒÐ·Ñ€Ð¾ÐºÐ¾Ð²Ð°Ð»Ð° Ð½ÐµÑƒÑÐ¿ÐµÑ… Ð¾Ñ‚Ð¿Ñ€ÐµÐ¼Ð°ÑšÐ° Ð´Ð°Ñ‚Ð¾Ñ‚ÐµÐºÐµ.</target>
+            </trans-unit>
+            <trans-unit id="54">
+                <source>This collection should contain {{ limit }} elements or more.</source>
+                <target>ÐžÐ²Ð° ÐºÐ¾Ð»ÐµÐºÑ†Ð¸Ñ˜Ð° Ñ‚Ñ€ÐµÐ±Ð° Ð´Ð° ÑÐ°Ð´Ñ€Ð¶Ð¸ {{ limit }} Ð¸Ð»Ð¸ Ð²Ð¸ÑˆÐµ ÐµÐ»ÐµÐ¼ÐµÐ½Ð°Ñ‚Ð°.|ÐžÐ²Ð° ÐºÐ¾Ð»ÐµÐºÑ†Ð¸Ñ˜Ð° Ñ‚Ñ€ÐµÐ±Ð° Ð´Ð° ÑÐ°Ð´Ñ€Ð¶Ð¸ {{ limit }} Ð¸Ð»Ð¸ Ð²Ð¸ÑˆÐµ ÐµÐ»ÐµÐ¼ÐµÐ½Ð°Ñ‚Ð°.|ÐžÐ²Ð° ÐºÐ¾Ð»ÐµÐºÑ†Ð¸Ñ˜Ð° Ñ‚Ñ€ÐµÐ±Ð° Ð´Ð° ÑÐ°Ð´Ñ€Ð¶Ð¸ {{ limit }} Ð¸Ð»Ð¸ Ð²Ð¸ÑˆÐµ ÐµÐ»ÐµÐ¼ÐµÐ½Ð°Ñ‚Ð°.</target>
+            </trans-unit>
+            <trans-unit id="55">
+                <source>This collection should contain {{ limit }} elements or less.</source>
+                <target>ÐžÐ²Ð° ÐºÐ¾Ð»ÐµÐºÑ†Ð¸Ñ˜Ð° Ñ‚Ñ€ÐµÐ±Ð° Ð´Ð° ÑÐ°Ð´Ñ€Ð¶Ð¸ {{ limit }} Ð¸Ð»Ð¸ Ð¼Ð°ÑšÐµ ÐµÐ»ÐµÐ¼ÐµÐ½Ð°Ñ‚Ð°.|ÐžÐ²Ð° ÐºÐ¾Ð»ÐµÐºÑ†Ð¸Ñ˜Ð° Ñ‚Ñ€ÐµÐ±Ð° Ð´Ð° ÑÐ°Ð´Ñ€Ð¶Ð¸ {{ limit }} Ð¸Ð»Ð¸ Ð¼Ð°ÑšÐµ ÐµÐ»ÐµÐ¼ÐµÐ½Ð°Ñ‚Ð°.|ÐžÐ²Ð° ÐºÐ¾Ð»ÐµÐºÑ†Ð¸Ñ˜Ð° Ñ‚Ñ€ÐµÐ±Ð° Ð´Ð° ÑÐ°Ð´Ñ€Ð¶Ð¸ {{ limit }} Ð¸Ð»Ð¸ Ð¼Ð°ÑšÐµ ÐµÐ»ÐµÐ¼ÐµÐ½Ð°Ñ‚Ð°.</target>
+            </trans-unit>
+            <trans-unit id="56">
+                <source>This collection should contain exactly {{ limit }} elements.</source>
+                <target>ÐžÐ²Ð° ÐºÐ¾Ð»ÐµÐºÑ†Ð¸Ñ˜Ð° Ñ‚Ñ€ÐµÐ±Ð° Ð´Ð° ÑÐ°Ð´Ñ€Ð¶Ð¸ Ñ‚Ð°Ñ‡Ð½Ð¾ {{ limit }} ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚.|ÐžÐ²Ð° ÐºÐ¾Ð»ÐµÐºÑ†Ð¸Ñ˜Ð° Ñ‚Ñ€ÐµÐ±Ð° Ð´Ð° ÑÐ°Ð´Ñ€Ð¶Ð¸ Ñ‚Ð°Ñ‡Ð½Ð¾ {{ limit }} ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚Ð°.|ÐžÐ²Ð° ÐºÐ¾Ð»ÐµÐºÑ†Ð¸Ñ˜Ð° Ñ‚Ñ€ÐµÐ±Ð° Ð´Ð° ÑÐ°Ð´Ñ€Ð¶Ð¸ Ñ‚Ð°Ñ‡Ð½Ð¾ {{ limit }} ÐµÐ»ÐµÐ¼ÐµÐ½Ð°Ñ‚Ð°.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.sr_Latn.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.sr_Latn.xlf
new file mode 100644
index 0000000..0ecba2c
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.sr_Latn.xlf
@@ -0,0 +1,219 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>Vrednost treba da bude netaÄna.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>Vrednost treba da bude taÄna.</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>Vrednost treba da bude tipa {{ type }}.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>Vrednost treba da bude prazna.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>Vrednost treba da bude jedna od ponuÄ‘enih.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>Izaberite bar {{ limit }} moguÄ‡nost.|Izaberite bar {{ limit }} moguÄ‡nosti.|Izaberite bar {{ limit }} moguÄ‡nosti.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>Izaberite najviÅ¡e {{ limit }} moguÄ‡nost.|Izaberite najviÅ¡e {{ limit }} moguÄ‡nosti.|Izaberite najviÅ¡e {{ limit }} moguÄ‡nosti.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>Jedna ili viÅ¡e vrednosti je nevalidna.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>Polja {{ fields }} nisu bila oÄekivana.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>Polja {{ fields }} nedostaju.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>Vrednost nije validan datum.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>Vrednost nije validan datum-vreme.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>Vrednost nije validna adresa elektronske poÅ¡te.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>Datoteka ne moÅ¾e biti pronaÄ‘ena.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>Datoteka nije Äitljiva.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Datoteka je prevelika ({{ size }} {{ suffix }}). NajveÄ‡a dozvoljena veliÄina je {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>Mime tip datoteke nije validan ({{ type }}). Dozvoljeni mime tipovi su {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>Vrednost treba da bude {{ limit }} ili manje.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>Vrednost je predugaÄka. Treba da ima {{ limit }} karakter ili manje.|Vrednost je predugaÄka. Treba da ima {{ limit }} karaktera ili manje.|Vrednost je predugaÄka. Treba da ima {{ limit }} karaktera ili manje.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>Vrednost treba da bude {{ limit }} ili viÅ¡e.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>Vrednost je prekratka. Treba da ima {{ limit }} karakter ili viÅ¡e.|Vrednost je prekratka. Treba da ima {{ limit }} karaktera ili viÅ¡e.|Vrednost je prekratka. Treba da ima {{ limit }} karaktera ili viÅ¡e.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>Vrednost ne treba da bude prazna.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>Vrednost ne treba da bude null.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>Vrednost treba da bude null.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>Vrednost je nevalidna.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>Vrednost nije validno vreme.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>Vrednost nije validan URL.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>Obe vrednosti treba da budu jednake.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Datoteka je prevelika. NajveÄ‡a dozvoljena veliÄina je {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>Datoteka je prevelika.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>Datoteka ne moÅ¾e biti otpremljena.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>Vrednost treba da bude validan broj.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This file is not a valid image.</source>
+                <target>Ova datoteka nije validna slika.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This is not a valid IP address.</source>
+                <target>Ovo nije validna IP adresa.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This value is not a valid language.</source>
+                <target>Vrednost nije validan jezik.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid locale.</source>
+                <target>Vrednost nije validan lokal.</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid country.</source>
+                <target>Vrednost nije validna zemlja.</target>
+            </trans-unit>
+            <trans-unit id="41">
+                <source>This value is already used.</source>
+                <target>Vrednost je veÄ‡ iskoriÅ¡Ä‡ena.</target>
+            </trans-unit>
+            <trans-unit id="42">
+                <source>The size of the image could not be detected.</source>
+                <target>VeliÄina slike ne moÅ¾e biti odreÄ‘ena.</target>
+            </trans-unit>
+            <trans-unit id="43">
+                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
+                <target>Å irina slike je prevelika ({{ width }}px). NajeÄ‡a dozvoljena Å¡irina je {{ max_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="44">
+                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
+                <target>Å irina slike je premala ({{ width }}px). Najmanja dozvoljena Å¡irina je {{ min_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="45">
+                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
+                <target>Visina slike je prevelika ({{ height }}px). NajeÄ‡a dozvoljena visina je {{ max_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="46">
+                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
+                <target>Visina slike je premala ({{ height }}px). Najmanja dozvoljena visina je {{ min_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="47">
+                <source>This value should be the user current password.</source>
+                <target>Vrednost treba da bude trenutna korisniÄka lozinka.</target>
+            </trans-unit>
+            <trans-unit id="48">
+                <source>This value should have exactly {{ limit }} characters.</source>
+                <target>Vrednost treba da ima taÄno {{ limit }} karakter.|Vrednost treba da ima taÄno {{ limit }} karaktera.|Vrednost treba da ima taÄno {{ limit }} karaktera.</target>
+            </trans-unit>
+            <trans-unit id="49">
+                <source>The file was only partially uploaded.</source>
+                <target>Datoteka je samo parcijalno otpremljena.</target>
+            </trans-unit>
+            <trans-unit id="50">
+                <source>No file was uploaded.</source>
+                <target>Datoteka nije otpremljena.</target>
+            </trans-unit>
+            <trans-unit id="51">
+                <source>No temporary folder was configured in php.ini.</source>
+                <target>Privremeni direktorijum nije konfigurisan u php.ini.</target>
+            </trans-unit>
+            <trans-unit id="52">
+                <source>Cannot write temporary file to disk.</source>
+                <target>NemoguÄ‡e pisanje privremene datoteke na disk.</target>
+            </trans-unit>
+            <trans-unit id="53">
+                <source>A PHP extension caused the upload to fail.</source>
+                <target>PHP ekstenzija je prouzrokovala neuspeh otpremanja datoteke.</target>
+            </trans-unit>
+            <trans-unit id="54">
+                <source>This collection should contain {{ limit }} elements or more.</source>
+                <target>Ova kolekcija treba da sadrÅ¾i {{ limit }} ili viÅ¡e elemenata.|Ova kolekcija treba da sadrÅ¾i {{ limit }} ili viÅ¡e elemenata.|Ova kolekcija treba da sadrÅ¾i {{ limit }} ili viÅ¡e elemenata.</target>
+            </trans-unit>
+            <trans-unit id="55">
+                <source>This collection should contain {{ limit }} elements or less.</source>
+                <target>Ova kolekcija treba da sadrÅ¾i {{ limit }} ili manje elemenata.|Ova kolekcija treba da sadrÅ¾i {{ limit }} ili manje elemenata.|Ova kolekcija treba da sadrÅ¾i {{ limit }} ili manje elemenata.</target>
+            </trans-unit>
+            <trans-unit id="56">
+                <source>This collection should contain exactly {{ limit }} elements.</source>
+                <target>Ova kolekcija treba da sadrÅ¾i taÄno {{ limit }} element.|Ova kolekcija treba da sadrÅ¾i taÄno {{ limit }} elementa.|Ova kolekcija treba da sadrÅ¾i taÄno {{ limit }} elemenata.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.sv.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.sv.xlf
new file mode 100644
index 0000000..8383e50
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.sv.xlf
@@ -0,0 +1,219 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>VÃ¤rdet ska vara falskt.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>VÃ¤rdet ska vara sant.</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>VÃ¤rdet ska vara av typen {{ type }}.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>VÃ¤rdet ska vara tomt.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>VÃ¤rdet ska vara ett av de givna valen.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>Du mÃ¥ste vÃ¤lja minst {{ limit }} val.|Du mÃ¥ste vÃ¤lja minst {{ limit }} val.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>Du kan som mest vÃ¤lja {{ limit }} val.|Du kan som mest vÃ¤lja {{ limit }} val.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>Ett eller fler av de angivna vÃ¤rdena Ã¤r ogiltigt.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>FÃ¤lten {{ fields }} var ovÃ¤ntade.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>FÃ¤lten {{ fields }} saknas.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>VÃ¤rdet Ã¤r inte ett giltigt datum.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>VÃ¤rdet Ã¤r inte ett giltigt datum med tid.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>VÃ¤rdet Ã¤r inte en giltig epost-adress.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>Filen kunde inte hittas.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>Filen Ã¤r inte lÃ¤sbar.</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Filen Ã¤r fÃ¶r stor ({{ size }} {{ suffix }}). StÃ¶rsta tillÃ¥tna storlek Ã¤r {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>Filens MIME-typ ({{ type }}) Ã¤r ogiltig. De tillÃ¥tna typerna Ã¤r {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>VÃ¤rdet ska vara {{ limit }} eller mindre.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>VÃ¤rdet Ã¤r fÃ¶r lÃ¥ngt. Det ska ha {{ limit }} tecken eller fÃ¤rre.|VÃ¤rdet Ã¤r fÃ¶r lÃ¥ngt. Det ska ha {{ limit }} tecken eller fÃ¤rre.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>VÃ¤rdet ska vara {{ limit }} eller mer.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>VÃ¤rdet Ã¤r fÃ¶r kort. Det ska ha {{ limit }} tecken eller mer.|VÃ¤rdet Ã¤r fÃ¶r kort. Det ska ha {{ limit }} tecken eller mer.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>VÃ¤rdet kan inte vara tomt.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>VÃ¤rdet kan inte vara null.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>VÃ¤rdet ska vara null.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>VÃ¤rdet Ã¤r inte giltigt.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>VÃ¤rdet Ã¤r inte en giltig tid.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>VÃ¤rdet Ã¤r inte en giltig URL.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>De tvÃ¥ vÃ¤rdena mÃ¥ste vara lika.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>Filen Ã¤r fÃ¶r stor. TillÃ¥ten maximal storlek Ã¤r {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>Filen Ã¤r fÃ¶r stor.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>Filen kunde inte laddas upp.</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>VÃ¤rdet ska vara ett giltigt nummer.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This file is not a valid image.</source>
+                <target>Den Ã¤r filen Ã¤r ingen giltig bild.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This is not a valid IP address.</source>
+                <target>Det hÃ¤r Ã¤r inte en giltig IP-adress.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This value is not a valid language.</source>
+                <target>VÃ¤rdet Ã¤r inte ett giltigt sprÃ¥k.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid locale.</source>
+                <target>VÃ¤rdet Ã¤r inte en giltig plats.</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid country.</source>
+                <target>VÃ¤rdet Ã¤r inte ett giltigt land.</target>
+            </trans-unit>
+            <trans-unit id="41">
+                <source>This value is already used.</source>
+                <target>VÃ¤rdet anvÃ¤nds redan.</target>
+            </trans-unit>
+            <trans-unit id="42">
+                <source>The size of the image could not be detected.</source>
+                <target>Det gick inte att faststÃ¤lla storleken pÃ¥ bilden.</target>
+            </trans-unit>
+            <trans-unit id="43">
+                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
+                <target>Bildens bredd Ã¤r fÃ¶r stor ({{ width }}px). TillÃ¥ten maximal bredd Ã¤r {{ max_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="44">
+                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
+                <target>Bildens bredd Ã¤r fÃ¶r liten ({{ width }}px). Minsta fÃ¶rvÃ¤ntade bredd Ã¤r {{ min_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="45">
+                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
+                <target>Bildens hÃ¶jd Ã¤r fÃ¶r stor ({{ height }}px). TillÃ¥ten maximal bredd Ã¤r {{ max_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="46">
+                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
+                <target>Bildens hÃ¶jd Ã¤r fÃ¶r liten ({{ height }}px). Minsta fÃ¶rvÃ¤ntade hÃ¶jd Ã¤r {{ min_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="47">
+                <source>This value should be the user current password.</source>
+                <target>VÃ¤rdet ska vara anvÃ¤ndarens nuvarande lÃ¶senord.</target>
+            </trans-unit>
+            <trans-unit id="48">
+                <source>This value should have exactly {{ limit }} characters.</source>
+                <target>VÃ¤rdet ska ha exakt {{ limit }} tecken.|VÃ¤rdet ska ha exakt {{ limit }} tecken.</target>
+            </trans-unit>
+            <trans-unit id="49">
+                <source>The file was only partially uploaded.</source>
+                <target>Filen laddades bara upp delvis.</target>
+            </trans-unit>
+            <trans-unit id="50">
+                <source>No file was uploaded.</source>
+                <target>Ingen fil laddades upp.</target>
+            </trans-unit>
+            <trans-unit id="51">
+                <source>No temporary folder was configured in php.ini.</source>
+                <target>Det finns ingen temporÃ¤r mapp konfigurerad i php.ini.</target>
+            </trans-unit>
+            <trans-unit id="52">
+                <source>Cannot write temporary file to disk.</source>
+                <target>Kan inte skriva temporÃ¤r fil till disken.</target>
+            </trans-unit>
+            <trans-unit id="53">
+                <source>A PHP extension caused the upload to fail.</source>
+                <target>En PHP extension gjorde att uppladdningen misslyckades.</target>
+            </trans-unit>
+            <trans-unit id="54">
+                <source>This collection should contain {{ limit }} elements or more.</source>
+                <target>Den hÃ¤r samlingen ska innehÃ¥lla {{ limit }} element eller mer.|Den hÃ¤r samlingen ska innehÃ¥lla {{ limit }} element eller mer.</target>
+            </trans-unit>
+            <trans-unit id="55">
+                <source>This collection should contain {{ limit }} elements or less.</source>
+                <target>Den hÃ¤r samlingen ska innehÃ¥lla {{ limit }} element eller mindre.|Den hÃ¤r samlingen ska innehÃ¥lla {{ limit }} element eller mindre.</target>
+            </trans-unit>
+            <trans-unit id="56">
+                <source>This collection should contain exactly {{ limit }} elements.</source>
+                <target>Den hÃ¤r samlingen ska innehÃ¥lla exakt {{ limit }} element.|Den hÃ¤r samlingen ska innehÃ¥lla exakt {{ limit }} element.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
\ No newline at end of file
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.uk.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.uk.xlf
new file mode 100644
index 0000000..f572f0f
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.uk.xlf
@@ -0,0 +1,163 @@
+ï»¿<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð¾ Ð±ÑƒÑ‚Ð¸ ÐÑ–</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð¾ Ð±ÑƒÑ‚Ð¸ Ð¢Ð°Ðº</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}</source>
+                <target>Ð¢Ð¸Ð¿ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½ÐµÐ½ Ð±ÑƒÑ‚Ð¸ {{ type }}</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð¾ Ð±ÑƒÑ‚Ð¸ Ð¿ÑƒÑÑ‚Ð¸Ð¼</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice</source>
+                <target>ÐžÐ±Ñ€Ð°Ð½Ðµ Ð²Ð°Ð¼Ð¸ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ðµ</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices</source>
+                <target>Ð’Ð¸ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ– Ð¾Ð±Ñ€Ð°Ñ‚Ð¸ Ñ…Ð¾Ñ‡Ð° Ð± {{ limit }} Ð²Ð°Ñ€Ñ–Ð°Ð½Ñ‚Ñ–Ð²</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices</source>
+                <target>Ð’Ð¸ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ– Ð¾Ð±Ñ€Ð°Ñ‚Ð¸ Ð½Ðµ Ð±Ñ–Ð»ÑŒÑˆÐµ Ð½Ñ–Ð¶ {{ limit }} Ð²Ð°Ñ€Ñ–Ð°Ð½Ñ‚Ñ–Ð²</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid</source>
+                <target>ÐžÐ´Ð½Ðµ Ð°Ð±Ð¾ ÐºÑ–Ð»ÑŒÐºÐ° Ð·Ð°Ð´Ð°Ð½Ð¸Ñ… Ð·Ð½Ð°Ñ‡ÐµÐ½ÑŒ Ñ” Ð½ÐµÐ´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ñ–</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected</source>
+                <target>ÐŸÐ¾Ð»Ñ {{ fields }} Ð½Ðµ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð»Ð¸ÑÑ</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing</source>
+                <target>ÐŸÐ¾Ð»Ñ {{ fields }} Ð²Ñ–Ð´ÑÑƒÑ‚Ð½Ñ–</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date</source>
+                <target>Ð”Ð°Ð½Ðµ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ Ñ” Ð²Ñ–Ñ€Ð½Ð¾ÑŽ Ð´Ð°Ñ‚Ð¾ÑŽ</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime</source>
+                <target>Ð”Ð°Ð½Ðµ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð°Ñ‚Ð¸ Ñ‚Ð° Ñ‡Ð°ÑÑƒ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ðµ</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð°Ð´Ñ€ÐµÑÐ¸ ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— Ð¿Ð¾ÑˆÑ‚Ð¸ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ðµ</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found</source>
+                <target>Ð¤Ð°Ð¹Ð» Ð½Ðµ Ð·Ð½Ð°Ð¹Ð´ÐµÐ½Ð¾</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable</source>
+                <target>Ð¤Ð°Ð¹Ð» Ð½Ðµ Ñ‡Ð¸Ñ‚Ð°Ñ”Ñ‚ÑŒÑÑ</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }}). Allowed maximum size is {{ limit }}</source>
+                <target>Ð¤Ð°Ð¹Ð» Ð·Ð°Ð½Ð°Ð´Ñ‚Ð¾ Ð²ÐµÐ»Ð¸ÐºÐ¸Ð¹ ({{ size }}). Ð”Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð¸Ð¹ Ð¼Ð°ÐºÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð¸Ð¹ Ñ€Ð¾Ð·Ð¼Ñ–Ñ€ {{ limit }}</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}</source>
+                <target>MIME-Ñ‚Ð¸Ð¿ Ñ„Ð°Ð¹Ð»Ñƒ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ð¸Ð¹ ({{ type }}). Ð”Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ñ– MIME-Ñ‚Ð¸Ð¿Ð¸ Ñ„Ð°Ð¹Ð»Ñ–Ð² {{ types }}</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð¾ Ð±ÑƒÑ‚Ð¸ {{ limit }} Ð°Ð±Ð¾ Ð¼ÐµÐ½ÑˆÐµ</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð°Ð½Ð°Ð´Ñ‚Ð¾ Ð´Ð¾Ð²Ð³Ðµ. ÐŸÐ¾Ð²Ð¸Ð½Ð½Ð¾ Ð±ÑƒÑ‚Ð¸ {{ limit }} ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ–Ð² Ð°Ð±Ð¾ Ð¼ÐµÐ½ÑˆÐµ</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð¾ Ð±ÑƒÑ‚Ð¸ {{ limit }} Ð°Ð±Ð¾ Ð±Ñ–Ð»ÑŒÑˆÐµ</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð°Ð½Ð°Ð´Ñ‚Ð¾ ÐºÐ¾Ñ€Ð¾Ñ‚ÐºÐµ. ÐŸÐ¾Ð²Ð¸Ð½Ð½Ð¾ Ð±ÑƒÑ‚Ð¸ {{ limit }} ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ–Ð² Ð°Ð±Ð¾ Ð±Ñ–Ð»ÑŒÑˆÐµ</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð¾ Ð±ÑƒÑ‚Ð¸ Ð¿ÑƒÑÑ‚Ð¸Ð¼</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð¾ Ð±ÑƒÑ‚Ð¸ null</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð¾ Ð±ÑƒÑ‚Ð¸ null</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ðµ</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‡Ð°ÑÑƒ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ðµ</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ URL Ð½ÐµÐ´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ðµ</target>
+            </trans-unit>
+            <trans-unit id="28">
+                <source>This form should not contain extra fields</source>
+                <target>Ð¦Ñ Ñ„Ð¾Ñ€Ð¼Ð° Ð½Ðµ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð° Ð¼Ñ–ÑÑ‚Ð¸Ñ‚Ð¸ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¸Ñ… Ð¿Ð¾Ð»Ñ–Ð²</target>
+            </trans-unit>
+            <trans-unit id="29">
+                <source>The uploaded file was too large. Please try to upload a smaller file</source>
+                <target>Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð¸Ð¹ Ñ„Ð°Ð¹Ð» Ð·Ð°Ð½Ð°Ð´Ñ‚Ð¾ Ð²ÐµÐ»Ð¸ÐºÐ¸Ð¹. Ð‘ÑƒÐ´ÑŒ-Ð»Ð°ÑÐºÐ°, ÑÐ¿Ñ€Ð¾Ð±ÑƒÐ¹Ñ‚Ðµ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ Ñ„Ð°Ð¹Ð» Ð¼ÐµÐ½ÑˆÐ¾Ð³Ð¾ Ñ€Ð¾Ð·Ð¼Ñ–Ñ€Ñƒ</target>
+            </trans-unit>
+            <trans-unit id="30">
+                <source>The CSRF token is invalid. Please try to resubmit the form</source>
+                <target>CSRF Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ðµ. Ð‘ÑƒÐ´ÑŒ-Ð»Ð°ÑÐºÐ°, ÑÐ¿Ñ€Ð¾Ð±ÑƒÐ¹Ñ‚Ðµ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð¸Ñ‚Ð¸ Ñ„Ð¾Ñ€Ð¼Ñƒ Ð·Ð½Ð¾Ð²Ñƒ</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal</source>
+                <target>ÐžÐ±Ð¸Ð´Ð²Ð° Ð·Ð°Ð½Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ– Ð±ÑƒÑ‚Ð¸ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¸Ð¼Ð¸</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }}</source>
+                <target>Ð¤Ð°Ð¹Ð» Ð·Ð°Ð½Ð°Ð´Ñ‚Ð¾ Ð²ÐµÐ»Ð¸ÐºÐ¸Ð¹. ÐœÐ°ÐºÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð¸Ð¹ Ð´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ð¸Ð¹ Ñ€Ð¾Ð·Ð¼Ñ–Ñ€ {{ limit }}</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large</source>
+                <target>Ð¤Ð°Ð¹Ð» Ð·Ð°Ð½Ð°Ð´Ñ‚Ð¾ Ð²ÐµÐ»Ð¸ÐºÐ¸Ð¹</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded</source>
+                <target>Ð¤Ð°Ð¹Ð» Ð½Ðµ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð°Ñ” Ð±ÑƒÑ‚Ð¸ Ð´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ð¸Ð¼ Ñ‡Ð¸ÑÐ»Ð¾Ð¼</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This value is not a valid country</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ Ñ” Ð´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ð¸Ð¼ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½ÑÐ¼ ÐºÑ€Ð°Ñ—Ð½Ð¸</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This file is not a valid image</source>
+                <target>Ð¦ÐµÐ¹ Ñ„Ð°Ð¹Ð» Ð½Ðµ Ñ” Ð´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ð¸Ð¼ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¾Ð¼ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This is not a valid IP address</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ Ñ” Ð´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ð¾ÑŽ IP Ð°Ð´Ñ€ÐµÑÐ¾ÑŽ</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid language</source>
+                <target>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ Ñ” Ð´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ð¸Ð¼ ÐºÐ¾Ð´Ð¾Ð¼ Ð¼Ð¾Ð²Ð¸</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
\ No newline at end of file
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.zh_CN.xlf b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.zh_CN.xlf
new file mode 100644
index 0000000..344ad56
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Resources/translations/validators.zh_CN.xlf
@@ -0,0 +1,219 @@
+<?xml version="1.0"?>
+<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
+    <file source-language="en" datatype="plaintext" original="file.ext">
+        <body>
+            <trans-unit id="1">
+                <source>This value should be false.</source>
+                <target>è¯¥å˜é‡çš„å€¼åº”ä¸º false.</target>
+            </trans-unit>
+            <trans-unit id="2">
+                <source>This value should be true.</source>
+                <target>è¯¥å˜é‡çš„å€¼åº”ä¸º true.</target>
+            </trans-unit>
+            <trans-unit id="3">
+                <source>This value should be of type {{ type }}.</source>
+                <target>è¯¥å˜é‡çš„ç±»åž‹åº”ä¸º {{ type }}.</target>
+            </trans-unit>
+            <trans-unit id="4">
+                <source>This value should be blank.</source>
+                <target>è¯¥å˜é‡å€¼åº”ä¸ºç©º.</target>
+            </trans-unit>
+            <trans-unit id="5">
+                <source>The value you selected is not a valid choice.</source>
+                <target>é€‰å®šå˜é‡çš„å€¼ä¸æ˜¯æœ‰æ•ˆçš„é€‰é¡¹.</target>
+            </trans-unit>
+            <trans-unit id="6">
+                <source>You must select at least {{ limit }} choices.</source>
+                <target>æ‚¨è‡³å°‘è¦é€‰æ‹© {{ limit }} ä¸ªé€‰é¡¹.</target>
+            </trans-unit>
+            <trans-unit id="7">
+                <source>You must select at most {{ limit }} choices.</source>
+                <target>æ‚¨æœ€å¤šèƒ½é€‰æ‹© {{ limit }} ä¸ªé€‰é¡¹.</target>
+            </trans-unit>
+            <trans-unit id="8">
+                <source>One or more of the given values is invalid.</source>
+                <target>ä¸€ä¸ªæˆ–è€…å¤šä¸ªç»™å®šçš„å€¼æ— æ•ˆ.</target>
+            </trans-unit>
+            <trans-unit id="9">
+                <source>The fields {{ fields }} were not expected.</source>
+                <target>éžé¢„æœŸå­—æ®µ {{ fields }}.</target>
+            </trans-unit>
+            <trans-unit id="10">
+                <source>The fields {{ fields }} are missing.</source>
+                <target>é—æ¼å­—æ®µ {{ fields }}.</target>
+            </trans-unit>
+            <trans-unit id="11">
+                <source>This value is not a valid date.</source>
+                <target>è¯¥å€¼ä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆæ—¥æœŸï¼ˆdateï¼‰.</target>
+            </trans-unit>
+            <trans-unit id="12">
+                <source>This value is not a valid datetime.</source>
+                <target>è¯¥å€¼ä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆæ—¥æœŸæ—¶é—´ï¼ˆdatetimeï¼‰.</target>
+            </trans-unit>
+            <trans-unit id="13">
+                <source>This value is not a valid email address.</source>
+                <target>è¯¥å€¼ä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆé‚®ä»¶åœ°å€.</target>
+            </trans-unit>
+            <trans-unit id="14">
+                <source>The file could not be found.</source>
+                <target>æ–‡ä»¶æœªæ‰¾åˆ°.</target>
+            </trans-unit>
+            <trans-unit id="15">
+                <source>The file is not readable.</source>
+                <target>æ–‡ä»¶ä¸å¯è¯».</target>
+            </trans-unit>
+            <trans-unit id="16">
+                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>æ–‡ä»¶å¤ªå¤§ ({{ size }} {{ suffix }}). æ–‡ä»¶å¤§å°ä¸å¯ä»¥è¶…è¿‡ {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="17">
+                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
+                <target>æ–‡ä»¶ç±»åž‹ä¸åˆæ³• ({{ type }}). åˆæ³•çš„æ–‡ä»¶ç±»åž‹æœ‰ {{ types }}.</target>
+            </trans-unit>
+            <trans-unit id="18">
+                <source>This value should be {{ limit }} or less.</source>
+                <target>è¿™ä¸ªå˜é‡çš„å€¼åº”è¯¥å°äºŽæˆ–ç­‰äºŽ {{ limit }}.</target>
+            </trans-unit>
+            <trans-unit id="19">
+                <source>This value is too long. It should have {{ limit }} characters or less.</source>
+                <target>å­—ç¬¦ä¸²å¤ªé•¿ï¼Œ é•¿åº¦ä¸å¯è¶…è¿‡ {{ limit }} ä¸ªå­—ç¬¦.</target>
+            </trans-unit>
+            <trans-unit id="20">
+                <source>This value should be {{ limit }} or more.</source>
+                <target>è¯¥å˜é‡çš„å€¼åº”è¯¥å¤§äºŽæˆ–ç­‰äºŽ {{ limit }}.</target>
+            </trans-unit>
+            <trans-unit id="21">
+                <source>This value is too short. It should have {{ limit }} characters or more.</source>
+                <target>å­—ç¬¦ä¸²å¤ªçŸ­ï¼Œ é•¿åº¦ä¸å¯å°‘äºŽ {{ limit }} ä¸ªå­—ç¬¦.</target>
+            </trans-unit>
+            <trans-unit id="22">
+                <source>This value should not be blank.</source>
+                <target>è¯¥å˜é‡ä¸åº”ä¸ºç©º.</target>
+            </trans-unit>
+            <trans-unit id="23">
+                <source>This value should not be null.</source>
+                <target>è¯¥å˜é‡ä¸åº”ä¸º null.</target>
+            </trans-unit>
+            <trans-unit id="24">
+                <source>This value should be null.</source>
+                <target>è¯¥å˜é‡åº”ä¸ºç©º null.</target>
+            </trans-unit>
+            <trans-unit id="25">
+                <source>This value is not valid.</source>
+                <target>è¯¥å˜é‡å€¼æ— æ•ˆ.</target>
+            </trans-unit>
+            <trans-unit id="26">
+                <source>This value is not a valid time.</source>
+                <target>è¯¥å€¼ä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆæ—¶é—´.</target>
+            </trans-unit>
+            <trans-unit id="27">
+                <source>This value is not a valid URL.</source>
+                <target>è¯¥å€¼ä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆçš„ URL åœ°å€.</target>
+            </trans-unit>
+            <trans-unit id="31">
+                <source>The two values should be equal.</source>
+                <target>è¯¥ä¸¤ä¸ªå˜é‡çš„å€¼åº”è¯¥ç›¸åŒ.</target>
+            </trans-unit>
+            <trans-unit id="32">
+                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
+                <target>æ–‡ä»¶å¤ªå¤§ï¼Œ æ–‡ä»¶å¤§å°ä¸å¯ä»¥è¶…è¿‡ {{ limit }} {{ suffix }}.</target>
+            </trans-unit>
+            <trans-unit id="33">
+                <source>The file is too large.</source>
+                <target>æ–‡ä»¶å¤ªå¤§.</target>
+            </trans-unit>
+            <trans-unit id="34">
+                <source>The file could not be uploaded.</source>
+                <target>æ–‡ä»¶ä¸å¯è¢«ä¸Šä¼ .</target>
+            </trans-unit>
+            <trans-unit id="35">
+                <source>This value should be a valid number.</source>
+                <target>è¯¥å€¼åº”è¯¥ä¸ºæœ‰æ•ˆçš„æ•°å­—.</target>
+            </trans-unit>
+            <trans-unit id="36">
+                <source>This value is not a valid country.</source>
+                <target>è¯¥å€¼ä¸æ˜¯æœ‰æ•ˆçš„å›½å®¶å.</target>
+            </trans-unit>
+            <trans-unit id="37">
+                <source>This file is not a valid image.</source>
+                <target>è¯¥æ–‡ä»¶ä¸æ˜¯æœ‰æ•ˆçš„å›¾ç‰‡.</target>
+            </trans-unit>
+            <trans-unit id="38">
+                <source>This is not a valid IP address.</source>
+                <target>è¯¥å€¼ä¸æ˜¯æœ‰æ•ˆçš„IPåœ°å€.</target>
+            </trans-unit>
+            <trans-unit id="39">
+                <source>This value is not a valid language.</source>
+                <target>è¯¥å€¼ä¸æ˜¯æœ‰æ•ˆçš„è¯­è¨€å.</target>
+            </trans-unit>
+            <trans-unit id="40">
+                <source>This value is not a valid locale.</source>
+                <target>è¯¥å€¼ä¸æ˜¯æœ‰æ•ˆçš„åŒºåŸŸå€¼.</target>
+            </trans-unit>
+            <trans-unit id="41">
+                <source>This value is already used.</source>
+                <target>è¯¥å€¼å·²ç»è¢«ä½¿ç”¨äº†.</target>
+            </trans-unit>
+            <trans-unit id="42">
+                <source>The size of the image could not be detected.</source>
+                <target>ä¸èƒ½è§£æžå›¾ç‰‡å¤§å°.</target>
+            </trans-unit>
+            <trans-unit id="43">
+                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
+                <target>å›¾ç‰‡å¤ªå®½ ({{ width }}px)ï¼Œæœ€å¤§å®½åº¦ä¸º {{ max_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="44">
+                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
+                <target>å›¾ç‰‡å®½åº¦ä¸å¤Ÿ ({{ width }}px)ï¼Œæœ€å°å®½åº¦ä¸º {{ min_width }}px.</target>
+            </trans-unit>
+            <trans-unit id="45">
+                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
+                <target>å›¾ç‰‡å¤ªé«˜ ({{ height }}px)ï¼Œæœ€å¤§é«˜åº¦ä¸º {{ max_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="46">
+                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
+                <target>å›¾ç‰‡é«˜åº¦ä¸å¤Ÿ ({{ height }}px)ï¼Œæœ€å°é«˜åº¦ä¸º {{ min_height }}px.</target>
+            </trans-unit>
+            <trans-unit id="47">
+                <source>This value should be the user current password.</source>
+                <target>è¯¥å˜é‡åº”ä¸ºç”¨æˆ·å½“å‰çš„å¯†ç .</target>
+            </trans-unit>
+            <trans-unit id="48">
+                <source>This value should have exactly {{ limit }} characters.</source>
+                <target>è¯¥å˜é‡åº”ä¸º {{ limit }} ä¸ªå­—ç¬¦.</target>
+            </trans-unit>
+            <trans-unit id="49">
+                <source>The file was only partially uploaded.</source>
+                <target>è¯¥æ–‡ä»¶çš„ä¸Šä¼ ä¸å®Œæ•´.</target>
+            </trans-unit>
+            <trans-unit id="50">
+                <source>No file was uploaded.</source>
+                <target>æ²¡æœ‰ä¸Šä¼ ä»»ä½•æ–‡ä»¶.</target>
+            </trans-unit>
+            <trans-unit id="51">
+                <source>No temporary folder was configured in php.ini.</source>
+                <target>php.inié‡Œæ²¡æœ‰é…ç½®ä¸´æ—¶æ–‡ä»¶ç›®å½•.</target>
+            </trans-unit>
+            <trans-unit id="52">
+                <source>Cannot write temporary file to disk.</source>
+                <target>ä¸´æ—¶æ–‡ä»¶å†™å…¥ç£ç›˜å¤±è´¥.</target>
+            </trans-unit>
+            <trans-unit id="53">
+                <source>A PHP extension caused the upload to fail.</source>
+                <target>æŸä¸ªPHPæ‰©å±•é€ æˆä¸Šä¼ å¤±è´¥.</target>
+            </trans-unit>
+            <trans-unit id="54">
+                <source>This collection should contain {{ limit }} elements or more.</source>
+                <target>è¯¥é›†åˆæœ€å°‘åº”åŒ…å« {{ limit }} ä¸ªå…ƒç´ .</target>
+            </trans-unit>
+            <trans-unit id="55">
+                <source>This collection should contain {{ limit }} elements or less.</source>
+                <target>è¯¥é›†åˆæœ€å¤šåŒ…å« {{ limit }} ä¸ªå…ƒç´ .</target>
+            </trans-unit>
+            <trans-unit id="56">
+                <source>This collection should contain exactly {{ limit }} elements.</source>
+                <target>è¯¥é›†åˆåº”åŒ…å«æ­£å¥½ {{ limit }} ä¸ªå…ƒç´ element.</target>
+            </trans-unit>
+        </body>
+    </file>
+</xliff>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ConstraintTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ConstraintTest.php
new file mode 100644
index 0000000..007bb1e
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ConstraintTest.php
@@ -0,0 +1,131 @@
+<?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;
+
+use Symfony\Component\Validator\Tests\Fixtures\ClassConstraint;
+use Symfony\Component\Validator\Tests\Fixtures\ConstraintA;
+use Symfony\Component\Validator\Tests\Fixtures\ConstraintB;
+use Symfony\Component\Validator\Tests\Fixtures\ConstraintC;
+
+class ConstraintTest extends \PHPUnit_Framework_TestCase
+{
+    public function testSetProperties()
+    {
+        $constraint = new ConstraintA(array(
+            'property1' => 'foo',
+            'property2' => 'bar',
+        ));
+
+        $this->assertEquals('foo', $constraint->property1);
+        $this->assertEquals('bar', $constraint->property2);
+    }
+
+    public function testSetNotExistingPropertyThrowsException()
+    {
+        $this->setExpectedException('Symfony\Component\Validator\Exception\InvalidOptionsException');
+
+        new ConstraintA(array(
+            'foo' => 'bar',
+        ));
+    }
+
+    public function testMagicPropertiesAreNotAllowed()
+    {
+        $constraint = new ConstraintA();
+
+        $this->setExpectedException('Symfony\Component\Validator\Exception\InvalidOptionsException');
+
+        $constraint->foo = 'bar';
+    }
+
+    public function testInvalidAndRequiredOptionsPassed()
+    {
+        $this->setExpectedException('Symfony\Component\Validator\Exception\InvalidOptionsException');
+
+        new ConstraintC(array(
+            'option1' => 'default',
+            'foo' => 'bar'
+        ));
+    }
+
+    public function testSetDefaultProperty()
+    {
+        $constraint = new ConstraintA('foo');
+
+        $this->assertEquals('foo', $constraint->property2);
+    }
+
+    public function testSetDefaultPropertyDoctrineStyle()
+    {
+        $constraint = new ConstraintA(array('value' => 'foo'));
+
+        $this->assertEquals('foo', $constraint->property2);
+    }
+
+    public function testSetUndefinedDefaultProperty()
+    {
+        $this->setExpectedException('Symfony\Component\Validator\Exception\ConstraintDefinitionException');
+
+        new ConstraintB('foo');
+    }
+
+    public function testRequiredOptionsMustBeDefined()
+    {
+        $this->setExpectedException('Symfony\Component\Validator\Exception\MissingOptionsException');
+
+        new ConstraintC();
+    }
+
+    public function testRequiredOptionsPassed()
+    {
+        new ConstraintC(array('option1' => 'default'));
+    }
+
+    public function testGroupsAreConvertedToArray()
+    {
+        $constraint = new ConstraintA(array('groups' => 'Foo'));
+
+        $this->assertEquals(array('Foo'), $constraint->groups);
+    }
+
+    public function testAddDefaultGroupAddsGroup()
+    {
+        $constraint = new ConstraintA(array('groups' => 'Default'));
+        $constraint->addImplicitGroupName('Foo');
+        $this->assertEquals(array('Default', 'Foo'), $constraint->groups);
+    }
+
+    public function testAllowsSettingZeroRequiredPropertyValue()
+    {
+        $constraint = new ConstraintA(0);
+        $this->assertEquals(0, $constraint->property2);
+    }
+
+    public function testCanCreateConstraintWithNoDefaultOptionAndEmptyArray()
+    {
+        new ConstraintB(array());
+    }
+
+    public function testGetTargetsCanBeString()
+    {
+        $constraint = new ClassConstraint;
+
+        $this->assertEquals('class', $constraint->getTargets());
+    }
+
+    public function testGetTargetsCanBeArray()
+    {
+        $constraint = new ConstraintA;
+
+        $this->assertEquals(array('property', 'class'), $constraint->getTargets());
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ConstraintValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ConstraintValidatorTest.php
new file mode 100644
index 0000000..b9af1e9
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ConstraintValidatorTest.php
@@ -0,0 +1,60 @@
+<?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;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+
+class ConstraintValidatorTest_Validator extends ConstraintValidator
+{
+    private $message;
+    private $params;
+
+    public function __construct($message, array $params = array())
+    {
+        $this->message = $message;
+        $this->params = $params;
+    }
+
+    public function validate($value, Constraint $constraint)
+    {
+        $this->setMessage($this->message, $this->params);
+    }
+}
+
+class ConstraintValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    public function testSetMessage()
+    {
+        $context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $constraint = $this->getMock('Symfony\Component\Validator\Constraint', array(), array(), '', false);
+        $validator = new ConstraintValidatorTest_Validator('error message', array('foo' => 'bar'));
+        $validator->initialize($context);
+
+        $context->expects($this->once())
+            ->method('addViolation')
+            ->with('error message', array('foo' => 'bar'));
+
+        $validator->validate('bam', $constraint);
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\ValidatorException
+     */
+    public function testSetMessageFailsIfNoContextSet()
+    {
+        $constraint = $this->getMock('Symfony\Component\Validator\Constraint', array(), array(), '', false);
+        $validator = new ConstraintValidatorTest_Validator('error message', array('foo' => 'bar'));
+
+        $validator->validate('bam', $constraint);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ConstraintViolationListTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ConstraintViolationListTest.php
new file mode 100644
index 0000000..f0d3e22
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ConstraintViolationListTest.php
@@ -0,0 +1,134 @@
+<?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;
+
+use Symfony\Component\Validator\ConstraintViolation;
+use Symfony\Component\Validator\ConstraintViolationList;
+
+class ConstraintViolationListTest extends \PHPUnit_Framework_TestCase
+{
+    protected $list;
+
+    protected function setUp()
+    {
+        $this->list = new ConstraintViolationList();
+    }
+
+    protected function tearDown()
+    {
+        $this->list = null;
+    }
+
+    public function testInit()
+    {
+        $this->assertCount(0, $this->list);
+    }
+
+    public function testInitWithViolations()
+    {
+        $violation = $this->getViolation('Error');
+        $this->list = new ConstraintViolationList(array($violation));
+
+        $this->assertCount(1, $this->list);
+        $this->assertSame($violation, $this->list[0]);
+    }
+
+    public function testAdd()
+    {
+        $violation = $this->getViolation('Error');
+        $this->list->add($violation);
+
+        $this->assertCount(1, $this->list);
+        $this->assertSame($violation, $this->list[0]);
+    }
+
+    public function testAddAll()
+    {
+        $violations = array(
+            10 => $this->getViolation('Error 1'),
+            20 => $this->getViolation('Error 2'),
+            30 => $this->getViolation('Error 3'),
+        );
+        $otherList = new ConstraintViolationList($violations);
+        $this->list->addAll($otherList);
+
+        $this->assertCount(3, $this->list);
+
+        $this->assertSame($violations[10], $this->list[0]);
+        $this->assertSame($violations[20], $this->list[1]);
+        $this->assertSame($violations[30], $this->list[2]);
+    }
+
+    public function testIterator()
+    {
+        $violations = array(
+            10 => $this->getViolation('Error 1'),
+            20 => $this->getViolation('Error 2'),
+            30 => $this->getViolation('Error 3'),
+        );
+
+        $this->list = new ConstraintViolationList($violations);
+
+        // indices are reset upon adding -> array_values()
+        $this->assertSame(array_values($violations), iterator_to_array($this->list));
+    }
+
+    public function testArrayAccess()
+    {
+        $violation = $this->getViolation('Error');
+        $this->list[] = $violation;
+
+        $this->assertSame($violation, $this->list[0]);
+        $this->assertTrue(isset($this->list[0]));
+
+        unset($this->list[0]);
+
+        $this->assertFalse(isset($this->list[0]));
+
+        $this->list[10] = $violation;
+
+        $this->assertSame($violation, $this->list[10]);
+        $this->assertTrue(isset($this->list[10]));
+    }
+
+    public function testToString()
+    {
+        $this->list = new ConstraintViolationList(array(
+            $this->getViolation('Error 1', 'Root'),
+            $this->getViolation('Error 2', 'Root', 'foo.bar'),
+            $this->getViolation('Error 3', 'Root', '[baz]'),
+            $this->getViolation('Error 4', '', 'foo.bar'),
+            $this->getViolation('Error 5', '', '[baz]'),
+        ));
+
+        $expected = <<<EOF
+Root:
+    Error 1
+Root.foo.bar:
+    Error 2
+Root[baz]:
+    Error 3
+foo.bar:
+    Error 4
+[baz]:
+    Error 5
+
+EOF;
+
+        $this->assertEquals($expected, (string) $this->list);
+    }
+
+    protected function getViolation($message, $root = null, $propertyPath = null)
+    {
+        return new ConstraintViolation($message, array(), $root, $propertyPath, null);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ConstraintViolationTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ConstraintViolationTest.php
new file mode 100644
index 0000000..f4b3652
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ConstraintViolationTest.php
@@ -0,0 +1,35 @@
+<?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;
+
+use Symfony\Component\Validator\ConstraintViolation;
+
+class ConstraintViolationTest extends \PHPUnit_Framework_TestCase
+{
+    public function testToStringHandlesArrays()
+    {
+        $violation = new ConstraintViolation(
+            '{{ value }}',
+            array('{{ value }}' => array(1, 2, 3)),
+            'Root',
+            'property.path',
+            null
+        );
+
+        $expected = <<<EOF
+Root.property.path:
+    Array
+EOF;
+
+        $this->assertSame($expected, (string) $violation);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/AllTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/AllTest.php
new file mode 100644
index 0000000..85b1283
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/AllTest.php
@@ -0,0 +1,41 @@
+<?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\Allator\Tests\Constraints;
+
+use Symfony\Component\Validator\Constraints\All;
+use Symfony\Component\Validator\Constraints\Valid;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class AllTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\ConstraintDefinitionException
+     */
+    public function testRejectNonConstraints()
+    {
+        new All(array(
+            'foo',
+        ));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\ConstraintDefinitionException
+     */
+    public function testRejectValidConstraint()
+    {
+        new All(array(
+            new Valid(),
+        ));
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/AllValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/AllValidatorTest.php
new file mode 100644
index 0000000..f038128
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/AllValidatorTest.php
@@ -0,0 +1,121 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\ExecutionContext;
+use Symfony\Component\Validator\Constraints\Min;
+use Symfony\Component\Validator\Constraints\Max;
+use Symfony\Component\Validator\Constraints\All;
+use Symfony\Component\Validator\Constraints\AllValidator;
+
+class AllValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $walker;
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        $this->walker = $this->getMock('Symfony\Component\Validator\GraphWalker', array(), array(), '', false);
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new AllValidator();
+        $this->validator->initialize($this->context);
+
+        $this->context->expects($this->any())
+            ->method('getGraphWalker')
+            ->will($this->returnValue($this->walker));
+        $this->context->expects($this->any())
+            ->method('getGroup')
+            ->will($this->returnValue('MyGroup'));
+        $this->context->expects($this->any())
+            ->method('getPropertyPath')
+            ->will($this->returnValue('foo.bar'));
+    }
+
+    protected function tearDown()
+    {
+        $this->validator = null;
+        $this->walker = null;
+        $this->context = null;
+    }
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new All(new Min(4)));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\UnexpectedTypeException
+     */
+    public function testThrowsExceptionIfNotTraversable()
+    {
+        $this->validator->validate('foo.barbar', new All(new Min(4)));
+    }
+
+    /**
+     * @dataProvider getValidArguments
+     */
+    public function testWalkSingleConstraint($array)
+    {
+        $constraint = new Min(4);
+
+        $i = 0;
+
+        foreach ($array as $key => $value) {
+            $this->walker->expects($this->at($i++))
+                ->method('walkConstraint')
+                ->with($constraint, $value, 'MyGroup', 'foo.bar['.$key.']');
+        }
+
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate($array, new All($constraint));
+    }
+
+    /**
+     * @dataProvider getValidArguments
+     */
+    public function testWalkMultipleConstraints($array)
+    {
+        $constraint1 = new Min(4);
+        $constraint2 = new Max(6);
+
+        $constraints = array($constraint1, $constraint2);
+        $i = 0;
+
+        foreach ($array as $key => $value) {
+            $this->walker->expects($this->at($i++))
+                ->method('walkConstraint')
+                ->with($constraint1, $value, 'MyGroup', 'foo.bar['.$key.']');
+            $this->walker->expects($this->at($i++))
+                ->method('walkConstraint')
+                ->with($constraint2, $value, 'MyGroup', 'foo.bar['.$key.']');
+        }
+
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate($array, new All($constraints));
+    }
+
+    public function getValidArguments()
+    {
+        return array(
+            array(array(5, 6, 7)),
+            array(new \ArrayObject(array(5, 6, 7))),
+        );
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/BlankValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/BlankValidatorTest.php
new file mode 100644
index 0000000..0fbe5e6
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/BlankValidatorTest.php
@@ -0,0 +1,78 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\Blank;
+use Symfony\Component\Validator\Constraints\BlankValidator;
+
+class BlankValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new BlankValidator();
+        $this->validator->initialize($this->context);
+    }
+
+    protected function tearDown()
+    {
+        $this->context = null;
+        $this->validator = null;
+    }
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new Blank());
+    }
+
+    public function testBlankIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate('', new Blank());
+    }
+
+    /**
+     * @dataProvider getInvalidValues
+     */
+    public function testInvalidValues($value)
+    {
+        $constraint = new Blank(array(
+            'message' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => $value,
+            ));
+
+        $this->validator->validate($value, $constraint);
+    }
+
+    public function getInvalidValues()
+    {
+        return array(
+            array('foobar'),
+            array(0),
+            array(false),
+            array(1234),
+        );
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CallbackValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CallbackValidatorTest.php
new file mode 100644
index 0000000..bd56e15
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CallbackValidatorTest.php
@@ -0,0 +1,156 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\ExecutionContext;
+use Symfony\Component\Validator\Constraints\Callback;
+use Symfony\Component\Validator\Constraints\CallbackValidator;
+
+class CallbackValidatorTest_Class
+{
+    public static function validateStatic($object, ExecutionContext $context)
+    {
+        $context->addViolation('Static message', array('{{ value }}' => 'foobar'), 'invalidValue');
+
+        return false;
+    }
+}
+
+class CallbackValidatorTest_Object
+{
+    public function validateOne(ExecutionContext $context)
+    {
+        $context->addViolation('My message', array('{{ value }}' => 'foobar'), 'invalidValue');
+
+        return false;
+    }
+
+    public function validateTwo(ExecutionContext $context)
+    {
+        $context->addViolation('Other message', array('{{ value }}' => 'baz'), 'otherInvalidValue');
+
+        return false;
+    }
+}
+
+class CallbackValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new CallbackValidator();
+        $this->validator->initialize($this->context);
+    }
+
+    protected function tearDown()
+    {
+        $this->context = null;
+        $this->validator = null;
+    }
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new Callback(array('foo')));
+    }
+
+    public function testCallbackSingleMethod()
+    {
+        $object = new CallbackValidatorTest_Object();
+        $constraint = new Callback(array('validateOne'));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('My message', array(
+                '{{ value }}' => 'foobar',
+            ));
+
+        $this->validator->validate($object, $constraint);
+    }
+
+    public function testCallbackSingleStaticMethod()
+    {
+        $object = new CallbackValidatorTest_Object();
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('Static message', array(
+                '{{ value }}' => 'foobar',
+            ));
+
+        $this->validator->validate($object, new Callback(array(
+            array(__CLASS__.'_Class', 'validateStatic')
+        )));
+    }
+
+    public function testCallbackMultipleMethods()
+    {
+        $object = new CallbackValidatorTest_Object();
+
+        $this->context->expects($this->at(0))
+            ->method('addViolation')
+            ->with('My message', array(
+                '{{ value }}' => 'foobar',
+            ));
+        $this->context->expects($this->at(1))
+            ->method('addViolation')
+            ->with('Other message', array(
+                '{{ value }}' => 'baz',
+            ));
+
+        $this->validator->validate($object, new Callback(array(
+            'validateOne', 'validateTwo'
+        )));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\UnexpectedTypeException
+     */
+    public function testExpectCallbackArray()
+    {
+        $object = new CallbackValidatorTest_Object();
+
+        $this->validator->validate($object, new Callback('foobar'));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\ConstraintDefinitionException
+     */
+    public function testExpectValidMethods()
+    {
+        $object = new CallbackValidatorTest_Object();
+
+        $this->validator->validate($object, new Callback(array('foobar')));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\ConstraintDefinitionException
+     */
+    public function testExpectValidCallbacks()
+    {
+        $object = new CallbackValidatorTest_Object();
+
+        $this->validator->validate($object, new Callback(array(array('foo', 'bar'))));
+    }
+
+    public function testConstraintGetTargets()
+    {
+        $constraint = new Callback(array('foo'));
+
+        $this->assertEquals('class', $constraint->getTargets());
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CardSchemeValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CardSchemeValidatorTest.php
new file mode 100644
index 0000000..3fa3092
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CardSchemeValidatorTest.php
@@ -0,0 +1,81 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\CardScheme;
+use Symfony\Component\Validator\Constraints\CardSchemeValidator;
+
+class CardSchemeValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new CardSchemeValidator();
+        $this->validator->initialize($this->context);
+    }
+
+    protected function tearDown()
+    {
+        $this->context = null;
+        $this->validator = null;
+    }
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new CardScheme(array('schemes' => array())));
+    }
+
+    public function testEmptyStringIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate('', new CardScheme(array('schemes' => array())));
+    }
+
+    /**
+     * @dataProvider getValidNumbers
+     */
+    public function testValidNumbers($scheme, $number)
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate($number, new CardScheme(array('schemes' => array($scheme))));
+    }
+
+    public function getValidNumbers()
+    {
+        return array(
+            array('VISA', '42424242424242424242'),
+            array('AMEX', '378282246310005'),
+            array('AMEX', '371449635398431'),
+            array('AMEX', '378734493671000'),
+            array('DINERS', '30569309025904'),
+            array('DISCOVER', '6011111111111117'),
+            array('DISCOVER', '6011000990139424'),
+            array('JCB', '3530111333300000'),
+            array('JCB', '3566002020360505'),
+            array('MASTERCARD', '5555555555554444'),
+            array('MASTERCARD', '5105105105105100'),
+            array('VISA', '4111111111111111'),
+            array('VISA', '4012888888881881'),
+            array('VISA', '4222222222222'),
+        );
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/ChoiceValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/ChoiceValidatorTest.php
new file mode 100644
index 0000000..34221ff
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/ChoiceValidatorTest.php
@@ -0,0 +1,296 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\ExecutionContext;
+use Symfony\Component\Validator\Constraints\Choice;
+use Symfony\Component\Validator\Constraints\ChoiceValidator;
+
+function choice_callback()
+{
+    return array('foo', 'bar');
+}
+
+class ChoiceValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $context;
+    protected $validator;
+
+    public static function staticCallback()
+    {
+        return array('foo', 'bar');
+    }
+
+    protected function setUp()
+    {
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new ChoiceValidator();
+        $this->validator->initialize($this->context);
+
+        $this->context->expects($this->any())
+            ->method('getCurrentClass')
+            ->will($this->returnValue(__CLASS__));
+    }
+
+    protected function tearDown()
+    {
+        $this->context = null;
+        $this->validator = null;
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\UnexpectedTypeException
+     */
+    public function testExpectArrayIfMultipleIsTrue()
+    {
+        $constraint = new Choice(array(
+            'choices' => array('foo', 'bar'),
+            'multiple' => true,
+        ));
+
+        $this->validator->validate('asdf', $constraint);
+    }
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new Choice(array('choices' => array('foo', 'bar'))));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\ConstraintDefinitionException
+     */
+    public function testChoicesOrCallbackExpected()
+    {
+        $this->validator->validate('foobar', new Choice());
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\ConstraintDefinitionException
+     */
+    public function testValidCallbackExpected()
+    {
+        $this->validator->validate('foobar', new Choice(array('callback' => 'abcd')));
+    }
+
+    public function testValidChoiceArray()
+    {
+        $constraint = new Choice(array('choices' => array('foo', 'bar')));
+
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate('bar', $constraint);
+    }
+
+    public function testValidChoiceCallbackFunction()
+    {
+        $constraint = new Choice(array('callback' => __NAMESPACE__.'\choice_callback'));
+
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate('bar', $constraint);
+    }
+
+    public function testValidChoiceCallbackClosure()
+    {
+        $constraint = new Choice(array('callback' => function() {
+            return array('foo', 'bar');
+        }));
+
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate('bar', $constraint);
+    }
+
+    public function testValidChoiceCallbackStaticMethod()
+    {
+        $constraint = new Choice(array('callback' => array(__CLASS__, 'staticCallback')));
+
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate('bar', $constraint);
+    }
+
+    public function testValidChoiceCallbackContextMethod()
+    {
+        $constraint = new Choice(array('callback' => 'staticCallback'));
+
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate('bar', $constraint);
+    }
+
+    public function testMultipleChoices()
+    {
+        $constraint = new Choice(array(
+            'choices' => array('foo', 'bar', 'baz'),
+            'multiple' => true,
+        ));
+
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(array('baz', 'bar'), $constraint);
+    }
+
+    public function testInvalidChoice()
+    {
+        $constraint = new Choice(array(
+            'choices' => array('foo', 'bar'),
+            'message' => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => 'baz',
+            ), null, null);
+
+        $this->validator->validate('baz', $constraint);
+    }
+
+    public function testInvalidChoiceMultiple()
+    {
+        $constraint = new Choice(array(
+            'choices' => array('foo', 'bar'),
+            'multipleMessage' => 'myMessage',
+            'multiple' => true,
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => 'baz',
+            ));
+
+        $this->validator->validate(array('foo', 'baz'), $constraint);
+    }
+
+    public function testTooFewChoices()
+    {
+        $constraint = new Choice(array(
+            'choices' => array('foo', 'bar', 'moo', 'maa'),
+            'multiple' => true,
+            'min' => 2,
+            'minMessage' => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ limit }}' => 2,
+            ), null, 2);
+
+        $this->validator->validate(array('foo'), $constraint);
+    }
+
+    public function testTooManyChoices()
+    {
+        $constraint = new Choice(array(
+            'choices' => array('foo', 'bar', 'moo', 'maa'),
+            'multiple' => true,
+            'max' => 2,
+            'maxMessage' => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ limit }}' => 2,
+            ), null, 2);
+
+        $this->validator->validate(array('foo', 'bar', 'moo'), $constraint);
+    }
+
+    public function testNonStrict()
+    {
+        $constraint = new Choice(array(
+            'choices' => array(1, 2),
+            'strict' => false,
+        ));
+
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate('2', $constraint);
+        $this->validator->validate(2, $constraint);
+    }
+
+    public function testStrictAllowsExactValue()
+    {
+        $constraint = new Choice(array(
+            'choices' => array(1, 2),
+            'strict' => true,
+        ));
+
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(2, $constraint);
+    }
+
+    public function testStrictDisallowsDifferentType()
+    {
+        $constraint = new Choice(array(
+            'choices' => array(1, 2),
+            'strict' => true,
+            'message' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => '2',
+            ));
+
+        $this->validator->validate('2', $constraint);
+    }
+
+    public function testNonStrictWithMultipleChoices()
+    {
+        $constraint = new Choice(array(
+            'choices' => array(1, 2, 3),
+            'multiple' => true,
+            'strict' => false
+        ));
+
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(array('2', 3), $constraint);
+    }
+
+    public function testStrictWithMultipleChoices()
+    {
+        $constraint = new Choice(array(
+            'choices' => array(1, 2, 3),
+            'multiple' => true,
+            'strict' => true,
+            'multipleMessage' => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => '3',
+            ));
+
+        $this->validator->validate(array(2, '3'), $constraint);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CollectionTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CollectionTest.php
new file mode 100644
index 0000000..184d254
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CollectionTest.php
@@ -0,0 +1,73 @@
+<?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\Collectionator\Tests\Constraints;
+
+use Symfony\Component\Validator\Constraints\Collection;
+use Symfony\Component\Validator\Constraints\Collection\Required;
+use Symfony\Component\Validator\Constraints\Collection\Optional;
+use Symfony\Component\Validator\Constraints\Valid;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class CollectionTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\ConstraintDefinitionException
+     */
+    public function testRejectInvalidFieldsOption()
+    {
+        new Collection(array(
+            'fields' => 'foo',
+        ));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\ConstraintDefinitionException
+     */
+    public function testRejectNonConstraints()
+    {
+        new Collection(array(
+            'foo' => 'bar',
+        ));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\ConstraintDefinitionException
+     */
+    public function testRejectValidConstraint()
+    {
+        new Collection(array(
+            'foo' => new Valid(),
+        ));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\ConstraintDefinitionException
+     */
+    public function testRejectValidConstraintWithinOptional()
+    {
+        new Collection(array(
+            'foo' => new Optional(new Valid()),
+        ));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\ConstraintDefinitionException
+     */
+    public function testRejectValidConstraintWithinRequired()
+    {
+        new Collection(array(
+            'foo' => new Required(new Valid()),
+        ));
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CollectionValidatorArrayObjectTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CollectionValidatorArrayObjectTest.php
new file mode 100644
index 0000000..a3c4b33
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CollectionValidatorArrayObjectTest.php
@@ -0,0 +1,20 @@
+<?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\Constraints;
+
+class CollectionValidatorArrayObjectTest extends CollectionValidatorTest
+{
+    public function prepareTestData(array $contents)
+    {
+        return new \ArrayObject($contents);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CollectionValidatorArrayTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CollectionValidatorArrayTest.php
new file mode 100644
index 0000000..7517d0c
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CollectionValidatorArrayTest.php
@@ -0,0 +1,20 @@
+<?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\Constraints;
+
+class CollectionValidatorArrayTest extends CollectionValidatorTest
+{
+    public function prepareTestData(array $contents)
+    {
+        return $contents;
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CollectionValidatorCustomArrayObjectTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CollectionValidatorCustomArrayObjectTest.php
new file mode 100644
index 0000000..ebad849
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CollectionValidatorCustomArrayObjectTest.php
@@ -0,0 +1,78 @@
+<?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\Constraints;
+
+/**
+ * This class is a hand written simplified version of PHP native `ArrayObject`
+ * class, to show that it behaves differently than the PHP native implementation.
+ */
+class CustomArrayObject implements \ArrayAccess, \IteratorAggregate, \Countable, \Serializable
+{
+    private $array;
+
+    public function __construct(array $array = null)
+    {
+        $this->array = $array ?: array();
+    }
+
+    public function offsetExists($offset)
+    {
+        return array_key_exists($offset, $this->array);
+    }
+
+    public function offsetGet($offset)
+    {
+        return $this->array[$offset];
+    }
+
+    public function offsetSet($offset, $value)
+    {
+        if (null === $offset) {
+            $this->array[] = $value;
+        } else {
+            $this->array[$offset] = $value;
+        }
+    }
+
+    public function offsetUnset($offset)
+    {
+        unset($this->array[$offset]);
+    }
+
+    public function getIterator()
+    {
+        return new \ArrayIterator($this->array);
+    }
+
+    public function count()
+    {
+        return count($this->array);
+    }
+
+    public function serialize()
+    {
+        return serialize($this->array);
+    }
+
+    public function unserialize($serialized)
+    {
+        $this->array = (array) unserialize((string) $serialized);
+    }
+}
+
+class CollectionValidatorCustomArrayObjectTest extends CollectionValidatorTest
+{
+    public function prepareTestData(array $contents)
+    {
+        return new CustomArrayObject($contents);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CollectionValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CollectionValidatorTest.php
new file mode 100644
index 0000000..ef1c7c9
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CollectionValidatorTest.php
@@ -0,0 +1,419 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\ExecutionContext;
+use Symfony\Component\Validator\Constraints\Min;
+use Symfony\Component\Validator\Constraints\NotNull;
+use Symfony\Component\Validator\Constraints\Collection\Required;
+use Symfony\Component\Validator\Constraints\Collection\Optional;
+use Symfony\Component\Validator\Constraints\Collection;
+use Symfony\Component\Validator\Constraints\CollectionValidator;
+
+abstract class CollectionValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $walker;
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        $this->walker = $this->getMock('Symfony\Component\Validator\GraphWalker', array(), array(), '', false);
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new CollectionValidator();
+        $this->validator->initialize($this->context);
+
+        $this->context->expects($this->any())
+            ->method('getGraphWalker')
+            ->will($this->returnValue($this->walker));
+        $this->context->expects($this->any())
+            ->method('getGroup')
+            ->will($this->returnValue('MyGroup'));
+        $this->context->expects($this->any())
+            ->method('getPropertyPath')
+            ->will($this->returnValue('foo.bar'));
+    }
+
+    protected function tearDown()
+    {
+        $this->walker = null;
+        $this->context = null;
+        $this->validator = null;
+    }
+
+    abstract protected function prepareTestData(array $contents);
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolationAtSubPath');
+
+        $this->validator->validate(null, new Collection(array('fields' => array(
+            'foo' => new Min(4),
+        ))));
+    }
+
+    public function testFieldsAsDefaultOption()
+    {
+        $data = $this->prepareTestData(array('foo' => 'foobar'));
+
+        $this->context->expects($this->never())
+            ->method('addViolationAtSubPath');
+
+        $this->validator->validate($data, new Collection(array(
+            'foo' => new Min(4),
+        )));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\UnexpectedTypeException
+     */
+    public function testThrowsExceptionIfNotTraversable()
+    {
+        $this->validator->validate('foobar', new Collection(array('fields' => array(
+            'foo' => new Min(4),
+        ))));
+    }
+
+    public function testWalkSingleConstraint()
+    {
+        $constraint = new Min(4);
+
+        $array = array(
+            'foo' => 3,
+            'bar' => 5,
+        );
+        $i = 0;
+
+        foreach ($array as $key => $value) {
+            $this->walker->expects($this->at($i++))
+                ->method('walkConstraint')
+                ->with($constraint, $value, 'MyGroup', 'foo.bar['.$key.']');
+        }
+
+        $data = $this->prepareTestData($array);
+
+        $this->context->expects($this->never())
+            ->method('addViolationAtSubPath');
+
+        $this->validator->validate($data, new Collection(array(
+            'fields' => array(
+                'foo' => $constraint,
+                'bar' => $constraint,
+            ),
+        )));
+    }
+
+    public function testWalkMultipleConstraints()
+    {
+        $constraints = array(
+            new Min(4),
+            new NotNull(),
+        );
+
+        $array = array(
+            'foo' => 3,
+            'bar' => 5,
+        );
+        $i = 0;
+
+        foreach ($array as $key => $value) {
+            foreach ($constraints as $constraint) {
+                $this->walker->expects($this->at($i++))
+                    ->method('walkConstraint')
+                    ->with($constraint, $value, 'MyGroup', 'foo.bar['.$key.']');
+            }
+        }
+
+        $data = $this->prepareTestData($array);
+
+        $this->context->expects($this->never())
+            ->method('addViolationAtSubPath');
+
+        $this->validator->validate($data, new Collection(array(
+            'fields' => array(
+                'foo' => $constraints,
+                'bar' => $constraints,
+            )
+        )));
+    }
+
+    public function testExtraFieldsDisallowed()
+    {
+        $data = $this->prepareTestData(array(
+            'foo' => 5,
+            'baz' => 6,
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolationAtSubPath')
+            ->with('[baz]', 'myMessage', array(
+                '{{ field }}' => 'baz'
+            ));
+
+        $this->validator->validate($data, new Collection(array(
+            'fields' => array(
+                'foo' => new Min(4),
+            ),
+            'extraFieldsMessage' => 'myMessage',
+        )));
+    }
+
+    // bug fix
+    public function testNullNotConsideredExtraField()
+    {
+        $data = $this->prepareTestData(array(
+            'foo' => null,
+        ));
+
+        $constraint = new Collection(array(
+            'fields' => array(
+                'foo' => new Min(4),
+            ),
+        ));
+
+        $this->context->expects($this->never())
+            ->method('addViolationAtSubPath');
+
+        $this->validator->validate($data, $constraint);
+    }
+
+    public function testExtraFieldsAllowed()
+    {
+        $data = $this->prepareTestData(array(
+            'foo' => 5,
+            'bar' => 6,
+        ));
+
+        $constraint = new Collection(array(
+            'fields' => array(
+                'foo' => new Min(4),
+            ),
+            'allowExtraFields' => true,
+        ));
+
+        $this->context->expects($this->never())
+            ->method('addViolationAtSubPath');
+
+        $this->validator->validate($data, $constraint);
+    }
+
+    public function testMissingFieldsDisallowed()
+    {
+        $data = $this->prepareTestData(array());
+
+        $constraint = new Collection(array(
+            'fields' => array(
+                'foo' => new Min(4),
+            ),
+            'missingFieldsMessage' => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolationAtSubPath')
+            ->with('[foo]', 'myMessage', array(
+                '{{ field }}' => 'foo',
+            ));
+
+        $this->validator->validate($data, $constraint);
+    }
+
+    public function testMissingFieldsAllowed()
+    {
+        $data = $this->prepareTestData(array());
+
+        $constraint = new Collection(array(
+            'fields' => array(
+                'foo' => new Min(4),
+            ),
+            'allowMissingFields' => true,
+        ));
+
+        $this->context->expects($this->never())
+            ->method('addViolationAtSubPath');
+
+        $this->validator->validate($data, $constraint);
+    }
+
+    public function testOptionalFieldPresent()
+    {
+        $data = $this->prepareTestData(array(
+            'foo' => null,
+        ));
+
+        $this->context->expects($this->never())
+            ->method('addViolationAtSubPath');
+
+        $this->validator->validate($data, new Collection(array(
+            'foo' => new Optional(),
+        )));
+    }
+
+    public function testOptionalFieldNotPresent()
+    {
+        $data = $this->prepareTestData(array());
+
+        $this->context->expects($this->never())
+            ->method('addViolationAtSubPath');
+
+        $this->validator->validate($data, new Collection(array(
+            'foo' => new Optional(),
+        )));
+    }
+
+    public function testOptionalFieldSingleConstraint()
+    {
+        $array = array(
+            'foo' => 5,
+        );
+
+        $constraint = new Min(4);
+
+        $this->walker->expects($this->once())
+            ->method('walkConstraint')
+            ->with($constraint, $array['foo'], 'MyGroup', 'foo.bar[foo]');
+
+        $this->context->expects($this->never())
+            ->method('addViolationAtSubPath');
+
+        $data = $this->prepareTestData($array);
+
+        $this->validator->validate($data, new Collection(array(
+            'foo' => new Optional($constraint),
+        )));
+    }
+
+    public function testOptionalFieldMultipleConstraints()
+    {
+        $array = array(
+            'foo' => 5,
+        );
+
+        $constraints = array(
+            new NotNull(),
+            new Min(4),
+        );
+
+        foreach ($constraints as $i => $constraint) {
+            $this->walker->expects($this->at($i))
+                ->method('walkConstraint')
+                ->with($constraint, $array['foo'], 'MyGroup', 'foo.bar[foo]');
+        }
+
+        $this->context->expects($this->never())
+            ->method('addViolationAtSubPath');
+
+        $data = $this->prepareTestData($array);
+
+        $this->validator->validate($data, new Collection(array(
+            'foo' => new Optional($constraints),
+        )));
+    }
+
+    public function testRequiredFieldPresent()
+    {
+        $data = $this->prepareTestData(array(
+            'foo' => null,
+        ));
+
+        $this->context->expects($this->never())
+            ->method('addViolationAtSubPath');
+
+        $this->validator->validate($data, new Collection(array(
+            'foo' => new Required(),
+        )));
+    }
+
+    public function testRequiredFieldNotPresent()
+    {
+        $data = $this->prepareTestData(array());
+
+        $this->context->expects($this->once())
+            ->method('addViolationAtSubPath')
+            ->with('[foo]', 'myMessage', array(
+                '{{ field }}' => 'foo',
+            ));
+
+        $this->validator->validate($data, new Collection(array(
+            'fields' => array(
+                 'foo' => new Required(),
+             ),
+            'missingFieldsMessage' => 'myMessage',
+        )));
+    }
+
+    public function testRequiredFieldSingleConstraint()
+    {
+        $array = array(
+            'foo' => 5,
+        );
+
+        $constraint = new Min(4);
+
+        $this->walker->expects($this->once())
+            ->method('walkConstraint')
+            ->with($constraint, $array['foo'], 'MyGroup', 'foo.bar[foo]');
+
+        $this->context->expects($this->never())
+            ->method('addViolationAtSubPath');
+
+        $data = $this->prepareTestData($array);
+
+        $this->validator->validate($data, new Collection(array(
+            'foo' => new Required($constraint),
+        )));
+    }
+
+    public function testRequiredFieldMultipleConstraints()
+    {
+        $array = array(
+            'foo' => 5,
+        );
+
+        $constraints = array(
+            new NotNull(),
+            new Min(4),
+        );
+
+        foreach ($constraints as $i => $constraint) {
+            $this->walker->expects($this->at($i))
+                ->method('walkConstraint')
+                ->with($constraint, $array['foo'], 'MyGroup', 'foo.bar[foo]');
+        }
+
+        $this->context->expects($this->never())
+            ->method('addViolationAtSubPath');
+
+        $data = $this->prepareTestData($array);
+
+        $this->validator->validate($array, new Collection(array(
+            'foo' => new Required($constraints),
+        )));
+    }
+
+    public function testObjectShouldBeLeftUnchanged()
+    {
+        $value = new \ArrayObject(array(
+            'foo' => 3
+        ));
+
+        $this->validator->validate($value, new Collection(array(
+            'fields' => array(
+                'foo' => new Min(2),
+            )
+        )));
+
+        $this->assertEquals(array(
+            'foo' => 3
+        ), (array) $value);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CountValidatorArrayTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CountValidatorArrayTest.php
new file mode 100644
index 0000000..5f562e7
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CountValidatorArrayTest.php
@@ -0,0 +1,23 @@
+<?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\Constraints;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class CountValidatorArrayTest extends CountValidatorTest
+{
+    protected function createCollection(array $content)
+    {
+        return $content;
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CountValidatorCountableTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CountValidatorCountableTest.php
new file mode 100644
index 0000000..ec4d8de
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CountValidatorCountableTest.php
@@ -0,0 +1,38 @@
+<?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\Constraints;
+
+class CountValidatorCountableTest_Countable implements \Countable
+{
+    private $content;
+
+    public function __construct(array $content)
+    {
+        $this->content = $content;
+    }
+
+    public function count()
+    {
+        return count($this->content);
+    }
+}
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class CountValidatorCountableTest extends CountValidatorTest
+{
+    protected function createCollection(array $content)
+    {
+        return new CountValidatorCountableTest_Countable($content);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CountValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CountValidatorTest.php
new file mode 100644
index 0000000..c7d29c6
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CountValidatorTest.php
@@ -0,0 +1,195 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\Count;
+use Symfony\Component\Validator\Constraints\CountValidator;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+abstract class CountValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new CountValidator();
+        $this->validator->initialize($this->context);
+    }
+
+    protected function tearDown()
+    {
+        $this->context = null;
+        $this->validator = null;
+    }
+
+    abstract protected function createCollection(array $content);
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new Count(6));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\UnexpectedTypeException
+     */
+    public function testExpectsCountableType()
+    {
+        $this->validator->validate(new \stdClass(), new Count(5));
+    }
+
+    public function getThreeOrLessElements()
+    {
+        return array(
+            array($this->createCollection(array(1))),
+            array($this->createCollection(array(1, 2))),
+            array($this->createCollection(array(1, 2, 3))),
+            array($this->createCollection(array('a' => 1, 'b' => 2, 'c' => 3))),
+        );
+    }
+
+    public function getFourElements()
+    {
+        return array(
+            array($this->createCollection(array(1, 2, 3, 4))),
+            array($this->createCollection(array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4))),
+        );
+    }
+
+    public function getNotFourElements()
+    {
+        return array_merge(
+            $this->getThreeOrLessElements(),
+            $this->getFiveOrMoreElements()
+        );
+    }
+
+    public function getFiveOrMoreElements()
+    {
+        return array(
+            array($this->createCollection(array(1, 2, 3, 4, 5))),
+            array($this->createCollection(array(1, 2, 3, 4, 5, 6))),
+            array($this->createCollection(array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5))),
+        );
+    }
+
+    /**
+     * @dataProvider getThreeOrLessElements
+     */
+    public function testValidValuesMax($value)
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $constraint = new Count(array('max' => 3));
+        $this->validator->validate($value, $constraint);
+    }
+
+    /**
+     * @dataProvider getFiveOrMoreElements
+     */
+    public function testValidValuesMin($value)
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $constraint = new Count(array('min' => 5));
+        $this->validator->validate($value, $constraint);
+    }
+
+    /**
+     * @dataProvider getFourElements
+     */
+    public function testValidValuesExact($value)
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $constraint = new Count(4);
+        $this->validator->validate($value, $constraint);
+    }
+
+    /**
+     * @dataProvider getFiveOrMoreElements
+     */
+    public function testInvalidValuesMax($value)
+    {
+        $constraint = new Count(array(
+            'max' => 4,
+            'maxMessage' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', $this->identicalTo(array(
+                '{{ count }}' => count($value),
+                '{{ limit }}' => 4,
+            )), $value, 4);
+
+        $this->validator->validate($value, $constraint);
+    }
+
+    /**
+     * @dataProvider getThreeOrLessElements
+     */
+    public function testInvalidValuesMin($value)
+    {
+        $constraint = new Count(array(
+            'min' => 4,
+            'minMessage' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', $this->identicalTo(array(
+                '{{ count }}' => count($value),
+                '{{ limit }}' => 4,
+            )), $value, 4);
+
+        $this->validator->validate($value, $constraint);
+    }
+
+    /**
+     * @dataProvider getNotFourElements
+     */
+    public function testInvalidValuesExact($value)
+    {
+        $constraint = new Count(array(
+            'min' => 4,
+            'max' => 4,
+            'exactMessage' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', $this->identicalTo(array(
+            '{{ count }}' => count($value),
+            '{{ limit }}' => 4,
+        )), $value, 4);
+
+        $this->validator->validate($value, $constraint);
+    }
+
+    public function testDefaultOption()
+    {
+        $constraint = new Count(5);
+
+        $this->assertEquals(5, $constraint->min);
+        $this->assertEquals(5, $constraint->max);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CountryValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CountryValidatorTest.php
new file mode 100644
index 0000000..744f124
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/CountryValidatorTest.php
@@ -0,0 +1,114 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\Country;
+use Symfony\Component\Validator\Constraints\CountryValidator;
+
+class CountryValidatorTest extends LocalizedTestCase
+{
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        parent::setUp();
+
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new CountryValidator();
+        $this->validator->initialize($this->context);
+    }
+
+    protected function tearDown()
+    {
+        $this->context = null;
+        $this->validator = null;
+    }
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new Country());
+    }
+
+    public function testEmptyStringIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate('', new Country());
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\UnexpectedTypeException
+     */
+    public function testExpectsStringCompatibleType()
+    {
+        $this->validator->validate(new \stdClass(), new Country());
+    }
+
+    /**
+     * @dataProvider getValidCountries
+     */
+    public function testValidCountries($country)
+    {
+        if (!class_exists('Symfony\Component\Locale\Locale')) {
+            $this->markTestSkipped('The "Locale" component is not available');
+        }
+
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate($country, new Country());
+    }
+
+    public function getValidCountries()
+    {
+        return array(
+            array('GB'),
+            array('AT'),
+            array('MY'),
+        );
+    }
+
+    /**
+     * @dataProvider getInvalidCountries
+     */
+    public function testInvalidCountries($country)
+    {
+        if (!class_exists('Symfony\Component\Locale\Locale')) {
+            $this->markTestSkipped('The "Locale" component is not available');
+        }
+
+        $constraint = new Country(array(
+            'message' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => $country,
+            ));
+
+        $this->validator->validate($country, $constraint);
+    }
+
+    public function getInvalidCountries()
+    {
+        return array(
+            array('foobar'),
+            array('EN'),
+        );
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/DateTimeValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/DateTimeValidatorTest.php
new file mode 100644
index 0000000..3263d68
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/DateTimeValidatorTest.php
@@ -0,0 +1,120 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\DateTime;
+use Symfony\Component\Validator\Constraints\DateTimeValidator;
+
+class DateTimeValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new DateTimeValidator();
+        $this->validator->initialize($this->context);
+    }
+
+    protected function tearDown()
+    {
+        $this->context = null;
+        $this->validator = null;
+    }
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new DateTime());
+    }
+
+    public function testEmptyStringIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate('', new DateTime());
+    }
+
+    public function testDateTimeClassIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(new \DateTime(), new DateTime());
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\UnexpectedTypeException
+     */
+    public function testExpectsStringCompatibleType()
+    {
+        $this->validator->validate(new \stdClass(), new DateTime());
+    }
+
+    /**
+     * @dataProvider getValidDateTimes
+     */
+    public function testValidDateTimes($dateTime)
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate($dateTime, new DateTime());
+    }
+
+    public function getValidDateTimes()
+    {
+        return array(
+            array('2010-01-01 01:02:03'),
+            array('1955-12-12 00:00:00'),
+            array('2030-05-31 23:59:59'),
+        );
+    }
+
+    /**
+     * @dataProvider getInvalidDateTimes
+     */
+    public function testInvalidDateTimes($dateTime)
+    {
+        $constraint = new DateTime(array(
+            'message' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => $dateTime,
+            ));
+
+        $this->validator->validate($dateTime, $constraint);
+    }
+
+    public function getInvalidDateTimes()
+    {
+        return array(
+            array('foobar'),
+            array('2010-01-01'),
+            array('00:00:00'),
+            array('2010-01-01 00:00'),
+            array('2010-13-01 00:00:00'),
+            array('2010-04-32 00:00:00'),
+            array('2010-02-29 00:00:00'),
+            array('2010-01-01 24:00:00'),
+            array('2010-01-01 00:60:00'),
+            array('2010-01-01 00:00:60'),
+        );
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/DateValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/DateValidatorTest.php
new file mode 100644
index 0000000..007232c
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/DateValidatorTest.php
@@ -0,0 +1,116 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\Date;
+use Symfony\Component\Validator\Constraints\DateValidator;
+
+class DateValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new DateValidator();
+        $this->validator->initialize($this->context);
+    }
+
+    protected function tearDown()
+    {
+        $this->context = null;
+        $this->validator = null;
+    }
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new Date());
+    }
+
+    public function testEmptyStringIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate('', new Date());
+    }
+
+    public function testDateTimeClassIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(new \DateTime(), new Date());
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\UnexpectedTypeException
+     */
+    public function testExpectsStringCompatibleType()
+    {
+        $this->validator->validate(new \stdClass(), new Date());
+    }
+
+    /**
+     * @dataProvider getValidDates
+     */
+    public function testValidDates($date)
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate($date, new Date());
+    }
+
+    public function getValidDates()
+    {
+        return array(
+            array('2010-01-01'),
+            array('1955-12-12'),
+            array('2030-05-31'),
+        );
+    }
+
+    /**
+     * @dataProvider getInvalidDates
+     */
+    public function testInvalidDates($date)
+    {
+        $constraint = new Date(array(
+            'message' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => $date,
+            ));
+
+        $this->validator->validate($date, $constraint);
+    }
+
+    public function getInvalidDates()
+    {
+        return array(
+            array('foobar'),
+            array('foobar 2010-13-01'),
+            array('2010-13-01 foobar'),
+            array('2010-13-01'),
+            array('2010-04-32'),
+            array('2010-02-29'),
+        );
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/EmailValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/EmailValidatorTest.php
new file mode 100644
index 0000000..f95c089
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/EmailValidatorTest.php
@@ -0,0 +1,106 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\Email;
+use Symfony\Component\Validator\Constraints\EmailValidator;
+
+class EmailValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new EmailValidator();
+        $this->validator->initialize($this->context);
+    }
+
+    protected function tearDown()
+    {
+        $this->context = null;
+        $this->validator = null;
+    }
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new Email());
+    }
+
+    public function testEmptyStringIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate('', new Email());
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\UnexpectedTypeException
+     */
+    public function testExpectsStringCompatibleType()
+    {
+        $this->validator->validate(new \stdClass(), new Email());
+    }
+
+    /**
+     * @dataProvider getValidEmails
+     */
+    public function testValidEmails($email)
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate($email, new Email());
+    }
+
+    public function getValidEmails()
+    {
+        return array(
+            array('fabien@symfony.com'),
+            array('example@example.co.uk'),
+            array('fabien_potencier@example.fr'),
+        );
+    }
+
+    /**
+     * @dataProvider getInvalidEmails
+     */
+    public function testInvalidEmails($email)
+    {
+        $constraint = new Email(array(
+            'message' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => $email,
+            ));
+
+        $this->validator->validate($email, $constraint);
+    }
+
+    public function getInvalidEmails()
+    {
+        return array(
+            array('example'),
+            array('example@'),
+            array('example@localhost'),
+            array('example@example.com@example.com'),
+        );
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/FalseValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/FalseValidatorTest.php
new file mode 100644
index 0000000..1bc16c2
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/FalseValidatorTest.php
@@ -0,0 +1,63 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\False;
+use Symfony\Component\Validator\Constraints\FalseValidator;
+
+class FalseValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new FalseValidator();
+        $this->validator->initialize($this->context);
+    }
+
+    protected function tearDown()
+    {
+        $this->context = null;
+        $this->validator = null;
+    }
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new False());
+    }
+
+    public function testFalseIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(false, new False());
+    }
+
+    public function testTrueIsInvalid()
+    {
+        $constraint = new False(array(
+            'message' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array());
+
+        $this->validator->validate(true, $constraint);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/FileValidatorObjectTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/FileValidatorObjectTest.php
new file mode 100644
index 0000000..f35f93b
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/FileValidatorObjectTest.php
@@ -0,0 +1,22 @@
+<?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\Constraints;
+
+use Symfony\Component\HttpFoundation\File\File;
+
+class FileValidatorObjectTest extends FileValidatorTest
+{
+    protected function getFile($filename)
+    {
+        return new File($filename);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/FileValidatorPathTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/FileValidatorPathTest.php
new file mode 100644
index 0000000..c4b93cd
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/FileValidatorPathTest.php
@@ -0,0 +1,37 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\File;
+
+class FileValidatorPathTest extends FileValidatorTest
+{
+    protected function getFile($filename)
+    {
+        return $filename;
+    }
+
+    public function testFileNotFound()
+    {
+        $constraint = new File(array(
+            'notFoundMessage' => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ file }}' => 'foobar',
+            ));
+
+        $this->validator->validate('foobar', $constraint);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/FileValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/FileValidatorTest.php
new file mode 100644
index 0000000..67a38f1
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/FileValidatorTest.php
@@ -0,0 +1,329 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\File;
+use Symfony\Component\Validator\Constraints\FileValidator;
+use Symfony\Component\HttpFoundation\File\UploadedFile;
+
+abstract class FileValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $context;
+    protected $validator;
+    protected $path;
+    protected $file;
+
+    protected function setUp()
+    {
+        if (!class_exists('Symfony\Component\HttpFoundation\File\UploadedFile')) {
+            $this->markTestSkipped('The "HttpFoundation" component is not available');
+        }
+
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new FileValidator();
+        $this->validator->initialize($this->context);
+        $this->path = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'FileValidatorTest';
+        $this->file = fopen($this->path, 'w');
+    }
+
+    protected function tearDown()
+    {
+        fclose($this->file);
+
+        $this->context = null;
+        $this->validator = null;
+        $this->path = null;
+        $this->file = null;
+    }
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new File());
+    }
+
+    public function testEmptyStringIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate('', new File());
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\UnexpectedTypeException
+     */
+    public function testExpectsStringCompatibleTypeOrFile()
+    {
+        $this->validator->validate(new \stdClass(), new File());
+    }
+
+    public function testValidFile()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate($this->path, new File());
+    }
+
+    public function testValidUploadedfile()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $file = new UploadedFile($this->path, 'originalName');
+        $this->validator->validate($file, new File());
+    }
+
+    public function testTooLargeBytes()
+    {
+        fwrite($this->file, str_repeat('0', 11));
+
+        $constraint = new File(array(
+            'maxSize'           => 10,
+            'maxSizeMessage'    => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ limit }}'   => '10',
+                '{{ size }}'    => '11',
+                '{{ suffix }}'  => 'bytes',
+                '{{ file }}'    => $this->path,
+            ));
+
+        $this->validator->validate($this->getFile($this->path), $constraint);
+    }
+
+    public function testTooLargeKiloBytes()
+    {
+        fwrite($this->file, str_repeat('0', 1400));
+
+        $constraint = new File(array(
+            'maxSize'           => '1k',
+            'maxSizeMessage'    => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ limit }}'   => '1',
+                '{{ size }}'    => '1.4',
+                '{{ suffix }}'  => 'kB',
+                '{{ file }}'    => $this->path,
+            ));
+
+        $this->validator->validate($this->getFile($this->path), $constraint);
+    }
+
+    public function testTooLargeMegaBytes()
+    {
+        fwrite($this->file, str_repeat('0', 1400000));
+
+        $constraint = new File(array(
+            'maxSize'           => '1M',
+            'maxSizeMessage'    => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ limit }}'   => '1',
+                '{{ size }}'    => '1.4',
+                '{{ suffix }}'  => 'MB',
+                '{{ file }}'    => $this->path,
+            ));
+
+        $this->validator->validate($this->getFile($this->path), $constraint);
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\ConstraintDefinitionException
+     */
+    public function testInvalidMaxSize()
+    {
+        $constraint = new File(array(
+            'maxSize' => '1abc',
+        ));
+
+        $this->validator->validate($this->path, $constraint);
+    }
+
+    public function testValidMimeType()
+    {
+        $file = $this
+            ->getMockBuilder('Symfony\Component\HttpFoundation\File\File')
+            ->disableOriginalConstructor()
+            ->getMock()
+        ;
+        $file
+            ->expects($this->once())
+            ->method('getPathname')
+            ->will($this->returnValue($this->path))
+        ;
+        $file
+            ->expects($this->once())
+            ->method('getMimeType')
+            ->will($this->returnValue('image/jpg'))
+        ;
+
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $constraint = new File(array(
+            'mimeTypes' => array('image/png', 'image/jpg'),
+        ));
+
+        $this->validator->validate($file, $constraint);
+    }
+
+    public function testValidWildcardMimeType()
+    {
+        $file = $this
+            ->getMockBuilder('Symfony\Component\HttpFoundation\File\File')
+            ->disableOriginalConstructor()
+            ->getMock()
+        ;
+        $file
+            ->expects($this->once())
+            ->method('getPathname')
+            ->will($this->returnValue($this->path))
+        ;
+        $file
+            ->expects($this->once())
+            ->method('getMimeType')
+            ->will($this->returnValue('image/jpg'))
+        ;
+
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $constraint = new File(array(
+            'mimeTypes' => array('image/*'),
+        ));
+
+        $this->validator->validate($file, $constraint);
+    }
+
+    public function testInvalidMimeType()
+    {
+        $file = $this
+            ->getMockBuilder('Symfony\Component\HttpFoundation\File\File')
+            ->disableOriginalConstructor()
+            ->getMock()
+        ;
+        $file
+            ->expects($this->once())
+            ->method('getPathname')
+            ->will($this->returnValue($this->path))
+        ;
+        $file
+            ->expects($this->once())
+            ->method('getMimeType')
+            ->will($this->returnValue('application/pdf'))
+        ;
+
+        $constraint = new File(array(
+            'mimeTypes' => array('image/png', 'image/jpg'),
+            'mimeTypesMessage' => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ type }}'    => '"application/pdf"',
+                '{{ types }}'   => '"image/png", "image/jpg"',
+                '{{ file }}'    => $this->path,
+            ));
+
+        $this->validator->validate($file, $constraint);
+    }
+
+    public function testInvalidWildcardMimeType()
+    {
+        $file = $this
+            ->getMockBuilder('Symfony\Component\HttpFoundation\File\File')
+            ->disableOriginalConstructor()
+            ->getMock()
+        ;
+        $file
+            ->expects($this->once())
+            ->method('getPathname')
+            ->will($this->returnValue($this->path))
+        ;
+        $file
+            ->expects($this->once())
+            ->method('getMimeType')
+            ->will($this->returnValue('application/pdf'))
+        ;
+
+        $constraint = new File(array(
+            'mimeTypes' => array('image/*', 'image/jpg'),
+            'mimeTypesMessage' => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ type }}'    => '"application/pdf"',
+                '{{ types }}'   => '"image/*", "image/jpg"',
+                '{{ file }}'    => $this->path,
+            ));
+
+        $this->validator->validate($file, $constraint);
+    }
+
+    /**
+     * @dataProvider uploadedFileErrorProvider
+     */
+    public function testUploadedFileError($error, $message, array $params = array())
+    {
+        $file = new UploadedFile('/path/to/file', 'originalName', 'mime', 0, $error);
+
+        $constraint = new File(array(
+            $message => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', $params);
+
+        $this->validator->validate($file, $constraint);
+
+    }
+
+    public function uploadedFileErrorProvider()
+    {
+        $tests = array(
+            array(UPLOAD_ERR_FORM_SIZE, 'uploadFormSizeErrorMessage'),
+            array(UPLOAD_ERR_PARTIAL, 'uploadPartialErrorMessage'),
+            array(UPLOAD_ERR_NO_FILE, 'uploadNoFileErrorMessage'),
+            array(UPLOAD_ERR_NO_TMP_DIR, 'uploadNoTmpDirErrorMessage'),
+            array(UPLOAD_ERR_CANT_WRITE, 'uploadCantWriteErrorMessage'),
+            array(UPLOAD_ERR_EXTENSION, 'uploadExtensionErrorMessage'),
+        );
+
+        if (class_exists('Symfony\Component\HttpFoundation\File\UploadedFile')) {
+            $tests[] = array(UPLOAD_ERR_INI_SIZE, 'uploadIniSizeErrorMessage', array(
+                '{{ limit }}' => UploadedFile::getMaxFilesize(),
+                '{{ suffix }}' => 'bytes',
+            ));
+        }
+
+        return $tests;
+    }
+
+    abstract protected function getFile($filename);
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/Fixtures/test.gif b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/Fixtures/test.gif
new file mode 100644
index 0000000..6b44fc7
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/Fixtures/test.gif
@@ -0,0 +1 @@
+GIF89a  ÷  ÿÿÿ                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             ,         ;
\ No newline at end of file
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/ImageValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/ImageValidatorTest.php
new file mode 100644
index 0000000..8854501
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/ImageValidatorTest.php
@@ -0,0 +1,226 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\Image;
+use Symfony\Component\Validator\Constraints\ImageValidator;
+
+class ImageValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $context;
+    protected $validator;
+    protected $path;
+    protected $image;
+
+    protected function setUp()
+    {
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new ImageValidator();
+        $this->validator->initialize($this->context);
+        $this->image = __DIR__.'/Fixtures/test.gif';
+    }
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new Image());
+    }
+
+    public function testEmptyStringIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate('', new Image());
+    }
+
+    public function testValidImage()
+    {
+        if (!class_exists('Symfony\Component\HttpFoundation\File\File')) {
+            $this->markTestSkipped('The "HttpFoundation" component is not available');
+        }
+
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate($this->image, new Image());
+    }
+
+    public function testValidSize()
+    {
+        if (!class_exists('Symfony\Component\HttpFoundation\File\File')) {
+            $this->markTestSkipped('The "HttpFoundation" component is not available');
+        }
+
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $constraint = new Image(array(
+            'minWidth' => 1,
+            'maxWidth' => 2,
+            'minHeight' => 1,
+            'maxHeight' => 2,
+        ));
+
+        $this->validator->validate($this->image, $constraint);
+    }
+
+    public function testWidthTooSmall()
+    {
+        if (!class_exists('Symfony\Component\HttpFoundation\File\File')) {
+            $this->markTestSkipped('The "HttpFoundation" component is not available');
+        }
+
+        $constraint = new Image(array(
+            'minWidth' => 3,
+            'minWidthMessage' => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ width }}' => '2',
+                '{{ min_width }}' => '3',
+            ));
+
+        $this->validator->validate($this->image, $constraint);
+    }
+
+    public function testWidthTooBig()
+    {
+        if (!class_exists('Symfony\Component\HttpFoundation\File\File')) {
+            $this->markTestSkipped('The "HttpFoundation" component is not available');
+        }
+
+        $constraint = new Image(array(
+            'maxWidth' => 1,
+            'maxWidthMessage' => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ width }}' => '2',
+                '{{ max_width }}' => '1',
+            ));
+
+        $this->validator->validate($this->image, $constraint);
+    }
+
+    public function testHeightTooSmall()
+    {
+        if (!class_exists('Symfony\Component\HttpFoundation\File\File')) {
+            $this->markTestSkipped('The "HttpFoundation" component is not available');
+        }
+
+        $constraint = new Image(array(
+            'minHeight' => 3,
+            'minHeightMessage' => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ height }}' => '2',
+                '{{ min_height }}' => '3',
+            ));
+
+        $this->validator->validate($this->image, $constraint);
+    }
+
+    public function testHeightTooBig()
+    {
+        if (!class_exists('Symfony\Component\HttpFoundation\File\File')) {
+            $this->markTestSkipped('The "HttpFoundation" component is not available');
+        }
+
+        $constraint = new Image(array(
+            'maxHeight' => 1,
+            'maxHeightMessage' => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ height }}' => '2',
+                '{{ max_height }}' => '1',
+            ));
+
+        $this->validator->validate($this->image, $constraint);
+    }
+
+    /**
+     * @expectedException \Symfony\Component\Validator\Exception\ConstraintDefinitionException
+     */
+    public function testInvalidMinWidth()
+    {
+        if (!class_exists('Symfony\Component\HttpFoundation\File\File')) {
+            $this->markTestSkipped('The "HttpFoundation" component is not available');
+        }
+
+        $constraint = new Image(array(
+            'minWidth' => '1abc',
+        ));
+
+        $this->validator->validate($this->image, $constraint);
+    }
+
+    /**
+     * @expectedException \Symfony\Component\Validator\Exception\ConstraintDefinitionException
+     */
+    public function testInvalidMaxWidth()
+    {
+        if (!class_exists('Symfony\Component\HttpFoundation\File\File')) {
+            $this->markTestSkipped('The "HttpFoundation" component is not available');
+        }
+
+        $constraint = new Image(array(
+            'maxWidth' => '1abc',
+        ));
+
+        $this->validator->validate($this->image, $constraint);
+    }
+
+    /**
+     * @expectedException \Symfony\Component\Validator\Exception\ConstraintDefinitionException
+     */
+    public function testInvalidMinHeight()
+    {
+        if (!class_exists('Symfony\Component\HttpFoundation\File\File')) {
+            $this->markTestSkipped('The "HttpFoundation" component is not available');
+        }
+
+        $constraint = new Image(array(
+            'minHeight' => '1abc',
+        ));
+
+        $this->validator->validate($this->image, $constraint);
+    }
+
+    /**
+     * @expectedException \Symfony\Component\Validator\Exception\ConstraintDefinitionException
+     */
+    public function testInvalidMaxHeight()
+    {
+        if (!class_exists('Symfony\Component\HttpFoundation\File\File')) {
+            $this->markTestSkipped('The "HttpFoundation" component is not available');
+        }
+
+        $constraint = new Image(array(
+            'maxHeight' => '1abc',
+        ));
+
+        $this->validator->validate($this->image, $constraint);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/IpValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/IpValidatorTest.php
new file mode 100644
index 0000000..7429318
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/IpValidatorTest.php
@@ -0,0 +1,478 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\Ip;
+use Symfony\Component\Validator\Constraints\IpValidator;
+
+class IpValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new IpValidator();
+        $this->validator->initialize($this->context);
+    }
+
+    protected function tearDown()
+    {
+        $this->context = null;
+        $this->validator = null;
+    }
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new Ip());
+    }
+
+    public function testEmptyStringIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate('', new Ip());
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\UnexpectedTypeException
+     */
+    public function testExpectsStringCompatibleType()
+    {
+        $this->validator->validate(new \stdClass(), new Ip());
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\ConstraintDefinitionException
+     */
+    public function testInvalidValidatorVersion()
+    {
+        $ip = new Ip(array(
+            'version' => 666,
+        ));
+    }
+
+    /**
+     * @dataProvider getValidIpsV4
+     */
+    public function testValidIpsV4($ip)
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate($ip, new Ip(array(
+            'version' => Ip::V4,
+        )));
+    }
+
+    public function getValidIpsV4()
+    {
+        return array(
+            array('0.0.0.0'),
+            array('10.0.0.0'),
+            array('123.45.67.178'),
+            array('172.16.0.0'),
+            array('192.168.1.0'),
+            array('224.0.0.1'),
+            array('255.255.255.255'),
+            array('127.0.0.0'),
+        );
+    }
+
+    /**
+     * @dataProvider getValidIpsV6
+     */
+    public function testValidIpsV6($ip)
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate($ip, new Ip(array(
+            'version' => Ip::V6,
+        )));
+    }
+
+    public function getValidIpsV6()
+    {
+        return array(
+            array('2001:0db8:85a3:0000:0000:8a2e:0370:7334'),
+            array('2001:0DB8:85A3:0000:0000:8A2E:0370:7334'),
+            array('2001:0Db8:85a3:0000:0000:8A2e:0370:7334'),
+            array('fdfe:dcba:9876:ffff:fdc6:c46b:bb8f:7d4c'),
+            array('fdc6:c46b:bb8f:7d4c:fdc6:c46b:bb8f:7d4c'),
+            array('fdc6:c46b:bb8f:7d4c:0000:8a2e:0370:7334'),
+            array('fe80:0000:0000:0000:0202:b3ff:fe1e:8329'),
+            array('fe80:0:0:0:202:b3ff:fe1e:8329'),
+            array('fe80::202:b3ff:fe1e:8329'),
+            array('0:0:0:0:0:0:0:0'),
+            array('::'),
+            array('0::'),
+            array('::0'),
+            array('0::0'),
+            // IPv4 mapped to IPv6
+            array('2001:0db8:85a3:0000:0000:8a2e:0.0.0.0'),
+            array('::0.0.0.0'),
+            array('::255.255.255.255'),
+            array('::123.45.67.178'),
+        );
+    }
+
+    /**
+     * @dataProvider getValidIpsAll
+     */
+    public function testValidIpsAll($ip)
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate($ip, new Ip(array(
+            'version' => Ip::ALL,
+        )));
+    }
+
+    public function getValidIpsAll()
+    {
+        return array_merge($this->getValidIpsV4(), $this->getValidIpsV6());
+    }
+
+    /**
+     * @dataProvider getInvalidIpsV4
+     */
+    public function testInvalidIpsV4($ip)
+    {
+        $constraint = new Ip(array(
+            'version' => Ip::V4,
+            'message' => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => $ip,
+            ));
+
+        $this->validator->validate($ip, $constraint);
+    }
+
+    public function getInvalidIpsV4()
+    {
+        return array(
+            array('0'),
+            array('0.0'),
+            array('0.0.0'),
+            array('256.0.0.0'),
+            array('0.256.0.0'),
+            array('0.0.256.0'),
+            array('0.0.0.256'),
+            array('-1.0.0.0'),
+            array('foobar'),
+        );
+    }
+
+    /**
+     * @dataProvider getInvalidPrivateIpsV4
+     */
+    public function testInvalidPrivateIpsV4($ip)
+    {
+        $constraint = new Ip(array(
+            'version' => Ip::V4_NO_PRIV,
+            'message' => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => $ip,
+            ));
+
+        $this->validator->validate($ip, $constraint);
+    }
+
+    public function getInvalidPrivateIpsV4()
+    {
+        return array(
+            array('10.0.0.0'),
+            array('172.16.0.0'),
+            array('192.168.1.0'),
+        );
+    }
+
+    /**
+     * @dataProvider getInvalidReservedIpsV4
+     */
+    public function testInvalidReservedIpsV4($ip)
+    {
+        $constraint = new Ip(array(
+            'version' => Ip::V4_NO_RES,
+            'message' => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => $ip,
+            ));
+
+        $this->validator->validate($ip, $constraint);
+    }
+
+    public function getInvalidReservedIpsV4()
+    {
+        return array(
+            array('0.0.0.0'),
+            array('224.0.0.1'),
+            array('255.255.255.255'),
+        );
+    }
+
+    /**
+     * @dataProvider getInvalidPublicIpsV4
+     */
+    public function testInvalidPublicIpsV4($ip)
+    {
+        $constraint = new Ip(array(
+            'version' => Ip::V4_ONLY_PUBLIC,
+            'message' => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => $ip,
+            ));
+
+        $this->validator->validate($ip, $constraint);
+    }
+
+    public function getInvalidPublicIpsV4()
+    {
+        return array_merge($this->getInvalidPrivateIpsV4(), $this->getInvalidReservedIpsV4());
+    }
+
+    /**
+     * @dataProvider getInvalidIpsV6
+     */
+    public function testInvalidIpsV6($ip)
+    {
+        $constraint = new Ip(array(
+            'version' => Ip::V6,
+            'message' => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => $ip,
+            ));
+
+        $this->validator->validate($ip, $constraint);
+    }
+
+    public function getInvalidIpsV6()
+    {
+        return array(
+            array('z001:0db8:85a3:0000:0000:8a2e:0370:7334'),
+            array('fe80'),
+            array('fe80:8329'),
+            array('fe80:::202:b3ff:fe1e:8329'),
+            array('fe80::202:b3ff::fe1e:8329'),
+            // IPv4 mapped to IPv6
+            array('2001:0db8:85a3:0000:0000:8a2e:0370:0.0.0.0'),
+            array('::0.0'),
+            array('::0.0.0'),
+            array('::256.0.0.0'),
+            array('::0.256.0.0'),
+            array('::0.0.256.0'),
+            array('::0.0.0.256'),
+        );
+    }
+
+    /**
+     * @dataProvider getInvalidPrivateIpsV6
+     */
+    public function testInvalidPrivateIpsV6($ip)
+    {
+        $constraint = new Ip(array(
+            'version' => Ip::V6_NO_PRIV,
+            'message' => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => $ip,
+            ));
+
+        $this->validator->validate($ip, $constraint);
+    }
+
+    public function getInvalidPrivateIpsV6()
+    {
+        return array(
+            array('fdfe:dcba:9876:ffff:fdc6:c46b:bb8f:7d4c'),
+            array('fdc6:c46b:bb8f:7d4c:fdc6:c46b:bb8f:7d4c'),
+            array('fdc6:c46b:bb8f:7d4c:0000:8a2e:0370:7334'),
+        );
+    }
+
+    /**
+     * @dataProvider getInvalidReservedIpsV6
+     */
+    public function testInvalidReservedIpsV6($ip)
+    {
+        $constraint = new Ip(array(
+            'version' => Ip::V6_NO_RES,
+            'message' => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => $ip,
+            ));
+
+        $this->validator->validate($ip, $constraint);
+    }
+
+    public function getInvalidReservedIpsV6()
+    {
+        // Quoting after official filter documentation:
+        // "FILTER_FLAG_NO_RES_RANGE = This flag does not apply to IPv6 addresses."
+        // Full description: http://php.net/manual/en/filter.filters.flags.php
+        return $this->getInvalidIpsV6();
+    }
+
+    /**
+     * @dataProvider getInvalidPublicIpsV6
+     */
+    public function testInvalidPublicIpsV6($ip)
+    {
+        $constraint = new Ip(array(
+            'version' => Ip::V6_ONLY_PUBLIC,
+            'message' => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => $ip,
+            ));
+
+        $this->validator->validate($ip, $constraint);
+    }
+
+    public function getInvalidPublicIpsV6()
+    {
+        return array_merge($this->getInvalidPrivateIpsV6(), $this->getInvalidReservedIpsV6());
+    }
+
+    /**
+     * @dataProvider getInvalidIpsAll
+     */
+    public function testInvalidIpsAll($ip)
+    {
+        $constraint = new Ip(array(
+            'version' => Ip::ALL,
+            'message' => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => $ip,
+            ));
+
+        $this->validator->validate($ip, $constraint);
+    }
+
+    public function getInvalidIpsAll()
+    {
+        return array_merge($this->getInvalidIpsV4(), $this->getInvalidIpsV6());
+    }
+
+    /**
+     * @dataProvider getInvalidPrivateIpsAll
+     */
+    public function testInvalidPrivateIpsAll($ip)
+    {
+        $constraint = new Ip(array(
+            'version' => Ip::ALL_NO_PRIV,
+            'message' => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => $ip,
+            ));
+
+        $this->validator->validate($ip, $constraint);
+    }
+
+    public function getInvalidPrivateIpsAll()
+    {
+        return array_merge($this->getInvalidPrivateIpsV4(), $this->getInvalidPrivateIpsV6());
+    }
+
+    /**
+     * @dataProvider getInvalidReservedIpsAll
+     */
+    public function testInvalidReservedIpsAll($ip)
+    {
+        $constraint = new Ip(array(
+            'version' => Ip::ALL_NO_RES,
+            'message' => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => $ip,
+            ));
+
+        $this->validator->validate($ip, $constraint);
+    }
+
+    public function getInvalidReservedIpsAll()
+    {
+        return array_merge($this->getInvalidReservedIpsV4(), $this->getInvalidReservedIpsV6());
+    }
+
+    /**
+     * @dataProvider getInvalidPublicIpsAll
+     */
+    public function testInvalidPublicIpsAll($ip)
+    {
+        $constraint = new Ip(array(
+            'version' => Ip::ALL_ONLY_PUBLIC,
+            'message' => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => $ip,
+            ));
+
+        $this->validator->validate($ip, $constraint);
+    }
+
+    public function getInvalidPublicIpsAll()
+    {
+        return array_merge($this->getInvalidPublicIpsV4(), $this->getInvalidPublicIpsV6());
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/LanguageValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/LanguageValidatorTest.php
new file mode 100644
index 0000000..4f06afa
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/LanguageValidatorTest.php
@@ -0,0 +1,114 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\Language;
+use Symfony\Component\Validator\Constraints\LanguageValidator;
+
+class LanguageValidatorTest extends LocalizedTestCase
+{
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        parent::setUp();
+
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new LanguageValidator();
+        $this->validator->initialize($this->context);
+    }
+
+    protected function tearDown()
+    {
+        $this->context = null;
+        $this->validator = null;
+    }
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new Language());
+    }
+
+    public function testEmptyStringIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate('', new Language());
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\UnexpectedTypeException
+     */
+    public function testExpectsStringCompatibleType()
+    {
+        $this->validator->validate(new \stdClass(), new Language());
+    }
+
+    /**
+     * @dataProvider getValidLanguages
+     */
+    public function testValidLanguages($language)
+    {
+        if (!class_exists('Symfony\Component\Locale\Locale')) {
+            $this->markTestSkipped('The "Locale" component is not available');
+        }
+
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate($language, new Language());
+    }
+
+    public function getValidLanguages()
+    {
+        return array(
+            array('en'),
+            array('en_US'),
+            array('my'),
+        );
+    }
+
+    /**
+     * @dataProvider getInvalidLanguages
+     */
+    public function testInvalidLanguages($language)
+    {
+        if (!class_exists('Symfony\Component\Locale\Locale')) {
+            $this->markTestSkipped('The "Locale" component is not available');
+        }
+
+        $constraint = new Language(array(
+            'message' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => $language,
+            ));
+
+        $this->validator->validate($language, $constraint);
+    }
+
+    public function getInvalidLanguages()
+    {
+        return array(
+            array('EN'),
+            array('foobar'),
+        );
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/LengthValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/LengthValidatorTest.php
new file mode 100644
index 0000000..5a343b4
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/LengthValidatorTest.php
@@ -0,0 +1,233 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\Length;
+use Symfony\Component\Validator\Constraints\LengthValidator;
+
+class LengthValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new LengthValidator();
+        $this->validator->initialize($this->context);
+    }
+
+    protected function tearDown()
+    {
+        $this->context = null;
+        $this->validator = null;
+    }
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new Length(6));
+    }
+
+    public function testEmptyStringIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate('', new Length(6));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\UnexpectedTypeException
+     */
+    public function testExpectsStringCompatibleType()
+    {
+        $this->validator->validate(new \stdClass(), new Length(5));
+    }
+
+    public function getThreeOrLessCharacters()
+    {
+        return array(
+            array(12),
+            array('12'),
+            array('Ã¼Ã¼', true),
+            array('Ã©Ã©', true),
+            array(123),
+            array('123'),
+            array('Ã¼Ã¼Ã¼', true),
+            array('Ã©Ã©Ã©', true),
+        );
+    }
+
+    public function getFourCharacters()
+    {
+        return array(
+            array(1234),
+            array('1234'),
+            array('Ã¼Ã¼Ã¼Ã¼', true),
+            array('Ã©Ã©Ã©Ã©', true),
+        );
+    }
+
+    public function getNotFourCharacters()
+    {
+        return array_merge(
+            $this->getThreeOrLessCharacters(),
+            $this->getFiveOrMoreCharacters()
+        );
+    }
+
+    public function getFiveOrMoreCharacters()
+    {
+        return array(
+            array(12345),
+            array('12345'),
+            array('Ã¼Ã¼Ã¼Ã¼Ã¼', true),
+            array('Ã©Ã©Ã©Ã©Ã©', true),
+            array(123456),
+            array('123456'),
+            array('Ã¼Ã¼Ã¼Ã¼Ã¼Ã¼', true),
+            array('Ã©Ã©Ã©Ã©Ã©Ã©', true),
+        );
+    }
+
+    /**
+     * @dataProvider getFiveOrMoreCharacters
+     */
+    public function testValidValuesMin($value, $mbOnly = false)
+    {
+        if ($mbOnly && !function_exists('mb_strlen')) {
+            $this->markTestSkipped('mb_strlen does not exist');
+        }
+
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $constraint = new Length(array('min' => 5));
+        $this->validator->validate($value, $constraint);
+    }
+
+    /**
+     * @dataProvider getThreeOrLessCharacters
+     */
+    public function testValidValuesMax($value, $mbOnly = false)
+    {
+        if ($mbOnly && !function_exists('mb_strlen')) {
+            $this->markTestSkipped('mb_strlen does not exist');
+        }
+
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $constraint = new Length(array('max' => 3));
+        $this->validator->validate($value, $constraint);
+    }
+
+    /**
+     * @dataProvider getFourCharacters
+     */
+    public function testValidValuesExact($value, $mbOnly = false)
+    {
+        if ($mbOnly && !function_exists('mb_strlen')) {
+            $this->markTestSkipped('mb_strlen does not exist');
+        }
+
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $constraint = new Length(4);
+        $this->validator->validate($value, $constraint);
+    }
+
+    /**
+     * @dataProvider getThreeOrLessCharacters
+     */
+    public function testInvalidValuesMin($value, $mbOnly = false)
+    {
+        if ($mbOnly && !function_exists('mb_strlen')) {
+            $this->markTestSkipped('mb_strlen does not exist');
+        }
+
+        $constraint = new Length(array(
+            'min' => 4,
+            'minMessage' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', $this->identicalTo(array(
+                '{{ value }}' => (string) $value,
+                '{{ limit }}' => 4,
+            )), $this->identicalTo($value), 4);
+
+        $this->validator->validate($value, $constraint);
+    }
+
+    /**
+     * @dataProvider getFiveOrMoreCharacters
+     */
+    public function testInvalidValuesMax($value, $mbOnly = false)
+    {
+        if ($mbOnly && !function_exists('mb_strlen')) {
+            $this->markTestSkipped('mb_strlen does not exist');
+        }
+
+        $constraint = new Length(array(
+            'max' => 4,
+            'maxMessage' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', $this->identicalTo(array(
+                '{{ value }}' => (string) $value,
+                '{{ limit }}' => 4,
+            )), $this->identicalTo($value), 4);
+
+        $this->validator->validate($value, $constraint);
+    }
+
+    /**
+     * @dataProvider getNotFourCharacters
+     */
+    public function testInvalidValuesExact($value, $mbOnly = false)
+    {
+        if ($mbOnly && !function_exists('mb_strlen')) {
+            $this->markTestSkipped('mb_strlen does not exist');
+        }
+
+        $constraint = new Length(array(
+            'min' => 4,
+            'max' => 4,
+            'exactMessage' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', $this->identicalTo(array(
+                '{{ value }}' => (string) $value,
+                '{{ limit }}' => 4,
+            )), $this->identicalTo($value), 4);
+
+        $this->validator->validate($value, $constraint);
+    }
+
+    public function testConstraintGetDefaultOption()
+    {
+        $constraint = new Length(5);
+
+        $this->assertEquals(5, $constraint->min);
+        $this->assertEquals(5, $constraint->max);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/LocaleValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/LocaleValidatorTest.php
new file mode 100644
index 0000000..01e4b76
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/LocaleValidatorTest.php
@@ -0,0 +1,116 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\Locale;
+use Symfony\Component\Validator\Constraints\LocaleValidator;
+
+class LocaleValidatorTest extends LocalizedTestCase
+{
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        parent::setUp();
+
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new LocaleValidator();
+        $this->validator->initialize($this->context);
+    }
+
+    protected function tearDown()
+    {
+        $this->context = null;
+        $this->validator = null;
+    }
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new Locale());
+    }
+
+    public function testEmptyStringIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate('', new Locale());
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\UnexpectedTypeException
+     */
+    public function testExpectsStringCompatibleType()
+    {
+        $this->validator->validate(new \stdClass(), new Locale());
+    }
+
+    /**
+     * @dataProvider getValidLocales
+     */
+    public function testValidLocales($locale)
+    {
+        if (!class_exists('Symfony\Component\Locale\Locale')) {
+            $this->markTestSkipped('The "Locale" component is not available');
+        }
+
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate($locale, new Locale());
+    }
+
+    public function getValidLocales()
+    {
+        return array(
+            array('en'),
+            array('en_US'),
+            array('pt'),
+            array('pt_PT'),
+            array('zh_Hans'),
+        );
+    }
+
+    /**
+     * @dataProvider getInvalidLocales
+     */
+    public function testInvalidLocales($locale)
+    {
+        if (!class_exists('Symfony\Component\Locale\Locale')) {
+            $this->markTestSkipped('The "Locale" component is not available');
+        }
+
+        $constraint = new Locale(array(
+            'message' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => $locale,
+            ));
+
+        $this->validator->validate($locale, $constraint);
+    }
+
+    public function getInvalidLocales()
+    {
+        return array(
+            array('EN'),
+            array('foobar'),
+        );
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/LocalizedTestCase.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/LocalizedTestCase.php
new file mode 100644
index 0000000..a71c089
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/LocalizedTestCase.php
@@ -0,0 +1,22 @@
+<?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\Constraints;
+
+abstract class LocalizedTestCase extends \PHPUnit_Framework_TestCase
+{
+    protected function setUp()
+    {
+        if (!extension_loaded('intl')) {
+            $this->markTestSkipped('The "intl" extension is not available');
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/LuhnValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/LuhnValidatorTest.php
new file mode 100644
index 0000000..3c05778
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/LuhnValidatorTest.php
@@ -0,0 +1,107 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\Luhn;
+use Symfony\Component\Validator\Constraints\LuhnValidator;
+
+class LuhnValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new LuhnValidator();
+        $this->validator->initialize($this->context);
+    }
+
+    protected function tearDown()
+    {
+        $this->context = null;
+        $this->validator = null;
+    }
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new Luhn());
+    }
+
+    public function testEmptyStringIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate('', new Luhn());
+    }
+
+    /**
+     * @dataProvider getValidNumbers
+     */
+    public function testValidNumbers($number)
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate($number, new Luhn());
+    }
+
+    public function getValidNumbers()
+    {
+        return array(
+            array('42424242424242424242'),
+            array('378282246310005'),
+            array('371449635398431'),
+            array('378734493671000'),
+            array('5610591081018250'),
+            array('30569309025904'),
+            array('38520000023237'),
+            array('6011111111111117'),
+            array('6011000990139424'),
+            array('3530111333300000'),
+            array('3566002020360505'),
+            array('5555555555554444'),
+            array('5105105105105100'),
+            array('4111111111111111'),
+            array('4012888888881881'),
+            array('4222222222222'),
+            array('5019717010103742'),
+            array('6331101999990016'),
+        );
+    }
+
+    /**
+     * @dataProvider getInvalidNumbers
+     */
+    public function testInvalidNumbers($number)
+    {
+        $constraint = new Luhn();
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with($constraint->message);
+
+        $this->validator->validate($number, $constraint);
+    }
+
+    public function getInvalidNumbers()
+    {
+        return array(
+            array('1234567812345678'),
+            array('4222222222222222'),
+        );
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/MaxLengthValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/MaxLengthValidatorTest.php
new file mode 100644
index 0000000..4db9103
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/MaxLengthValidatorTest.php
@@ -0,0 +1,127 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\MaxLength;
+use Symfony\Component\Validator\Constraints\MaxLengthValidator;
+
+class MaxLengthValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new MaxLengthValidator();
+        $this->validator->initialize($this->context);
+    }
+
+    protected function tearDown()
+    {
+        $this->context = null;
+        $this->validator = null;
+    }
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new MaxLength(array('limit' => 5)));
+    }
+
+    public function testEmptyStringIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate('', new MaxLength(array('limit' => 5)));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\UnexpectedTypeException
+     */
+    public function testExpectsStringCompatibleType()
+    {
+        $this->validator->validate(new \stdClass(), new MaxLength(array('limit' => 5)));
+    }
+
+    /**
+     * @dataProvider getValidValues
+     */
+    public function testValidValues($value, $mbOnly = false)
+    {
+        if ($mbOnly && !function_exists('mb_strlen')) {
+            $this->markTestSkipped('mb_strlen does not exist');
+        }
+
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $constraint = new MaxLength(array('limit' => 5));
+        $this->validator->validate($value, $constraint);
+    }
+
+    public function getValidValues()
+    {
+        return array(
+            array(12345),
+            array('12345'),
+            array('Ã¼Ã¼Ã¼Ã¼Ã¼', true),
+            array('Ã©Ã©Ã©Ã©Ã©', true),
+        );
+    }
+
+    /**
+     * @dataProvider getInvalidValues
+     */
+    public function testInvalidValues($value, $mbOnly = false)
+    {
+        if ($mbOnly && !function_exists('mb_strlen')) {
+            $this->markTestSkipped('mb_strlen does not exist');
+        }
+
+        $constraint = new MaxLength(array(
+            'limit' => 5,
+            'message' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', $this->identicalTo(array(
+                '{{ value }}' => (string) $value,
+                '{{ limit }}' => 5,
+            )), $this->identicalTo($value), 5);
+
+        $this->validator->validate($value, $constraint);
+    }
+
+    public function getInvalidValues()
+    {
+        return array(
+            array(123456),
+            array('123456'),
+            array('Ã¼Ã¼Ã¼Ã¼Ã¼Ã¼', true),
+            array('Ã©Ã©Ã©Ã©Ã©Ã©', true),
+        );
+    }
+
+    public function testConstraintGetDefaultOption()
+    {
+        $constraint = new MaxLength(array(
+            'limit' => 5,
+        ));
+
+        $this->assertEquals('limit', $constraint->getDefaultOption());
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/MaxValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/MaxValidatorTest.php
new file mode 100644
index 0000000..3ee95ee
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/MaxValidatorTest.php
@@ -0,0 +1,111 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\Max;
+use Symfony\Component\Validator\Constraints\MaxValidator;
+
+class MaxValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new MaxValidator();
+        $this->validator->initialize($this->context);
+    }
+
+    protected function tearDown()
+    {
+        $this->context = null;
+        $this->validator = null;
+    }
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new Max(array('limit' => 10)));
+    }
+
+    public function testEmptyStringIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate('', new Max(array('limit' => 10)));
+    }
+
+    /**
+     * @dataProvider getValidValues
+     */
+    public function testValidValues($value)
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $constraint = new Max(array('limit' => 10));
+        $this->validator->validate($value, $constraint);
+    }
+
+    public function getValidValues()
+    {
+        return array(
+            array(9.999999),
+            array(10),
+            array(10.0),
+            array('10'),
+        );
+    }
+
+    /**
+     * @dataProvider getInvalidValues
+     */
+    public function testInvalidValues($value)
+    {
+        $constraint = new Max(array(
+            'limit' => 10,
+            'message' => 'myMessage',
+            'invalidMessage' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => $value,
+                '{{ limit }}' => 10,
+            ));
+
+        $this->validator->validate($value, $constraint);
+    }
+
+    public function getInvalidValues()
+    {
+        return array(
+            array(10.00001),
+            array('10.00001'),
+            array(new \stdClass()),
+        );
+    }
+
+    public function testConstraintGetDefaultOption()
+    {
+        $constraint = new Max(array(
+            'limit' => 10,
+        ));
+
+        $this->assertEquals('limit', $constraint->getDefaultOption());
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/MinLengthValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/MinLengthValidatorTest.php
new file mode 100644
index 0000000..08d0a81
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/MinLengthValidatorTest.php
@@ -0,0 +1,127 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\MinLength;
+use Symfony\Component\Validator\Constraints\MinLengthValidator;
+
+class MinLengthValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new MinLengthValidator();
+        $this->validator->initialize($this->context);
+    }
+
+    protected function tearDown()
+    {
+        $this->context = null;
+        $this->validator = null;
+    }
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new MinLength(array('limit' => 6)));
+    }
+
+    public function testEmptyStringIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate('', new MinLength(array('limit' => 6)));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\UnexpectedTypeException
+     */
+    public function testExpectsStringCompatibleType()
+    {
+        $this->validator->validate(new \stdClass(), new MinLength(array('limit' => 5)));
+    }
+
+    /**
+     * @dataProvider getValidValues
+     */
+    public function testValidValues($value, $mbOnly = false)
+    {
+        if ($mbOnly && !function_exists('mb_strlen')) {
+            $this->markTestSkipped('mb_strlen does not exist');
+        }
+
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $constraint = new MinLength(array('limit' => 6));
+        $this->validator->validate($value, $constraint);
+    }
+
+    public function getValidValues()
+    {
+        return array(
+            array(123456),
+            array('123456'),
+            array('Ã¼Ã¼Ã¼Ã¼Ã¼Ã¼', true),
+            array('Ã©Ã©Ã©Ã©Ã©Ã©', true),
+        );
+    }
+
+    /**
+     * @dataProvider getInvalidValues
+     */
+    public function testInvalidValues($value, $mbOnly = false)
+    {
+        if ($mbOnly && !function_exists('mb_strlen')) {
+            $this->markTestSkipped('mb_strlen does not exist');
+        }
+
+        $constraint = new MinLength(array(
+            'limit' => 5,
+            'message' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', $this->identicalTo(array(
+                '{{ value }}' => (string) $value,
+                '{{ limit }}' => 5,
+            )), $this->identicalTo($value), 5);
+
+        $this->validator->validate($value, $constraint);
+    }
+
+    public function getInvalidValues()
+    {
+        return array(
+            array(1234),
+            array('1234'),
+            array('Ã¼Ã¼Ã¼Ã¼', true),
+            array('Ã©Ã©Ã©Ã©', true),
+        );
+    }
+
+    public function testConstraintGetDefaultOption()
+    {
+        $constraint = new MinLength(array(
+            'limit' => 5,
+        ));
+
+        $this->assertEquals('limit', $constraint->getDefaultOption());
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/MinValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/MinValidatorTest.php
new file mode 100644
index 0000000..f760190
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/MinValidatorTest.php
@@ -0,0 +1,105 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\Min;
+use Symfony\Component\Validator\Constraints\MinValidator;
+
+class MinValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new MinValidator();
+        $this->validator->initialize($this->context);
+    }
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new Min(array('limit' => 10)));
+    }
+
+    public function testEmptyStringIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate('', new Min(array('limit' => 10)));
+    }
+
+    /**
+     * @dataProvider getValidValues
+     */
+    public function testValidValues($value)
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $constraint = new Min(array('limit' => 10));
+        $this->validator->validate($value, $constraint);
+    }
+
+    public function getValidValues()
+    {
+        return array(
+            array(10.00001),
+            array('10.00001'),
+            array(10),
+            array(10.0),
+        );
+    }
+
+    /**
+     * @dataProvider getInvalidValues
+     */
+    public function testInvalidValues($value)
+    {
+        $constraint = new Min(array(
+            'limit' => 10,
+            'message' => 'myMessage',
+            'invalidMessage' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => $value,
+                '{{ limit }}' => 10,
+            ));
+
+        $this->validator->validate($value, $constraint);
+    }
+
+    public function getInvalidValues()
+    {
+        return array(
+            array(9.999999),
+            array('9.999999'),
+            array(new \stdClass()),
+        );
+    }
+
+    public function testConstraintGetDefaultOption()
+    {
+        $constraint = new Min(array(
+            'limit' => 10,
+        ));
+
+        $this->assertEquals('limit', $constraint->getDefaultOption());
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/NotBlankValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/NotBlankValidatorTest.php
new file mode 100644
index 0000000..85db95d
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/NotBlankValidatorTest.php
@@ -0,0 +1,108 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\NotBlank;
+use Symfony\Component\Validator\Constraints\NotBlankValidator;
+
+class NotBlankValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new NotBlankValidator();
+        $this->validator->initialize($this->context);
+    }
+
+    protected function tearDown()
+    {
+        $this->context = null;
+        $this->validator = null;
+    }
+
+    /**
+     * @dataProvider getValidValues
+     */
+    public function testValidValues($date)
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate($date, new NotBlank());
+    }
+
+    public function getValidValues()
+    {
+        return array(
+            array('foobar'),
+            array(0),
+            array(0.0),
+            array('0'),
+            array(1234),
+        );
+    }
+
+    public function testNullIsInvalid()
+    {
+        $constraint = new NotBlank(array(
+            'message' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage');
+
+        $this->validator->validate(null, $constraint);
+    }
+
+    public function testBlankIsInvalid()
+    {
+        $constraint = new NotBlank(array(
+            'message' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage');
+
+        $this->validator->validate('', $constraint);
+    }
+
+    public function testFalseIsInvalid()
+    {
+        $constraint = new NotBlank(array(
+            'message' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage');
+
+        $this->validator->validate(false, $constraint);
+    }
+
+    public function testEmptyArrayIsInvalid()
+    {
+        $constraint = new NotBlank(array(
+            'message' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage');
+
+        $this->validator->validate(array(), $constraint);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/NotNullValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/NotNullValidatorTest.php
new file mode 100644
index 0000000..96f74a1
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/NotNullValidatorTest.php
@@ -0,0 +1,69 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\NotNull;
+use Symfony\Component\Validator\Constraints\NotNullValidator;
+
+class NotNullValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new NotNullValidator();
+        $this->validator->initialize($this->context);
+    }
+
+    protected function tearDown()
+    {
+        $this->context = null;
+        $this->validator = null;
+    }
+
+    /**
+     * @dataProvider getValidValues
+     */
+    public function testValidValues($value)
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate($value, new NotNull());
+    }
+
+    public function getValidValues()
+    {
+        return array(
+            array(0),
+            array(false),
+            array(true),
+            array(''),
+        );
+    }
+
+    public function testNullIsInvalid()
+    {
+        $constraint = new NotNull(array(
+            'message' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+            ));
+
+        $this->validator->validate(null, $constraint);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/NullValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/NullValidatorTest.php
new file mode 100644
index 0000000..4466aa1
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/NullValidatorTest.php
@@ -0,0 +1,70 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\Null;
+use Symfony\Component\Validator\Constraints\NullValidator;
+
+class NullValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new NullValidator();
+        $this->validator->initialize($this->context);
+    }
+
+    protected function tearDown()
+    {
+        $this->context = null;
+        $this->validator = null;
+    }
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new Null());
+    }
+
+    /**
+     * @dataProvider getInvalidValues
+     */
+    public function testInvalidValues($value)
+    {
+        $constraint = new Null(array(
+            'message' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => $value,
+            ));
+
+        $this->validator->validate($value, $constraint);
+    }
+
+    public function getInvalidValues()
+    {
+        return array(
+            array(0),
+            array(false),
+            array(true),
+            array(''),
+        );
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/RangeValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/RangeValidatorTest.php
new file mode 100644
index 0000000..c44b0ea
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/RangeValidatorTest.php
@@ -0,0 +1,237 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\Range;
+use Symfony\Component\Validator\Constraints\RangeValidator;
+
+class RangeValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new RangeValidator();
+        $this->validator->initialize($this->context);
+    }
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new Range(array('min' => 10, 'max' => 20)));
+    }
+
+    public function getTenToTwenty()
+    {
+        return array(
+            array(10.00001),
+            array(19.99999),
+            array('10.00001'),
+            array('19.99999'),
+            array(10),
+            array(20),
+            array(10.0),
+            array(20.0),
+        );
+    }
+
+    public function getLessThanTen()
+    {
+        return array(
+            array(9.99999),
+            array('9.99999'),
+            array(5),
+            array(1.0),
+        );
+    }
+
+    public function getMoreThanTwenty()
+    {
+        return array(
+            array(20.000001),
+            array('20.000001'),
+            array(21),
+            array(30.0),
+        );
+    }
+
+    /**
+     * @dataProvider getTenToTwenty
+     */
+    public function testValidValuesMin($value)
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $constraint = new Range(array('min' => 10));
+        $this->validator->validate($value, $constraint);
+    }
+
+    /**
+     * @dataProvider getTenToTwenty
+     */
+    public function testValidValuesMax($value)
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $constraint = new Range(array('max' => 20));
+        $this->validator->validate($value, $constraint);
+    }
+
+    /**
+     * @dataProvider getTenToTwenty
+     */
+    public function testValidValuesMinMax($value)
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $constraint = new Range(array('min' => 10, 'max' => 20));
+        $this->validator->validate($value, $constraint);
+    }
+
+    /**
+     * @dataProvider getLessThanTen
+     */
+    public function testInvalidValuesMin($value)
+    {
+        $constraint = new Range(array(
+            'min' => 10,
+            'minMessage' => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', $this->identicalTo(array(
+                '{{ value }}' => $value,
+                '{{ limit }}' => 10,
+        )));
+
+        $this->validator->validate($value, $constraint);
+    }
+
+    /**
+     * @dataProvider getMoreThanTwenty
+     */
+    public function testInvalidValuesMax($value)
+    {
+        $constraint = new Range(array(
+            'max' => 20,
+            'maxMessage' => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', $this->identicalTo(array(
+                '{{ value }}' => $value,
+                '{{ limit }}' => 20,
+            )));
+
+        $this->validator->validate($value, $constraint);
+    }
+
+    /**
+     * @dataProvider getMoreThanTwenty
+     */
+    public function testInvalidValuesCombinedMax($value)
+    {
+        $constraint = new Range(array(
+            'min' => 10,
+            'max' => 20,
+            'minMessage' => 'myMinMessage',
+            'maxMessage' => 'myMaxMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMaxMessage', $this->identicalTo(array(
+                '{{ value }}' => $value,
+                '{{ limit }}' => 20,
+            )));
+
+        $this->validator->validate($value, $constraint);
+    }
+
+    /**
+     * @dataProvider getLessThanTen
+     */
+    public function testInvalidValuesCombinedMin($value)
+    {
+        $constraint = new Range(array(
+            'min' => 10,
+            'max' => 20,
+            'minMessage' => 'myMinMessage',
+            'maxMessage' => 'myMaxMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMinMessage', $this->identicalTo(array(
+            '{{ value }}' => $value,
+            '{{ limit }}' => 10,
+        )));
+
+        $this->validator->validate($value, $constraint);
+    }
+
+    public function getInvalidValues()
+    {
+        return array(
+            array(9.999999),
+            array(20.000001),
+            array('9.999999'),
+            array('20.000001'),
+            array(new \stdClass()),
+        );
+    }
+
+    public function testMinMessageIsSet()
+    {
+        $constraint = new Range(array(
+            'min' => 10,
+            'max' => 20,
+            'minMessage' => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => 9,
+                '{{ limit }}' => 10,
+            ));
+
+        $this->validator->validate(9, $constraint);
+    }
+
+    public function testMaxMessageIsSet()
+    {
+        $constraint = new Range(array(
+            'min' => 10,
+            'max' => 20,
+            'maxMessage' => 'myMessage',
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => 21,
+                '{{ limit }}' => 20,
+            ));
+
+        $this->validator->validate(21, $constraint);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/RegexValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/RegexValidatorTest.php
new file mode 100644
index 0000000..1cc0609
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/RegexValidatorTest.php
@@ -0,0 +1,174 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\Regex;
+use Symfony\Component\Validator\Constraints\RegexValidator;
+
+class RegexValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new RegexValidator();
+        $this->validator->initialize($this->context);
+    }
+
+    protected function tearDown()
+    {
+        $this->context = null;
+        $this->validator = null;
+    }
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new Regex(array('pattern' => '/^[0-9]+$/')));
+    }
+
+    public function testEmptyStringIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate('', new Regex(array('pattern' => '/^[0-9]+$/')));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\UnexpectedTypeException
+     */
+    public function testExpectsStringCompatibleType()
+    {
+        $this->validator->validate(new \stdClass(), new Regex(array('pattern' => '/^[0-9]+$/')));
+    }
+
+    /**
+     * @dataProvider getValidValues
+     */
+    public function testValidValues($value)
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $constraint = new Regex(array('pattern' => '/^[0-9]+$/'));
+        $this->validator->validate($value, $constraint);
+    }
+
+    public function getValidValues()
+    {
+        return array(
+            array(0),
+            array('0'),
+            array('090909'),
+            array(90909),
+        );
+    }
+
+    /**
+     * @dataProvider getInvalidValues
+     */
+    public function testInvalidValues($value)
+    {
+        $constraint = new Regex(array(
+            'pattern' => '/^[0-9]+$/',
+            'message' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => $value,
+            ));
+
+        $this->validator->validate($value, $constraint);
+    }
+
+    public function getInvalidValues()
+    {
+        return array(
+            array('abcd'),
+            array('090foo'),
+        );
+    }
+
+    public function testConstraintGetDefaultOption()
+    {
+        $constraint = new Regex(array(
+            'pattern' => '/^[0-9]+$/',
+        ));
+
+        $this->assertEquals('pattern', $constraint->getDefaultOption());
+    }
+
+    public function testHtmlPatternEscaping()
+    {
+        $constraint = new Regex(array(
+            'pattern' => '/^[0-9]+\/$/',
+        ));
+
+        $this->assertEquals('[0-9]+/', $constraint->getHtmlPattern());
+
+        $constraint = new Regex(array(
+            'pattern' => '#^[0-9]+\#$#',
+        ));
+
+        $this->assertEquals('[0-9]+#', $constraint->getHtmlPattern());
+    }
+
+    public function testHtmlPattern()
+    {
+        // Specified htmlPattern
+        $constraint = new Regex(array(
+            'pattern' => '/^[a-z]+$/i',
+            'htmlPattern' => '[a-zA-Z]+',
+        ));
+        $this->assertEquals('[a-zA-Z]+', $constraint->getHtmlPattern());
+
+        // Disabled htmlPattern
+        $constraint = new Regex(array(
+            'pattern' => '/^[a-z]+$/i',
+            'htmlPattern' => false,
+        ));
+        $this->assertNull($constraint->getHtmlPattern());
+
+        // Cannot be converted
+        $constraint = new Regex(array(
+            'pattern' => '/^[a-z]+$/i',
+        ));
+        $this->assertNull($constraint->getHtmlPattern());
+
+        // Automatically converted
+        $constraint = new Regex(array(
+            'pattern' => '/^[a-z]+$/',
+        ));
+        $this->assertEquals('[a-z]+', $constraint->getHtmlPattern());
+
+        // Automatically converted, adds .*
+        $constraint = new Regex(array(
+            'pattern' => '/[a-z]+/',
+        ));
+        $this->assertEquals('.*[a-z]+.*', $constraint->getHtmlPattern());
+        
+        // Dropped because of match=false
+        $constraint = new Regex(array(
+            'pattern' => '/[a-z]+/',
+            'match' => false
+        ));
+        $this->assertNull($constraint->getHtmlPattern());
+    }
+
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/TimeValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/TimeValidatorTest.php
new file mode 100644
index 0000000..285ab25
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/TimeValidatorTest.php
@@ -0,0 +1,117 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\Time;
+use Symfony\Component\Validator\Constraints\TimeValidator;
+
+class TimeValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new TimeValidator();
+        $this->validator->initialize($this->context);
+    }
+
+    protected function tearDown()
+    {
+        $this->context = null;
+        $this->validator = null;
+    }
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new Time());
+    }
+
+    public function testEmptyStringIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate('', new Time());
+    }
+
+    public function testDateTimeClassIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(new \DateTime(), new Time());
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\UnexpectedTypeException
+     */
+    public function testExpectsStringCompatibleType()
+    {
+        $this->validator->validate(new \stdClass(), new Time());
+    }
+
+    /**
+     * @dataProvider getValidTimes
+     */
+    public function testValidTimes($time)
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate($time, new Time());
+    }
+
+    public function getValidTimes()
+    {
+        return array(
+            array('01:02:03'),
+            array('00:00:00'),
+            array('23:59:59'),
+        );
+    }
+
+    /**
+     * @dataProvider getInvalidTimes
+     */
+    public function testInvalidTimes($time)
+    {
+        $constraint = new Time(array(
+            'message' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => $time,
+            ));
+
+        $this->validator->validate($time, $constraint);
+    }
+
+    public function getInvalidTimes()
+    {
+        return array(
+            array('foobar'),
+            array('foobar 12:34:56'),
+            array('12:34:56 foobar'),
+            array('00:00'),
+            array('24:00:00'),
+            array('00:60:00'),
+            array('00:00:60'),
+        );
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/TrueValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/TrueValidatorTest.php
new file mode 100644
index 0000000..2590179
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/TrueValidatorTest.php
@@ -0,0 +1,64 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\True;
+use Symfony\Component\Validator\Constraints\TrueValidator;
+
+class TrueValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new TrueValidator();
+        $this->validator->initialize($this->context);
+    }
+
+    protected function tearDown()
+    {
+        $this->context = null;
+        $this->validator = null;
+    }
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new True());
+    }
+
+    public function testTrueIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(true, new True());
+    }
+
+    public function testFalseIsInvalid()
+    {
+        $constraint = new True(array(
+            'message' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+            ));
+
+        $this->validator->validate(false, $constraint);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/TypeValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/TypeValidatorTest.php
new file mode 100644
index 0000000..e5e6d0b
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/TypeValidatorTest.php
@@ -0,0 +1,183 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\Type;
+use Symfony\Component\Validator\Constraints\TypeValidator;
+
+class TypeValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected static $file;
+
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new TypeValidator();
+        $this->validator->initialize($this->context);
+    }
+
+    protected function tearDown()
+    {
+        $this->context = null;
+        $this->validator = null;
+    }
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new Type(array('type' => 'integer')));
+    }
+
+    public function testEmptyIsValidIfString()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate('', new Type(array('type' => 'string')));
+    }
+
+    public function testEmptyIsInvalidIfNoString()
+    {
+        $this->context->expects($this->once())
+            ->method('addViolation');
+
+        $this->validator->validate('', new Type(array('type' => 'integer')));
+    }
+
+    /**
+     * @dataProvider getValidValues
+     */
+    public function testValidValues($value, $type)
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $constraint = new Type(array('type' => $type));
+
+        $this->validator->validate($value, $constraint);
+    }
+
+    public function getValidValues()
+    {
+        $object = new \stdClass();
+        $file = $this->createFile();
+
+        return array(
+            array(true, 'Boolean'),
+            array(false, 'Boolean'),
+            array(true, 'boolean'),
+            array(false, 'boolean'),
+            array(true, 'bool'),
+            array(false, 'bool'),
+            array(0, 'numeric'),
+            array('0', 'numeric'),
+            array(1.5, 'numeric'),
+            array('1.5', 'numeric'),
+            array(0, 'integer'),
+            array(1.5, 'float'),
+            array('12345', 'string'),
+            array(array(), 'array'),
+            array($object, 'object'),
+            array($object, 'stdClass'),
+            array($file, 'resource'),
+            array('12345', 'digit'),
+            array('12a34', 'alnum'),
+            array('abcde', 'alpha'),
+            array("\n\r\t", 'cntrl'),
+            array('arf12', 'graph'),
+            array('abcde', 'lower'),
+            array('ABCDE', 'upper'),
+            array('arf12', 'print'),
+            array('*&$()', 'punct'),
+            array("\n\r\t", 'space'),
+            array('AB10BC99', 'xdigit'),
+        );
+    }
+
+    /**
+     * @dataProvider getInvalidValues
+     */
+    public function testInvalidValues($value, $type, $valueAsString)
+    {
+        $constraint = new Type(array(
+            'type' => $type,
+            'message' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => $valueAsString,
+                '{{ type }}' => $type,
+            ));
+
+        $this->validator->validate($value, $constraint);
+    }
+
+    public function getInvalidValues()
+    {
+        $object = new \stdClass();
+        $file = $this->createFile();
+
+        return array(
+            array('foobar', 'numeric', 'foobar'),
+            array('foobar', 'boolean', 'foobar'),
+            array('0', 'integer', '0'),
+            array('1.5', 'float', '1.5'),
+            array(12345, 'string', '12345'),
+            array($object, 'boolean', 'stdClass'),
+            array($object, 'numeric', 'stdClass'),
+            array($object, 'integer', 'stdClass'),
+            array($object, 'float', 'stdClass'),
+            array($object, 'string', 'stdClass'),
+            array($object, 'resource', 'stdClass'),
+            array($file, 'boolean', (string) $file),
+            array($file, 'numeric', (string) $file),
+            array($file, 'integer', (string) $file),
+            array($file, 'float', (string) $file),
+            array($file, 'string', (string) $file),
+            array($file, 'object', (string) $file),
+            array('12a34', 'digit', '12a34'),
+            array('1a#23', 'alnum', '1a#23'),
+            array('abcd1', 'alpha', 'abcd1'),
+            array("\nabc", 'cntrl', "\nabc"),
+            array("abc\n", 'graph', "abc\n"),
+            array('abCDE', 'lower', 'abCDE'),
+            array('ABcde', 'upper', 'ABcde'),
+            array("\nabc", 'print', "\nabc"),
+            array('abc&$!', 'punct', 'abc&$!'),
+            array("\nabc", 'space', "\nabc"),
+            array('AR1012', 'xdigit', 'AR1012'),
+        );
+    }
+
+    protected function createFile()
+    {
+        if (!self::$file) {
+            self::$file = fopen(__FILE__, 'r');
+        }
+
+        return self::$file;
+    }
+
+    public static function tearDownAfterClass()
+    {
+        if (self::$file) {
+            fclose(self::$file);
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/UrlValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/UrlValidatorTest.php
new file mode 100644
index 0000000..bace806
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/UrlValidatorTest.php
@@ -0,0 +1,168 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\Url;
+use Symfony\Component\Validator\Constraints\UrlValidator;
+
+class UrlValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $context;
+    protected $validator;
+
+    protected function setUp()
+    {
+        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
+        $this->validator = new UrlValidator();
+        $this->validator->initialize($this->context);
+    }
+
+    protected function tearDown()
+    {
+        $this->context = null;
+        $this->validator = null;
+    }
+
+    public function testNullIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate(null, new Url());
+    }
+
+    public function testEmptyStringIsValid()
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate('', new Url());
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\UnexpectedTypeException
+     */
+    public function testExpectsStringCompatibleType()
+    {
+        $this->validator->validate(new \stdClass(), new Url());
+    }
+
+    /**
+     * @dataProvider getValidUrls
+     */
+    public function testValidUrls($url)
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $this->validator->validate($url, new Url());
+    }
+
+    public function getValidUrls()
+    {
+        return array(
+            array('http://a.pl'),
+            array('http://www.google.com'),
+            array('http://www.google.museum'),
+            array('https://google.com/'),
+            array('https://google.com:80/'),
+            array('http://www.example.coop/'),
+            array('http://www.test-example.com/'),
+            array('http://www.symfony.com/'),
+            array('http://symfony.fake/blog/'),
+            array('http://symfony.com/?'),
+            array('http://symfony.com/search?type=&q=url+validator'),
+            array('http://symfony.com/#'),
+            array('http://symfony.com/#?'),
+            array('http://www.symfony.com/doc/current/book/validation.html#supported-constraints'),
+            array('http://very.long.domain.name.com/'),
+            array('http://127.0.0.1/'),
+            array('http://127.0.0.1:80/'),
+            array('http://[::1]/'),
+            array('http://[::1]:80/'),
+            array('http://[1:2:3::4:5:6:7]/'),
+            array('http://sÃ£opaulo.com/'),
+            array('http://sÃ£opaulo.com.br/'),
+            array('http://Ð¿Ñ€Ð¸Ð¼ÐµÑ€.Ð¸ÑÐ¿Ñ‹Ñ‚Ð°Ð½Ð¸Ðµ/'),
+            array('http://Ù…Ø«Ø§Ù„.Ø¥Ø®ØªØ¨Ø§Ø±/'),
+            array('http://ä¾‹å­.æµ‹è¯•/'),
+            array('http://ä¾‹å­.æ¸¬è©¦/'),
+            array('http://ä¾‹ãˆ.ãƒ†ã‚¹ãƒˆ/'),
+            array('http://Ù…Ø«Ø§Ù„.Ø¢Ø²Ù…Ø§ÛŒØ´ÛŒ/'),
+            array('http://ì‹¤ë¡€.í…ŒìŠ¤íŠ¸/'),
+            array('http://Ø§Ù„Ø¹Ø±Ø¨ÙŠØ©.idn.icann.org/'),
+            array('http://â˜Ž.com/'),
+        );
+    }
+
+    /**
+     * @dataProvider getInvalidUrls
+     */
+    public function testInvalidUrls($url)
+    {
+        $constraint = new Url(array(
+            'message' => 'myMessage'
+        ));
+
+        $this->context->expects($this->once())
+            ->method('addViolation')
+            ->with('myMessage', array(
+                '{{ value }}' => $url,
+            ));
+
+        $this->validator->validate($url, $constraint);
+    }
+
+    public function getInvalidUrls()
+    {
+        return array(
+            array('google.com'),
+            array('://google.com'),
+            array('http ://google.com'),
+            array('http:/google.com'),
+            array('http://goog_le.com'),
+            array('http://google.com::aa'),
+            array('http://google.com:aa'),
+            array('http://symfony.com?'),
+            array('http://symfony.com#'),
+            array('ftp://google.fr'),
+            array('faked://google.fr'),
+            array('http://127.0.0.1:aa/'),
+            array('ftp://[::1]/'),
+            array('http://[::1'),
+        );
+    }
+
+    /**
+     * @dataProvider getValidCustomUrls
+     */
+    public function testCustomProtocolIsValid($url)
+    {
+        $this->context->expects($this->never())
+            ->method('addViolation');
+
+        $constraint = new Url(array(
+            'protocols' => array('ftp', 'file', 'git')
+        ));
+
+        $this->validator->validate($url, $constraint);
+    }
+
+    public function getValidCustomUrls()
+    {
+        return array(
+            array('ftp://google.com'),
+            array('file://127.0.0.1'),
+            array('git://[::1]/'),
+        );
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/ValidTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/ValidTest.php
new file mode 100644
index 0000000..0957700
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Constraints/ValidTest.php
@@ -0,0 +1,28 @@
+<?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\Constraints;
+
+use Symfony\Component\Validator\Constraints\Valid;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class ValidTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\ConstraintDefinitionException
+     */
+    public function testRejectGroupsOption()
+    {
+        new Valid(array('groups' => 'foo'));
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ExecutionContextTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ExecutionContextTest.php
new file mode 100644
index 0000000..40b5996
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ExecutionContextTest.php
@@ -0,0 +1,305 @@
+<?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;
+
+use Symfony\Component\Validator\Mapping\PropertyMetadata;
+use Symfony\Component\Validator\Mapping\ClassMetadata;
+use Symfony\Component\Validator\ConstraintViolation;
+use Symfony\Component\Validator\ConstraintViolationList;
+use Symfony\Component\Validator\ExecutionContext;
+
+class ExecutionContextTest extends \PHPUnit_Framework_TestCase
+{
+    private $visitor;
+    private $violations;
+    private $metadata;
+    private $metadataFactory;
+    private $globalContext;
+
+    /**
+     * @var ExecutionContext
+     */
+    private $context;
+
+    protected function setUp()
+    {
+        $this->visitor = $this->getMockBuilder('Symfony\Component\Validator\ValidationVisitor')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->violations = new ConstraintViolationList();
+        $this->metadata = $this->getMock('Symfony\Component\Validator\MetadataInterface');
+        $this->metadataFactory = $this->getMock('Symfony\Component\Validator\MetadataFactoryInterface');
+        $this->globalContext = $this->getMock('Symfony\Component\Validator\GlobalExecutionContextInterface');
+        $this->globalContext->expects($this->any())
+            ->method('getRoot')
+            ->will($this->returnValue('Root'));
+        $this->globalContext->expects($this->any())
+            ->method('getViolations')
+            ->will($this->returnValue($this->violations));
+        $this->globalContext->expects($this->any())
+            ->method('getVisitor')
+            ->will($this->returnValue($this->visitor));
+        $this->globalContext->expects($this->any())
+            ->method('getMetadataFactory')
+            ->will($this->returnValue($this->metadataFactory));
+        $this->context = new ExecutionContext($this->globalContext, $this->metadata, 'currentValue', 'Group', 'foo.bar');
+    }
+
+    protected function tearDown()
+    {
+        $this->globalContext = null;
+        $this->context = null;
+    }
+
+    public function testInit()
+    {
+        $this->assertCount(0, $this->context->getViolations());
+        $this->assertSame('Root', $this->context->getRoot());
+        $this->assertSame('foo.bar', $this->context->getPropertyPath());
+        $this->assertSame('Group', $this->context->getGroup());
+
+        $this->visitor->expects($this->once())
+            ->method('getGraphWalker')
+            ->will($this->returnValue('GRAPHWALKER'));
+
+        // BC
+        $this->assertNull($this->context->getCurrentClass());
+        $this->assertNull($this->context->getCurrentProperty());
+        $this->assertSame('GRAPHWALKER', $this->context->getGraphWalker());
+        $this->assertSame($this->metadataFactory, $this->context->getMetadataFactory());
+    }
+
+    public function testInitWithClassMetadata()
+    {
+        // BC
+        $this->metadata = new ClassMetadata(__NAMESPACE__ . '\ExecutionContextTest_TestClass');
+        $this->context = new ExecutionContext($this->globalContext, $this->metadata, 'currentValue', 'Group', 'foo.bar');
+
+        $this->assertSame(__NAMESPACE__ . '\ExecutionContextTest_TestClass', $this->context->getCurrentClass());
+        $this->assertNull($this->context->getCurrentProperty());
+    }
+
+    public function testInitWithPropertyMetadata()
+    {
+        // BC
+        $this->metadata = new PropertyMetadata(__NAMESPACE__ . '\ExecutionContextTest_TestClass', 'myProperty');
+        $this->context = new ExecutionContext($this->globalContext, $this->metadata, 'currentValue', 'Group', 'foo.bar');
+
+        $this->assertSame(__NAMESPACE__ . '\ExecutionContextTest_TestClass', $this->context->getCurrentClass());
+        $this->assertSame('myProperty', $this->context->getCurrentProperty());
+    }
+
+    public function testClone()
+    {
+        $clone = clone $this->context;
+
+        // Cloning the context keeps the reference to the original violation
+        // list. This way we can efficiently duplicate context instances during
+        // the validation run and only modify the properties that need to be
+        // changed.
+        $this->assertSame($this->context->getViolations(), $clone->getViolations());
+    }
+
+    public function testAddViolation()
+    {
+        $this->context->addViolation('Error', array('foo' => 'bar'), 'invalid');
+
+        $this->assertEquals(new ConstraintViolationList(array(
+            new ConstraintViolation(
+                'Error',
+                array('foo' => 'bar'),
+                'Root',
+                'foo.bar',
+                'invalid'
+            ),
+        )), $this->context->getViolations());
+    }
+
+    public function testAddViolationUsesPreconfiguredValueIfNotPassed()
+    {
+        $this->context->addViolation('Error');
+
+        $this->assertEquals(new ConstraintViolationList(array(
+            new ConstraintViolation(
+                'Error',
+                array(),
+                'Root',
+                'foo.bar',
+                'currentValue'
+            ),
+        )), $this->context->getViolations());
+    }
+
+    public function testAddViolationUsesPassedNullValue()
+    {
+        // passed null value should override preconfigured value "invalid"
+        $this->context->addViolation('Error', array('foo' => 'bar'), null);
+        $this->context->addViolation('Error', array('foo' => 'bar'), null, 1);
+
+        $this->assertEquals(new ConstraintViolationList(array(
+            new ConstraintViolation(
+                'Error',
+                array('foo' => 'bar'),
+                'Root',
+                'foo.bar',
+                null
+            ),
+            new ConstraintViolation(
+                'Error',
+                array('foo' => 'bar'),
+                'Root',
+                'foo.bar',
+                null,
+                1
+            ),
+        )), $this->context->getViolations());
+    }
+
+    public function testAddViolationAtPath()
+    {
+        // override preconfigured property path
+        $this->context->addViolationAtPath('bar.baz', 'Error', array('foo' => 'bar'), 'invalid');
+
+        $this->assertEquals(new ConstraintViolationList(array(
+            new ConstraintViolation(
+                'Error',
+                array('foo' => 'bar'),
+                'Root',
+                'bar.baz',
+                'invalid'
+            ),
+        )), $this->context->getViolations());
+    }
+
+    public function testAddViolationAtPathUsesPreconfiguredValueIfNotPassed()
+    {
+        $this->context->addViolationAtPath('bar.baz', 'Error');
+
+        $this->assertEquals(new ConstraintViolationList(array(
+            new ConstraintViolation(
+                'Error',
+                array(),
+                'Root',
+                'bar.baz',
+                'currentValue'
+            ),
+        )), $this->context->getViolations());
+    }
+
+    public function testAddViolationAtPathUsesPassedNullValue()
+    {
+        // passed null value should override preconfigured value "invalid"
+        $this->context->addViolationAtPath('bar.baz', 'Error', array('foo' => 'bar'), null);
+        $this->context->addViolationAtPath('bar.baz', 'Error', array('foo' => 'bar'), null, 1);
+
+        $this->assertEquals(new ConstraintViolationList(array(
+            new ConstraintViolation(
+                'Error',
+                array('foo' => 'bar'),
+                'Root',
+                'bar.baz',
+                null
+            ),
+            new ConstraintViolation(
+                'Error',
+                array('foo' => 'bar'),
+                'Root',
+                'bar.baz',
+                null,
+                1
+            ),
+        )), $this->context->getViolations());
+    }
+
+    public function testAddViolationAt()
+    {
+        // override preconfigured property path
+        $this->context->addViolationAt('bam.baz', 'Error', array('foo' => 'bar'), 'invalid');
+
+        $this->assertEquals(new ConstraintViolationList(array(
+            new ConstraintViolation(
+                'Error',
+                array('foo' => 'bar'),
+                'Root',
+                'foo.bar.bam.baz',
+                'invalid'
+            ),
+        )), $this->context->getViolations());
+    }
+
+    public function testAddViolationAtUsesPreconfiguredValueIfNotPassed()
+    {
+        $this->context->addViolationAt('bam.baz', 'Error');
+
+        $this->assertEquals(new ConstraintViolationList(array(
+            new ConstraintViolation(
+                'Error',
+                array(),
+                'Root',
+                'foo.bar.bam.baz',
+                'currentValue'
+            ),
+        )), $this->context->getViolations());
+    }
+
+    public function testAddViolationAtUsesPassedNullValue()
+    {
+        // passed null value should override preconfigured value "invalid"
+        $this->context->addViolationAt('bam.baz', 'Error', array('foo' => 'bar'), null);
+        $this->context->addViolationAt('bam.baz', 'Error', array('foo' => 'bar'), null, 1);
+
+        $this->assertEquals(new ConstraintViolationList(array(
+            new ConstraintViolation(
+                'Error',
+                array('foo' => 'bar'),
+                'Root',
+                'foo.bar.bam.baz',
+                null
+            ),
+            new ConstraintViolation(
+                'Error',
+                array('foo' => 'bar'),
+                'Root',
+                'foo.bar.bam.baz',
+                null,
+                1
+            ),
+        )), $this->context->getViolations());
+    }
+
+    public function testGetPropertyPath()
+    {
+        $this->assertEquals('foo.bar', $this->context->getPropertyPath());
+    }
+
+    public function testGetPropertyPathWithIndexPath()
+    {
+        $this->assertEquals('foo.bar[bam]', $this->context->getPropertyPath('[bam]'));
+    }
+
+    public function testGetPropertyPathWithEmptyPath()
+    {
+        $this->assertEquals('foo.bar', $this->context->getPropertyPath(''));
+    }
+
+    public function testGetPropertyPathWithEmptyCurrentPropertyPath()
+    {
+        $this->context = new ExecutionContext($this->globalContext, $this->metadata, 'currentValue', 'Group', '');
+
+        $this->assertEquals('bam.baz', $this->context->getPropertyPath('bam.baz'));
+    }
+}
+
+class ExecutionContextTest_TestClass
+{
+    public $myProperty;
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/ClassConstraint.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/ClassConstraint.php
new file mode 100644
index 0000000..a4dc777
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/ClassConstraint.php
@@ -0,0 +1,22 @@
+<?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;
+
+use Symfony\Component\Validator\Constraint;
+
+class ClassConstraint extends Constraint
+{
+    public function getTargets()
+    {
+        return self::CLASS_CONSTRAINT;
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/ConstraintA.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/ConstraintA.php
new file mode 100644
index 0000000..8a196dc
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/ConstraintA.php
@@ -0,0 +1,31 @@
+<?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;
+
+use Symfony\Component\Validator\Constraint;
+
+/** @Annotation */
+class ConstraintA extends Constraint
+{
+    public $property1;
+    public $property2;
+
+    public function getDefaultOption()
+    {
+        return 'property2';
+    }
+
+    public function getTargets()
+    {
+        return array(self::PROPERTY_CONSTRAINT, self::CLASS_CONSTRAINT);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/ConstraintAValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/ConstraintAValidator.php
new file mode 100644
index 0000000..787c78c
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/ConstraintAValidator.php
@@ -0,0 +1,39 @@
+<?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;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\ExecutionContextInterface;
+
+class ConstraintAValidator extends ConstraintValidator
+{
+    public static $passedContext;
+
+    public function initialize(ExecutionContextInterface $context)
+    {
+        parent::initialize($context);
+
+        self::$passedContext = $context;
+    }
+
+    public function validate($value, Constraint $constraint)
+    {
+        if ('VALID' != $value) {
+            $this->context->addViolation('message', array('param' => 'value'));
+
+            return;
+        }
+
+        return;
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/ConstraintB.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/ConstraintB.php
new file mode 100644
index 0000000..6258923
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/ConstraintB.php
@@ -0,0 +1,23 @@
+<?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;
+
+use Symfony\Component\Validator\Constraint;
+
+/** @Annotation */
+class ConstraintB extends Constraint
+{
+    public function getTargets()
+    {
+        return array(self::PROPERTY_CONSTRAINT, self::CLASS_CONSTRAINT);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/ConstraintC.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/ConstraintC.php
new file mode 100644
index 0000000..b0418b8
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/ConstraintC.php
@@ -0,0 +1,30 @@
+<?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;
+
+use Symfony\Component\Validator\Constraint;
+
+/** @Annotation */
+class ConstraintC extends Constraint
+{
+    public $option1;
+
+    public function getRequiredOptions()
+    {
+        return array('option1');
+    }
+
+    public function getTargets()
+    {
+        return array(self::PROPERTY_CONSTRAINT, self::CLASS_CONSTRAINT);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/Entity.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/Entity.php
new file mode 100644
index 0000000..15f73c5
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/Entity.php
@@ -0,0 +1,56 @@
+<?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;
+
+use Symfony\Component\Validator\Constraints as Assert;
+
+/**
+ * @Symfony\Component\Validator\Tests\Fixtures\ConstraintA
+ * @Assert\GroupSequence({"Foo", "Entity"})
+ */
+class Entity extends EntityParent implements EntityInterface
+{
+    /**
+     * @Assert\NotNull
+     * @Assert\Min(3)
+     * @Assert\All({@Assert\NotNull, @Assert\Min(3)}),
+     * @Assert\All(constraints={@Assert\NotNull, @Assert\Min(3)})
+     * @Assert\Collection(fields={
+     *   "foo" = {@Assert\NotNull, @Assert\Min(3)},
+     *   "bar" = @Assert\Min(5)
+     * })
+     * @Assert\Choice(choices={"A", "B"}, message="Must be one of %choices%")
+     */
+    protected $firstName;
+    protected $lastName;
+    public $reference;
+
+    private $internal;
+
+    public function __construct($internal = null)
+    {
+        $this->internal = $internal;
+    }
+
+    public function getInternal()
+    {
+        return $this->internal . ' from getter';
+    }
+
+    /**
+     * @Assert\NotNull
+     */
+    public function getLastName()
+    {
+        return $this->lastName;
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/EntityInterface.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/EntityInterface.php
new file mode 100644
index 0000000..2901f26
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/EntityInterface.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;
+
+interface EntityInterface
+{
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/EntityParent.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/EntityParent.php
new file mode 100644
index 0000000..d12d943
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/EntityParent.php
@@ -0,0 +1,25 @@
+<?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;
+
+use Symfony\Component\Validator\Constraints\NotNull;
+
+class EntityParent
+{
+    protected $firstName;
+    private $internal;
+
+    /**
+     * @NotNull
+     */
+    protected $other;
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/FailingConstraint.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/FailingConstraint.php
new file mode 100644
index 0000000..03019fc
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/FailingConstraint.php
@@ -0,0 +1,24 @@
+<?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;
+
+use Symfony\Component\Validator\Constraint;
+
+class FailingConstraint extends Constraint
+{
+    public $message = 'Failed';
+
+    public function getTargets()
+    {
+        return array(self::PROPERTY_CONSTRAINT, self::CLASS_CONSTRAINT);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/FailingConstraintValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/FailingConstraintValidator.php
new file mode 100644
index 0000000..854e80f
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/FailingConstraintValidator.php
@@ -0,0 +1,25 @@
+<?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;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+
+class FailingConstraintValidator extends ConstraintValidator
+{
+    public function validate($value, Constraint $constraint)
+    {
+        $this->context->addViolation($constraint->message, array());
+
+        return;
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/FakeMetadataFactory.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/FakeMetadataFactory.php
new file mode 100644
index 0000000..1276ca5
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/FakeMetadataFactory.php
@@ -0,0 +1,56 @@
+<?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;
+
+use Symfony\Component\Validator\MetadataFactoryInterface;
+use Symfony\Component\Validator\Exception\NoSuchMetadataException;
+use Symfony\Component\Validator\Mapping\ClassMetadata;
+
+class FakeMetadataFactory implements MetadataFactoryInterface
+{
+    protected $metadatas = array();
+
+    public function getMetadataFor($class)
+    {
+        if (is_object($class)) {
+            $class = get_class($class);
+        }
+
+        if (!is_string($class)) {
+            throw new NoSuchMetadataException('No metadata for type ' . gettype($class));
+        }
+
+        if (!isset($this->metadatas[$class])) {
+            throw new NoSuchMetadataException('No metadata for "' . $class . '"');
+        }
+
+        return $this->metadatas[$class];
+    }
+
+    public function hasMetadataFor($class)
+    {
+        if (is_object($class)) {
+            $class = get_class($class);
+        }
+
+        if (!is_string($class)) {
+            return false;
+        }
+
+        return isset($this->metadatas[$class]);
+    }
+
+    public function addMetadata(ClassMetadata $metadata)
+    {
+        $this->metadatas[$metadata->getClassName()] = $metadata;
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/FilesLoader.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/FilesLoader.php
new file mode 100644
index 0000000..59d8ee8
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/FilesLoader.php
@@ -0,0 +1,39 @@
+<?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;
+
+use Symfony\Component\Validator\Mapping\Loader\FilesLoader as BaseFilesLoader;
+use Symfony\Component\Validator\Mapping\Loader\LoaderInterface;
+
+abstract class FilesLoader extends BaseFilesLoader
+{
+    protected $timesCalled = 0;
+    protected $loader;
+
+    public function __construct(array $paths, LoaderInterface $loader)
+    {
+        $this->loader = $loader;
+        parent::__construct($paths);
+    }
+
+    protected function getFileLoaderInstance($file)
+    {
+        $this->timesCalled++;
+
+        return $this->loader;
+    }
+
+    public function getTimesCalled()
+    {
+        return $this->timesCalled;
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/GroupSequenceProviderEntity.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/GroupSequenceProviderEntity.php
new file mode 100644
index 0000000..ef37111
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/GroupSequenceProviderEntity.php
@@ -0,0 +1,36 @@
+<?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;
+
+use Symfony\Component\Validator\Constraints as Assert;
+use Symfony\Component\Validator\GroupSequenceProviderInterface;
+
+/**
+ * @Assert\GroupSequenceProvider
+ */
+class GroupSequenceProviderEntity implements GroupSequenceProviderInterface
+{
+    public $firstName;
+    public $lastName;
+
+    protected $groups = array();
+
+    public function setGroups($groups)
+    {
+        $this->groups = $groups;
+    }
+
+    public function getGroupSequence()
+    {
+        return $this->groups;
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/InvalidConstraint.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/InvalidConstraint.php
new file mode 100644
index 0000000..d8df639
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/InvalidConstraint.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;
+
+use Symfony\Component\Validator\Constraint;
+
+class InvalidConstraint extends Constraint {}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/InvalidConstraintValidator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/InvalidConstraintValidator.php
new file mode 100644
index 0000000..f6ebb3b
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/InvalidConstraintValidator.php
@@ -0,0 +1,14 @@
+<?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 InvalidConstraintValidator {}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/PropertyConstraint.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/PropertyConstraint.php
new file mode 100644
index 0000000..fadb535
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/PropertyConstraint.php
@@ -0,0 +1,22 @@
+<?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;
+
+use Symfony\Component\Validator\Constraint;
+
+class PropertyConstraint extends Constraint
+{
+    public function getTargets()
+    {
+        return self::PROPERTY_CONSTRAINT;
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/Reference.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/Reference.php
new file mode 100644
index 0000000..f8ea173
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Fixtures/Reference.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 Reference
+{
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/GraphWalkerTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/GraphWalkerTest.php
new file mode 100644
index 0000000..83a67db
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/GraphWalkerTest.php
@@ -0,0 +1,570 @@
+<?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;
+
+use Symfony\Component\Validator\Tests\Fixtures\ConstraintAValidator;
+use Symfony\Component\Validator\ValidationVisitor;
+use Symfony\Component\Validator\Tests\Fixtures\Entity;
+use Symfony\Component\Validator\Tests\Fixtures\Reference;
+use Symfony\Component\Validator\Tests\Fixtures\FakeMetadataFactory;
+use Symfony\Component\Validator\Tests\Fixtures\ConstraintA;
+use Symfony\Component\Validator\Tests\Fixtures\FailingConstraint;
+use Symfony\Component\Validator\GraphWalker;
+use Symfony\Component\Validator\ConstraintViolation;
+use Symfony\Component\Validator\ConstraintViolationList;
+use Symfony\Component\Validator\ConstraintValidatorFactory;
+use Symfony\Component\Validator\Mapping\ClassMetadata;
+use Symfony\Component\Validator\Constraints\Valid;
+use Symfony\Component\Validator\Constraints\Collection;
+
+class GraphWalkerTest extends \PHPUnit_Framework_TestCase
+{
+    const CLASSNAME = 'Symfony\Component\Validator\Tests\Fixtures\Entity';
+
+    /**
+     * @var ValidationVisitor
+     */
+    private $visitor;
+
+    /**
+     * @var FakeMetadataFactory
+     */
+    protected $metadataFactory;
+
+    /**
+     * @var GraphWalker
+     */
+    protected $walker;
+
+    /**
+     * @var ClassMetadata
+     */
+    protected $metadata;
+
+    protected function setUp()
+    {
+        $this->metadataFactory = new FakeMetadataFactory();
+        $this->visitor = new ValidationVisitor('Root', $this->metadataFactory, new ConstraintValidatorFactory());
+        $this->walker = $this->visitor->getGraphWalker();
+        $this->metadata = new ClassMetadata(self::CLASSNAME);
+        $this->metadataFactory->addMetadata($this->metadata);
+    }
+
+    protected function tearDown()
+    {
+        $this->metadataFactory = null;
+        $this->visitor = null;
+        $this->walker = null;
+        $this->metadata = null;
+    }
+
+    public function testWalkObjectPassesCorrectClassAndProperty()
+    {
+        $this->metadata->addConstraint(new ConstraintA());
+
+        $entity = new Entity();
+        $this->walker->walkObject($this->metadata, $entity, 'Default', '');
+
+        $context = ConstraintAValidator::$passedContext;
+
+        $this->assertEquals('Symfony\Component\Validator\Tests\Fixtures\Entity', $context->getCurrentClass());
+        $this->assertNull($context->getCurrentProperty());
+    }
+
+    public function testWalkObjectValidatesConstraints()
+    {
+        $this->metadata->addConstraint(new ConstraintA());
+
+        $this->walker->walkObject($this->metadata, new Entity(), 'Default', '');
+
+        $this->assertCount(1, $this->walker->getViolations());
+    }
+
+    public function testWalkObjectTwiceValidatesConstraintsOnce()
+    {
+        $this->metadata->addConstraint(new ConstraintA());
+
+        $entity = new Entity();
+
+        $this->walker->walkObject($this->metadata, $entity, 'Default', '');
+        $this->walker->walkObject($this->metadata, $entity, 'Default', '');
+
+        $this->assertCount(1, $this->walker->getViolations());
+    }
+
+    public function testWalkObjectOnceInVisitorAndOnceInWalkerValidatesConstraintsOnce()
+    {
+        $this->metadata->addConstraint(new ConstraintA());
+
+        $entity = new Entity();
+
+        $this->visitor->validate($entity, 'Default', '');
+        $this->walker->walkObject($this->metadata, $entity, 'Default', '');
+
+        $this->assertCount(1, $this->walker->getViolations());
+    }
+
+    public function testWalkDifferentObjectsValidatesTwice()
+    {
+        $this->metadata->addConstraint(new ConstraintA());
+
+        $this->walker->walkObject($this->metadata, new Entity(), 'Default', '');
+        $this->walker->walkObject($this->metadata, new Entity(), 'Default', '');
+
+        $this->assertCount(2, $this->walker->getViolations());
+    }
+
+    public function testWalkObjectTwiceInDifferentGroupsValidatesTwice()
+    {
+        $this->metadata->addConstraint(new ConstraintA());
+        $this->metadata->addConstraint(new ConstraintA(array('groups' => 'Custom')));
+
+        $entity = new Entity();
+
+        $this->walker->walkObject($this->metadata, $entity, 'Default', '');
+        $this->walker->walkObject($this->metadata, $entity, 'Custom', '');
+
+        $this->assertCount(2, $this->walker->getViolations());
+    }
+
+    public function testWalkObjectValidatesPropertyConstraints()
+    {
+        $this->metadata->addPropertyConstraint('firstName', new ConstraintA());
+
+        $this->walker->walkObject($this->metadata, new Entity(), 'Default', '');
+
+        $this->assertCount(1, $this->walker->getViolations());
+    }
+
+    public function testWalkObjectValidatesGetterConstraints()
+    {
+        $this->metadata->addGetterConstraint('lastName', new ConstraintA());
+
+        $this->walker->walkObject($this->metadata, new Entity(), 'Default', '');
+
+        $this->assertCount(1, $this->walker->getViolations());
+    }
+
+    public function testWalkObjectInDefaultGroupTraversesGroupSequence()
+    {
+        $entity = new Entity();
+
+        $this->metadata->addPropertyConstraint('firstName', new FailingConstraint(array(
+            'groups' => 'First',
+        )));
+        $this->metadata->addGetterConstraint('lastName', new FailingConstraint(array(
+            'groups' => 'Default',
+        )));
+        $this->metadata->setGroupSequence(array('First', $this->metadata->getDefaultGroup()));
+
+        $this->walker->walkObject($this->metadata, $entity, 'Default', '');
+
+        // After validation of group "First" failed, no more group was
+        // validated
+        $violations = new ConstraintViolationList();
+        $violations->add(new ConstraintViolation(
+            'Failed',
+            array(),
+            'Root',
+            'firstName',
+            ''
+        ));
+
+        $this->assertEquals($violations, $this->walker->getViolations());
+    }
+
+    public function testWalkObjectInGroupSequencePropagatesDefaultGroup()
+    {
+        $entity = new Entity();
+        $entity->reference = new Reference();
+
+        $this->metadata->addPropertyConstraint('reference', new Valid());
+        $this->metadata->setGroupSequence(array($this->metadata->getDefaultGroup()));
+
+        $referenceMetadata = new ClassMetadata(get_class($entity->reference));
+        $referenceMetadata->addConstraint(new FailingConstraint(array(
+            // this constraint is only evaluated if group "Default" is
+            // propagated to the reference
+            'groups' => 'Default',
+        )));
+        $this->metadataFactory->addMetadata($referenceMetadata);
+
+        $this->walker->walkObject($this->metadata, $entity, 'Default', '');
+
+        // The validation of the reference's FailingConstraint in group
+        // "Default" was launched
+        $violations = new ConstraintViolationList();
+        $violations->add(new ConstraintViolation(
+            'Failed',
+            array(),
+            'Root',
+            'reference',
+            $entity->reference
+        ));
+
+        $this->assertEquals($violations, $this->walker->getViolations());
+    }
+
+    public function testWalkObjectInOtherGroupTraversesNoGroupSequence()
+    {
+        $entity = new Entity();
+
+        $this->metadata->addPropertyConstraint('firstName', new FailingConstraint(array(
+            'groups' => 'First',
+        )));
+        $this->metadata->addGetterConstraint('lastName', new FailingConstraint(array(
+            'groups' => $this->metadata->getDefaultGroup(),
+        )));
+        $this->metadata->setGroupSequence(array('First', $this->metadata->getDefaultGroup()));
+
+        $this->walker->walkObject($this->metadata, $entity, $this->metadata->getDefaultGroup(), '');
+
+        // Only group "Second" was validated
+        $violations = new ConstraintViolationList();
+        $violations->add(new ConstraintViolation(
+            'Failed',
+            array(),
+            'Root',
+            'lastName',
+            ''
+        ));
+
+        $this->assertEquals($violations, $this->walker->getViolations());
+    }
+
+    public function testWalkPropertyPassesCorrectClassAndProperty()
+    {
+        $this->metadata->addPropertyConstraint('firstName', new ConstraintA());
+
+        $this->walker->walkPropertyValue($this->metadata, 'firstName', 'value', 'Default', '');
+
+        $context = ConstraintAValidator::$passedContext;
+
+        $this->assertEquals('Symfony\Component\Validator\Tests\Fixtures\Entity', $context->getCurrentClass());
+        $this->assertEquals('firstName', $context->getCurrentProperty());
+    }
+
+    public function testWalkPropertyValueValidatesConstraints()
+    {
+        $this->metadata->addPropertyConstraint('firstName', new ConstraintA());
+
+        $this->walker->walkPropertyValue($this->metadata, 'firstName', 'value', 'Default', '');
+
+        $this->assertCount(1, $this->walker->getViolations());
+    }
+
+    public function testWalkCascadedPropertyValidatesReferences()
+    {
+        $entity = new Entity();
+        $entityMetadata = new ClassMetadata(get_class($entity));
+        $this->metadataFactory->addMetadata($entityMetadata);
+
+        // add a constraint for the entity that always fails
+        $entityMetadata->addConstraint(new FailingConstraint());
+
+        // validate entity when validating the property "reference"
+        $this->metadata->addPropertyConstraint('reference', new Valid());
+
+        // invoke validation on an object
+        $this->walker->walkPropertyValue(
+            $this->metadata,
+            'reference',
+            $entity,  // object!
+            'Default',
+            'path'
+        );
+
+        $violations = new ConstraintViolationList();
+        $violations->add(new ConstraintViolation(
+            'Failed',
+            array(),
+            'Root',
+            'path',
+            $entity
+        ));
+
+        $this->assertEquals($violations, $this->walker->getViolations());
+    }
+
+    public function testWalkCascadedPropertyValidatesArraysByDefault()
+    {
+        $entity = new Entity();
+        $entityMetadata = new ClassMetadata(get_class($entity));
+        $this->metadataFactory->addMetadata($entityMetadata);
+
+        // add a constraint for the entity that always fails
+        $entityMetadata->addConstraint(new FailingConstraint());
+
+        // validate array when validating the property "reference"
+        $this->metadata->addPropertyConstraint('reference', new Valid());
+
+        $this->walker->walkPropertyValue(
+            $this->metadata,
+            'reference',
+            array('key' => $entity), // array!
+            'Default',
+            'path'
+        );
+
+        $violations = new ConstraintViolationList();
+        $violations->add(new ConstraintViolation(
+            'Failed',
+            array(),
+            'Root',
+            'path[key]',
+            $entity
+        ));
+
+        $this->assertEquals($violations, $this->walker->getViolations());
+    }
+
+    public function testWalkCascadedPropertyValidatesTraversableByDefault()
+    {
+        $entity = new Entity();
+        $entityMetadata = new ClassMetadata(get_class($entity));
+        $this->metadataFactory->addMetadata($entityMetadata);
+        $this->metadataFactory->addMetadata(new ClassMetadata('ArrayIterator'));
+
+        // add a constraint for the entity that always fails
+        $entityMetadata->addConstraint(new FailingConstraint());
+
+        // validate array when validating the property "reference"
+        $this->metadata->addPropertyConstraint('reference', new Valid());
+
+        $this->walker->walkPropertyValue(
+            $this->metadata,
+            'reference',
+            new \ArrayIterator(array('key' => $entity)),
+            'Default',
+            'path'
+        );
+
+        $violations = new ConstraintViolationList();
+        $violations->add(new ConstraintViolation(
+            'Failed',
+            array(),
+            'Root',
+            'path[key]',
+            $entity
+        ));
+
+        $this->assertEquals($violations, $this->walker->getViolations());
+    }
+
+    public function testWalkCascadedPropertyDoesNotValidateTraversableIfDisabled()
+    {
+        $entity = new Entity();
+        $entityMetadata = new ClassMetadata(get_class($entity));
+        $this->metadataFactory->addMetadata($entityMetadata);
+        $this->metadataFactory->addMetadata(new ClassMetadata('ArrayIterator'));
+
+        // add a constraint for the entity that always fails
+        $entityMetadata->addConstraint(new FailingConstraint());
+
+        // validate array when validating the property "reference"
+        $this->metadata->addPropertyConstraint('reference', new Valid(array(
+            'traverse' => false,
+        )));
+
+        $this->walker->walkPropertyValue(
+            $this->metadata,
+            'reference',
+            new \ArrayIterator(array('key' => $entity)),
+            'Default',
+            'path'
+        );
+
+        $violations = new ConstraintViolationList();
+
+        $this->assertEquals($violations, $this->walker->getViolations());
+    }
+
+    public function testWalkCascadedPropertyDoesNotRecurseByDefault()
+    {
+        $entity = new Entity();
+        $entityMetadata = new ClassMetadata(get_class($entity));
+        $this->metadataFactory->addMetadata($entityMetadata);
+        $this->metadataFactory->addMetadata(new ClassMetadata('ArrayIterator'));
+
+        // add a constraint for the entity that always fails
+        $entityMetadata->addConstraint(new FailingConstraint());
+
+        // validate iterator when validating the property "reference"
+        $this->metadata->addPropertyConstraint('reference', new Valid());
+
+        $this->walker->walkPropertyValue(
+            $this->metadata,
+            'reference',
+            new \ArrayIterator(array(
+                // The inner iterator should not be traversed by default
+                'key' => new \ArrayIterator(array(
+                    'nested' => $entity,
+                )),
+            )),
+            'Default',
+            'path'
+        );
+
+        $violations = new ConstraintViolationList();
+
+        $this->assertEquals($violations, $this->walker->getViolations());
+    }
+
+    public function testWalkCascadedPropertyRecursesIfDeepIsSet()
+    {
+        $entity = new Entity();
+        $entityMetadata = new ClassMetadata(get_class($entity));
+        $this->metadataFactory->addMetadata($entityMetadata);
+        $this->metadataFactory->addMetadata(new ClassMetadata('ArrayIterator'));
+
+        // add a constraint for the entity that always fails
+        $entityMetadata->addConstraint(new FailingConstraint());
+
+        // validate iterator when validating the property "reference"
+        $this->metadata->addPropertyConstraint('reference', new Valid(array(
+            'deep' => true,
+        )));
+
+        $this->walker->walkPropertyValue(
+            $this->metadata,
+            'reference',
+            new \ArrayIterator(array(
+                // The inner iterator should now be traversed
+                'key' => new \ArrayIterator(array(
+                    'nested' => $entity,
+                )),
+            )),
+            'Default',
+            'path'
+        );
+
+        $violations = new ConstraintViolationList();
+        $violations->add(new ConstraintViolation(
+            'Failed',
+            array(),
+            'Root',
+            'path[key][nested]',
+            $entity
+        ));
+
+        $this->assertEquals($violations, $this->walker->getViolations());
+    }
+
+    public function testWalkCascadedPropertyDoesNotValidateNestedScalarValues()
+    {
+        // validate array when validating the property "reference"
+        $this->metadata->addPropertyConstraint('reference', new Valid());
+
+        $this->walker->walkPropertyValue(
+            $this->metadata,
+            'reference',
+            array('scalar', 'values'),
+            'Default',
+            'path'
+        );
+
+        $violations = new ConstraintViolationList();
+
+        $this->assertEquals($violations, $this->walker->getViolations());
+    }
+
+    public function testWalkCascadedPropertyDoesNotValidateNullValues()
+    {
+        $this->metadata->addPropertyConstraint('reference', new Valid());
+
+        $this->walker->walkPropertyValue(
+            $this->metadata,
+            'reference',
+            null,
+            'Default',
+            ''
+        );
+
+        $this->assertCount(0, $this->walker->getViolations());
+    }
+
+    public function testWalkCascadedPropertyRequiresObjectOrArray()
+    {
+        $this->metadata->addPropertyConstraint('reference', new Valid());
+
+        $this->setExpectedException('Symfony\Component\Validator\Exception\NoSuchMetadataException');
+
+        $this->walker->walkPropertyValue(
+            $this->metadata,
+            'reference',
+            'no object',
+            'Default',
+            ''
+        );
+    }
+
+    public function testWalkConstraintBuildsAViolationIfFailed()
+    {
+        $constraint = new ConstraintA();
+
+        $this->walker->walkConstraint($constraint, 'foobar', 'Default', 'firstName.path');
+
+        $violations = new ConstraintViolationList();
+        $violations->add(new ConstraintViolation(
+            'message',
+            array('param' => 'value'),
+            'Root',
+            'firstName.path',
+            'foobar'
+        ));
+
+        $this->assertEquals($violations, $this->walker->getViolations());
+    }
+
+    public function testWalkConstraintBuildsNoViolationIfSuccessful()
+    {
+        $constraint = new ConstraintA();
+
+        $this->walker->walkConstraint($constraint, 'VALID', 'Default', 'firstName.path');
+
+        $this->assertCount(0, $this->walker->getViolations());
+    }
+
+    public function testWalkObjectUsesCorrectPropertyPathInViolationsWhenUsingCollections()
+    {
+        $constraint = new Collection(array(
+            'foo' => new ConstraintA(),
+            'bar' => new ConstraintA(),
+        ));
+
+        $this->walker->walkConstraint($constraint, array('foo' => 'VALID'), 'Default', 'collection');
+        $violations = $this->walker->getViolations();
+        $this->assertEquals('collection[bar]', $violations[0]->getPropertyPath());
+    }
+
+    public function testWalkObjectUsesCorrectPropertyPathInViolationsWhenUsingNestedCollections()
+    {
+        $constraint = new Collection(array(
+            'foo' => new Collection(array(
+                'foo' => new ConstraintA(),
+                'bar' => new ConstraintA(),
+            )),
+        ));
+
+        $this->walker->walkConstraint($constraint, array('foo' => array('foo' => 'VALID')), 'Default', 'collection');
+        $violations = $this->walker->getViolations();
+        $this->assertEquals('collection[foo][bar]', $violations[0]->getPropertyPath());
+    }
+
+    protected function getProperty($property)
+    {
+        $p = new \ReflectionProperty($this->walker, $property);
+        $p->setAccessible(true);
+
+        return $p->getValue($this->walker);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Cache/ApcCacheTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Cache/ApcCacheTest.php
new file mode 100644
index 0000000..4c7fe79
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Cache/ApcCacheTest.php
@@ -0,0 +1,78 @@
+<?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\Mapping\Cache;
+
+use Symfony\Component\Validator\Mapping\Cache\ApcCache;
+
+class ApcCacheTest extends \PHPUnit_Framework_TestCase
+{
+    protected function setUp()
+    {
+        if (!extension_loaded('apc') || !ini_get('apc.enable_cli')) {
+            $this->markTestSkipped('APC is not loaded.');
+        }
+    }
+
+    public function testWrite()
+    {
+        $meta = $this->getMockBuilder('Symfony\\Component\\Validator\\Mapping\\ClassMetadata')
+            ->disableOriginalConstructor()
+            ->setMethods(array('getClassName'))
+            ->getMock();
+
+        $meta->expects($this->once())
+            ->method('getClassName')
+            ->will($this->returnValue('bar'));
+
+        $cache = new ApcCache('foo');
+        $cache->write($meta);
+
+        $this->assertInstanceOf('Symfony\\Component\\Validator\\Mapping\\ClassMetadata', apc_fetch('foobar'), '->write() stores metadata in APC');
+    }
+
+    public function testHas()
+    {
+        $meta = $this->getMockBuilder('Symfony\\Component\\Validator\\Mapping\\ClassMetadata')
+            ->disableOriginalConstructor()
+            ->setMethods(array('getClassName'))
+            ->getMock();
+
+        $meta->expects($this->once())
+            ->method('getClassName')
+            ->will($this->returnValue('bar'));
+
+        apc_delete('foobar');
+
+        $cache = new ApcCache('foo');
+        $this->assertFalse($cache->has('bar'), '->has() returns false when there is no entry');
+
+        $cache->write($meta);
+        $this->assertTrue($cache->has('bar'), '->has() returns true when the is an entry');
+    }
+
+    public function testRead()
+    {
+        $meta = $this->getMockBuilder('Symfony\\Component\\Validator\\Mapping\\ClassMetadata')
+            ->disableOriginalConstructor()
+            ->setMethods(array('getClassName'))
+            ->getMock();
+
+        $meta->expects($this->once())
+            ->method('getClassName')
+            ->will($this->returnValue('bar'));
+
+        $cache = new ApcCache('foo');
+        $cache->write($meta);
+
+        $this->assertInstanceOf('Symfony\\Component\\Validator\\Mapping\\ClassMetadata', $cache->read('bar'), '->read() returns metadata');
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/ClassMetadataFactoryTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/ClassMetadataFactoryTest.php
new file mode 100644
index 0000000..7ee36b4
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/ClassMetadataFactoryTest.php
@@ -0,0 +1,119 @@
+<?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\Mapping;
+
+use Symfony\Component\Validator\Tests\Fixtures\Entity;
+use Symfony\Component\Validator\Tests\Fixtures\ConstraintA;
+use Symfony\Component\Validator\Mapping\ClassMetadataFactory;
+use Symfony\Component\Validator\Mapping\ClassMetadata;
+use Symfony\Component\Validator\Mapping\Loader\LoaderInterface;
+
+class ClassMetadataFactoryTest extends \PHPUnit_Framework_TestCase
+{
+    const CLASSNAME = 'Symfony\Component\Validator\Tests\Fixtures\Entity';
+    const PARENTCLASS = 'Symfony\Component\Validator\Tests\Fixtures\EntityParent';
+
+    public function testLoadClassMetadata()
+    {
+        $factory = new ClassMetadataFactory(new TestLoader());
+        $metadata = $factory->getClassMetadata(self::PARENTCLASS);
+
+        $constraints = array(
+            new ConstraintA(array('groups' => array('Default', 'EntityParent'))),
+        );
+
+        $this->assertEquals($constraints, $metadata->getConstraints());
+    }
+
+    public function testMergeParentConstraints()
+    {
+        $factory = new ClassMetadataFactory(new TestLoader());
+        $metadata = $factory->getClassMetadata(self::CLASSNAME);
+
+        $constraints = array(
+            new ConstraintA(array('groups' => array(
+                'Default',
+                'EntityParent',
+                'Entity',
+            ))),
+            new ConstraintA(array('groups' => array(
+                'Default',
+                'EntityInterface',
+                'Entity',
+            ))),
+            new ConstraintA(array('groups' => array(
+                'Default',
+                'Entity',
+            ))),
+        );
+
+        $this->assertEquals($constraints, $metadata->getConstraints());
+    }
+
+    public function testWriteMetadataToCache()
+    {
+        $cache = $this->getMock('Symfony\Component\Validator\Mapping\Cache\CacheInterface');
+        $factory = new ClassMetadataFactory(new TestLoader(), $cache);
+
+        $tester = $this;
+        $constraints = array(
+            new ConstraintA(array('groups' => array('Default', 'EntityParent'))),
+        );
+
+        $cache->expects($this->never())
+              ->method('has');
+        $cache->expects($this->once())
+              ->method('read')
+              ->with($this->equalTo(self::PARENTCLASS))
+              ->will($this->returnValue(false));
+        $cache->expects($this->once())
+              ->method('write')
+              ->will($this->returnCallback(function($metadata) use ($tester, $constraints) {
+                  $tester->assertEquals($constraints, $metadata->getConstraints());
+              }));
+
+        $metadata = $factory->getClassMetadata(self::PARENTCLASS);
+
+        $this->assertEquals(self::PARENTCLASS, $metadata->getClassName());
+        $this->assertEquals($constraints, $metadata->getConstraints());
+    }
+
+    public function testReadMetadataFromCache()
+    {
+        $loader = $this->getMock('Symfony\Component\Validator\Mapping\Loader\LoaderInterface');
+        $cache = $this->getMock('Symfony\Component\Validator\Mapping\Cache\CacheInterface');
+        $factory = new ClassMetadataFactory($loader, $cache);
+
+        $tester = $this;
+        $metadata = new ClassMetadata(self::PARENTCLASS);
+        $metadata->addConstraint(new ConstraintA());
+
+        $loader->expects($this->never())
+               ->method('loadClassMetadata');
+
+        $cache->expects($this->never())
+              ->method('has');
+        $cache->expects($this->once())
+              ->method('read')
+              ->will($this->returnValue($metadata));
+
+        $this->assertEquals($metadata,$factory->getClassMetadata(self::PARENTCLASS));
+    }
+}
+
+class TestLoader implements LoaderInterface
+{
+    public function loadClassMetadata(ClassMetadata $metadata)
+    {
+        $metadata->addConstraint(new ConstraintA());
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/ClassMetadataTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/ClassMetadataTest.php
new file mode 100644
index 0000000..a7a0c1e
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/ClassMetadataTest.php
@@ -0,0 +1,225 @@
+<?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\Mapping;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\Constraints\Valid;
+use Symfony\Component\Validator\Mapping\ClassMetadata;
+use Symfony\Component\Validator\Exception\GroupDefinitionException;
+use Symfony\Component\Validator\Tests\Fixtures\Entity;
+use Symfony\Component\Validator\Tests\Fixtures\ConstraintA;
+use Symfony\Component\Validator\Tests\Fixtures\ConstraintB;
+use Symfony\Component\Validator\Tests\Fixtures\PropertyConstraint;
+
+class ClassMetadataTest extends \PHPUnit_Framework_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';
+
+    protected $metadata;
+
+    protected function setUp()
+    {
+        $this->metadata = new ClassMetadata(self::CLASSNAME);
+    }
+
+    protected function tearDown()
+    {
+        $this->metadata = null;
+    }
+
+    public function testAddConstraintDoesNotAcceptValid()
+    {
+        $this->setExpectedException('Symfony\Component\Validator\Exception\ConstraintDefinitionException');
+
+        $this->metadata->addConstraint(new Valid());
+    }
+
+    public function testAddConstraintRequiresClassConstraints()
+    {
+        $this->setExpectedException('Symfony\Component\Validator\Exception\ConstraintDefinitionException');
+
+        $this->metadata->addConstraint(new PropertyConstraint());
+    }
+
+    public function testAddPropertyConstraints()
+    {
+        $this->metadata->addPropertyConstraint('firstName', new ConstraintA());
+        $this->metadata->addPropertyConstraint('lastName', new ConstraintB());
+
+        $this->assertEquals(array('firstName', 'lastName'), $this->metadata->getConstrainedProperties());
+    }
+
+    public function testMergeConstraintsMergesClassConstraints()
+    {
+        $parent = new ClassMetadata(self::PARENTCLASS);
+        $parent->addConstraint(new ConstraintA());
+
+        $this->metadata->mergeConstraints($parent);
+        $this->metadata->addConstraint(new ConstraintA());
+
+        $constraints = array(
+            new ConstraintA(array('groups' => array(
+                'Default',
+                'EntityParent',
+                'Entity',
+            ))),
+            new ConstraintA(array('groups' => array(
+                'Default',
+                'Entity',
+            ))),
+        );
+
+        $this->assertEquals($constraints, $this->metadata->getConstraints());
+    }
+
+    public function testMergeConstraintsMergesMemberConstraints()
+    {
+        $parent = new ClassMetadata(self::PARENTCLASS);
+        $parent->addPropertyConstraint('firstName', new ConstraintA());
+
+        $this->metadata->mergeConstraints($parent);
+        $this->metadata->addPropertyConstraint('firstName', new ConstraintA());
+
+        $constraints = array(
+            new ConstraintA(array('groups' => array(
+                'Default',
+                'EntityParent',
+                'Entity',
+            ))),
+            new ConstraintA(array('groups' => array(
+                'Default',
+                'Entity',
+            ))),
+        );
+
+        $members = $this->metadata->getMemberMetadatas('firstName');
+
+        $this->assertCount(1, $members);
+        $this->assertEquals(self::PARENTCLASS, $members[0]->getClassName());
+        $this->assertEquals($constraints, $members[0]->getConstraints());
+    }
+
+    public function testMemberMetadatas()
+    {
+        $this->metadata->addPropertyConstraint('firstName', new ConstraintA());
+
+        $this->assertTrue($this->metadata->hasMemberMetadatas('firstName'));
+        $this->assertFalse($this->metadata->hasMemberMetadatas('non_existant_field'));
+    }
+
+    public function testMergeConstraintsKeepsPrivateMembersSeparate()
+    {
+        $parent = new ClassMetadata(self::PARENTCLASS);
+        $parent->addPropertyConstraint('internal', new ConstraintA());
+
+        $this->metadata->mergeConstraints($parent);
+        $this->metadata->addPropertyConstraint('internal', new ConstraintA());
+
+        $parentConstraints = array(
+            new ConstraintA(array('groups' => array(
+                'Default',
+                'EntityParent',
+                'Entity',
+            ))),
+        );
+        $constraints = array(
+            new ConstraintA(array('groups' => array(
+                'Default',
+                'Entity',
+            ))),
+        );
+
+        $members = $this->metadata->getMemberMetadatas('internal');
+
+        $this->assertCount(2, $members);
+        $this->assertEquals(self::PARENTCLASS, $members[0]->getClassName());
+        $this->assertEquals($parentConstraints, $members[0]->getConstraints());
+        $this->assertEquals(self::CLASSNAME, $members[1]->getClassName());
+        $this->assertEquals($constraints, $members[1]->getConstraints());
+    }
+
+    public function testGetReflectionClass()
+    {
+        $reflClass = new \ReflectionClass(self::CLASSNAME);
+
+        $this->assertEquals($reflClass, $this->metadata->getReflectionClass());
+    }
+
+    public function testSerialize()
+    {
+        $this->metadata->addConstraint(new ConstraintA(array('property1' => 'A')));
+        $this->metadata->addConstraint(new ConstraintB(array('groups' => 'TestGroup')));
+        $this->metadata->addPropertyConstraint('firstName', new ConstraintA());
+        $this->metadata->addGetterConstraint('lastName', new ConstraintB());
+
+        $metadata = unserialize(serialize($this->metadata));
+
+        $this->assertEquals($this->metadata, $metadata);
+    }
+
+    public function testGroupSequencesWorkIfContainingDefaultGroup()
+    {
+        $this->metadata->setGroupSequence(array('Foo', $this->metadata->getDefaultGroup()));
+    }
+
+    public function testGroupSequencesFailIfNotContainingDefaultGroup()
+    {
+        $this->setExpectedException('Symfony\Component\Validator\Exception\GroupDefinitionException');
+
+        $this->metadata->setGroupSequence(array('Foo', 'Bar'));
+    }
+
+    public function testGroupSequencesFailIfContainingDefault()
+    {
+        $this->setExpectedException('Symfony\Component\Validator\Exception\GroupDefinitionException');
+
+        $this->metadata->setGroupSequence(array('Foo', $this->metadata->getDefaultGroup(), Constraint::DEFAULT_GROUP));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\GroupDefinitionException
+     */
+    public function testGroupSequenceFailsIfGroupSequenceProviderIsSet()
+    {
+        $metadata = new ClassMetadata(self::PROVIDERCLASS);
+        $metadata->setGroupSequenceProvider(true);
+        $metadata->setGroupSequence(array('GroupSequenceProviderEntity', 'Foo'));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\GroupDefinitionException
+     */
+    public function testGroupSequenceProviderFailsIfGroupSequenceIsSet()
+    {
+        $metadata = new ClassMetadata(self::PROVIDERCLASS);
+        $metadata->setGroupSequence(array('GroupSequenceProviderEntity', 'Foo'));
+        $metadata->setGroupSequenceProvider(true);
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\GroupDefinitionException
+     */
+    public function testGroupSequenceProviderFailsIfDomainClassIsInvalid()
+    {
+        $metadata = new ClassMetadata('stdClass');
+        $metadata->setGroupSequenceProvider(true);
+    }
+
+    public function testGroupSequenceProvider()
+    {
+        $metadata = new ClassMetadata(self::PROVIDERCLASS);
+        $metadata->setGroupSequenceProvider(true);
+        $this->assertTrue($metadata->isGroupSequenceProvider());
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/ElementMetadataTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/ElementMetadataTest.php
new file mode 100644
index 0000000..eb01d11
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/ElementMetadataTest.php
@@ -0,0 +1,73 @@
+<?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\Mapping;
+
+use Symfony\Component\Validator\Tests\Fixtures\ConstraintA;
+use Symfony\Component\Validator\Tests\Fixtures\ConstraintB;
+use Symfony\Component\Validator\Mapping\ElementMetadata;
+
+class ElementMetadataTest extends \PHPUnit_Framework_TestCase
+{
+    protected $metadata;
+
+    protected function setUp()
+    {
+        $this->metadata = new TestElementMetadata('Symfony\Component\Validator\Tests\Fixtures\Entity');
+    }
+
+    protected function tearDown()
+    {
+        $this->metadata = null;
+    }
+
+    public function testAddConstraints()
+    {
+        $this->metadata->addConstraint($constraint1 = new ConstraintA());
+        $this->metadata->addConstraint($constraint2 = new ConstraintA());
+
+        $this->assertEquals(array($constraint1, $constraint2), $this->metadata->getConstraints());
+    }
+
+    public function testMultipleConstraintsOfTheSameType()
+    {
+        $constraint1 = new ConstraintA(array('property1' => 'A'));
+        $constraint2 = new ConstraintA(array('property1' => 'B'));
+
+        $this->metadata->addConstraint($constraint1);
+        $this->metadata->addConstraint($constraint2);
+
+        $this->assertEquals(array($constraint1, $constraint2), $this->metadata->getConstraints());
+    }
+
+    public function testFindConstraintsByGroup()
+    {
+        $constraint1 = new ConstraintA(array('groups' => 'TestGroup'));
+        $constraint2 = new ConstraintB();
+
+        $this->metadata->addConstraint($constraint1);
+        $this->metadata->addConstraint($constraint2);
+
+        $this->assertEquals(array($constraint1), $this->metadata->findConstraints('TestGroup'));
+    }
+
+    public function testSerialize()
+    {
+        $this->metadata->addConstraint(new ConstraintA(array('property1' => 'A')));
+        $this->metadata->addConstraint(new ConstraintB(array('groups' => 'TestGroup')));
+
+        $metadata = unserialize(serialize($this->metadata));
+
+        $this->assertEquals($this->metadata, $metadata);
+    }
+}
+
+class TestElementMetadata extends ElementMetadata {}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/GetterMetadataTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/GetterMetadataTest.php
new file mode 100644
index 0000000..99303e9
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/GetterMetadataTest.php
@@ -0,0 +1,38 @@
+<?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\Mapping;
+
+use Symfony\Component\Validator\Mapping\GetterMetadata;
+use Symfony\Component\Validator\Tests\Fixtures\Entity;
+
+class GetterMetadataTest extends \PHPUnit_Framework_TestCase
+{
+    const CLASSNAME = 'Symfony\Component\Validator\Tests\Fixtures\Entity';
+
+    public function testInvalidPropertyName()
+    {
+        $this->setExpectedException('Symfony\Component\Validator\Exception\ValidatorException');
+
+        new GetterMetadata(self::CLASSNAME, 'foobar');
+    }
+
+    public function testGetValueFromPublicGetter()
+    {
+        // private getters don't work yet because ReflectionMethod::setAccessible()
+        // does not exists yet in a stable PHP release
+
+        $entity = new Entity('foobar');
+        $metadata = new GetterMetadata(self::CLASSNAME, 'internal');
+
+        $this->assertEquals('foobar from getter', $metadata->getValue($entity));
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/AnnotationLoaderTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/AnnotationLoaderTest.php
new file mode 100644
index 0000000..ce444ac
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/AnnotationLoaderTest.php
@@ -0,0 +1,157 @@
+<?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\Mapping\Loader;
+
+use Doctrine\Common\Annotations\AnnotationReader;
+use Symfony\Component\Validator\Constraints\All;
+use Symfony\Component\Validator\Constraints\Collection;
+use Symfony\Component\Validator\Constraints\NotNull;
+use Symfony\Component\Validator\Constraints\Min;
+use Symfony\Component\Validator\Constraints\Choice;
+use Symfony\Component\Validator\Mapping\ClassMetadata;
+use Symfony\Component\Validator\Mapping\Loader\AnnotationLoader;
+use Symfony\Component\Validator\Tests\Fixtures\ConstraintA;
+
+class AnnotationLoaderTest extends \PHPUnit_Framework_TestCase
+{
+    protected function setUp()
+    {
+        if (!class_exists('Doctrine\Common\Annotations\AnnotationReader')) {
+            $this->markTestSkipped('The "Doctrine Common" library is not available');
+        }
+    }
+
+    public function testLoadClassMetadataReturnsTrueIfSuccessful()
+    {
+        $reader = new AnnotationReader();
+        $loader = new AnnotationLoader($reader);
+        $metadata = new ClassMetadata('Symfony\Component\Validator\Tests\Fixtures\Entity');
+
+        $this->assertTrue($loader->loadClassMetadata($metadata));
+    }
+
+    public function testLoadClassMetadataReturnsFalseIfNotSuccessful()
+    {
+        $loader = new AnnotationLoader(new AnnotationReader());
+        $metadata = new ClassMetadata('\stdClass');
+
+        $this->assertFalse($loader->loadClassMetadata($metadata));
+    }
+
+    public function testLoadClassMetadata()
+    {
+        $loader = new AnnotationLoader(new AnnotationReader());
+        $metadata = new ClassMetadata('Symfony\Component\Validator\Tests\Fixtures\Entity');
+
+        $loader->loadClassMetadata($metadata);
+
+        $expected = new ClassMetadata('Symfony\Component\Validator\Tests\Fixtures\Entity');
+        $expected->setGroupSequence(array('Foo', 'Entity'));
+        $expected->addConstraint(new ConstraintA());
+        $expected->addPropertyConstraint('firstName', new NotNull());
+        $expected->addPropertyConstraint('firstName', new Min(3));
+        $expected->addPropertyConstraint('firstName', new All(array(new NotNull(), new Min(3))));
+        $expected->addPropertyConstraint('firstName', new All(array('constraints' => array(new NotNull(), new Min(3)))));
+        $expected->addPropertyConstraint('firstName', new Collection(array('fields' => array(
+            'foo' => array(new NotNull(), new Min(3)),
+            'bar' => new Min(5),
+        ))));
+        $expected->addPropertyConstraint('firstName', new Choice(array(
+            'message' => 'Must be one of %choices%',
+            'choices' => array('A', 'B'),
+        )));
+        $expected->addGetterConstraint('lastName', new NotNull());
+
+        // load reflection class so that the comparison passes
+        $expected->getReflectionClass();
+
+        $this->assertEquals($expected, $metadata);
+    }
+
+    /**
+     * Test MetaData merge with parent annotation.
+     */
+    public function testLoadParentClassMetadata()
+    {
+        $loader = new AnnotationLoader(new AnnotationReader());
+
+        // Load Parent MetaData
+        $parent_metadata = new ClassMetadata('Symfony\Component\Validator\Tests\Fixtures\EntityParent');
+        $loader->loadClassMetadata($parent_metadata);
+
+        $expected_parent = new ClassMetadata('Symfony\Component\Validator\Tests\Fixtures\EntityParent');
+        $expected_parent->addPropertyConstraint('other', new NotNull());
+        $expected_parent->getReflectionClass();
+
+        $this->assertEquals($expected_parent, $parent_metadata);
+    }
+    /**
+     * Test MetaData merge with parent annotation.
+     */
+    public function testLoadClassMetadataAndMerge()
+    {
+        $loader = new AnnotationLoader(new AnnotationReader());
+
+        // Load Parent MetaData
+        $parent_metadata = new ClassMetadata('Symfony\Component\Validator\Tests\Fixtures\EntityParent');
+        $loader->loadClassMetadata($parent_metadata);
+
+        $metadata = new ClassMetadata('Symfony\Component\Validator\Tests\Fixtures\Entity');
+
+        // Merge parent metaData.
+        $metadata->mergeConstraints($parent_metadata);
+
+        $loader->loadClassMetadata($metadata);
+
+        $expected_parent = new ClassMetadata('Symfony\Component\Validator\Tests\Fixtures\EntityParent');
+        $expected_parent->addPropertyConstraint('other', new NotNull());
+        $expected_parent->getReflectionClass();
+
+        $expected = new ClassMetadata('Symfony\Component\Validator\Tests\Fixtures\Entity');
+        $expected->mergeConstraints($expected_parent);
+
+        $expected->setGroupSequence(array('Foo', 'Entity'));
+        $expected->addConstraint(new ConstraintA());
+        $expected->addPropertyConstraint('firstName', new NotNull());
+        $expected->addPropertyConstraint('firstName', new Min(3));
+        $expected->addPropertyConstraint('firstName', new All(array(new NotNull(), new Min(3))));
+        $expected->addPropertyConstraint('firstName', new All(array('constraints' => array(new NotNull(), new Min(3)))));
+        $expected->addPropertyConstraint('firstName', new Collection(array('fields' => array(
+            'foo' => array(new NotNull(), new Min(3)),
+            'bar' => new Min(5),
+        ))));
+        $expected->addPropertyConstraint('firstName', new Choice(array(
+            'message' => 'Must be one of %choices%',
+            'choices' => array('A', 'B'),
+        )));
+        $expected->addGetterConstraint('lastName', new NotNull());
+
+        // load reflection class so that the comparison passes
+        $expected->getReflectionClass();
+
+        $this->assertEquals($expected, $metadata);
+    }
+
+    public function testLoadGroupSequenceProviderAnnotation()
+    {
+        $loader = new AnnotationLoader(new AnnotationReader());
+
+        $metadata = new ClassMetadata('Symfony\Component\Validator\Tests\Fixtures\GroupSequenceProviderEntity');
+        $loader->loadClassMetadata($metadata);
+
+        $expected = new ClassMetadata('Symfony\Component\Validator\Tests\Fixtures\GroupSequenceProviderEntity');
+        $expected->setGroupSequenceProvider(true);
+        $expected->getReflectionClass();
+
+        $this->assertEquals($expected, $metadata);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/FilesLoaderTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/FilesLoaderTest.php
new file mode 100644
index 0000000..301ef0e
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/FilesLoaderTest.php
@@ -0,0 +1,48 @@
+<?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\Mapping\Loader;
+
+use Symfony\Component\Validator\Mapping\Loader\LoaderInterface;
+use Symfony\Component\Validator\Mapping\ClassMetadata;
+
+class FilesLoaderTest extends \PHPUnit_Framework_TestCase
+{
+    public function testCallsGetFileLoaderInstanceForeachPath()
+    {
+        $loader = $this->getFilesLoader($this->getFileLoader());
+        $this->assertEquals(4, $loader->getTimesCalled());
+    }
+
+    public function testCallsActualFileLoaderForMetadata()
+    {
+        $fileLoader = $this->getFileLoader();
+        $fileLoader->expects($this->exactly(4))
+            ->method('loadClassMetadata');
+        $loader = $this->getFilesLoader($fileLoader);
+        $loader->loadClassMetadata(new ClassMetadata('Symfony\Component\Validator\Tests\Fixtures\Entity'));
+    }
+
+    public function getFilesLoader(LoaderInterface $loader)
+    {
+        return $this->getMockForAbstractClass('Symfony\Component\Validator\Tests\Fixtures\FilesLoader', array(array(
+            __DIR__ . '/constraint-mapping.xml',
+            __DIR__ . '/constraint-mapping.yaml',
+            __DIR__ . '/constraint-mapping.test',
+            __DIR__ . '/constraint-mapping.txt',
+        ), $loader));
+    }
+
+    public function getFileLoader()
+    {
+        return $this->getMock('Symfony\Component\Validator\Mapping\Loader\LoaderInterface');
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/LoaderChainTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/LoaderChainTest.php
new file mode 100644
index 0000000..647a568
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/LoaderChainTest.php
@@ -0,0 +1,84 @@
+<?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\Mapping\Loader;
+
+use Symfony\Component\Validator\Mapping\ClassMetadata;
+use Symfony\Component\Validator\Mapping\Loader\LoaderChain;
+
+class LoaderChainTest extends \PHPUnit_Framework_TestCase
+{
+    public function testAllLoadersAreCalled()
+    {
+        $metadata = new ClassMetadata('\stdClass');
+
+        $loader1 = $this->getMock('Symfony\Component\Validator\Mapping\Loader\LoaderInterface');
+        $loader1->expects($this->once())
+                        ->method('loadClassMetadata')
+                        ->with($this->equalTo($metadata));
+
+        $loader2 = $this->getMock('Symfony\Component\Validator\Mapping\Loader\LoaderInterface');
+        $loader2->expects($this->once())
+                        ->method('loadClassMetadata')
+                        ->with($this->equalTo($metadata));
+
+        $chain = new LoaderChain(array(
+            $loader1,
+            $loader2,
+        ));
+
+        $chain->loadClassMetadata($metadata);
+    }
+
+    public function testReturnsTrueIfAnyLoaderReturnedTrue()
+    {
+        $metadata = new ClassMetadata('\stdClass');
+
+        $loader1 = $this->getMock('Symfony\Component\Validator\Mapping\Loader\LoaderInterface');
+        $loader1->expects($this->any())
+                        ->method('loadClassMetadata')
+                        ->will($this->returnValue(true));
+
+        $loader2 = $this->getMock('Symfony\Component\Validator\Mapping\Loader\LoaderInterface');
+        $loader2->expects($this->any())
+                        ->method('loadClassMetadata')
+                        ->will($this->returnValue(false));
+
+        $chain = new LoaderChain(array(
+            $loader1,
+            $loader2,
+        ));
+
+        $this->assertTrue($chain->loadClassMetadata($metadata));
+    }
+
+    public function testReturnsFalseIfNoLoaderReturnedTrue()
+    {
+        $metadata = new ClassMetadata('\stdClass');
+
+        $loader1 = $this->getMock('Symfony\Component\Validator\Mapping\Loader\LoaderInterface');
+        $loader1->expects($this->any())
+                        ->method('loadClassMetadata')
+                        ->will($this->returnValue(false));
+
+        $loader2 = $this->getMock('Symfony\Component\Validator\Mapping\Loader\LoaderInterface');
+        $loader2->expects($this->any())
+                        ->method('loadClassMetadata')
+                        ->will($this->returnValue(false));
+
+        $chain = new LoaderChain(array(
+            $loader1,
+            $loader2,
+        ));
+
+        $this->assertFalse($chain->loadClassMetadata($metadata));
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/StaticMethodLoaderTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/StaticMethodLoaderTest.php
new file mode 100644
index 0000000..4fc18c1
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/StaticMethodLoaderTest.php
@@ -0,0 +1,95 @@
+<?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\Mapping\Loader;
+
+use Symfony\Component\Validator\Mapping\ClassMetadata;
+use Symfony\Component\Validator\Mapping\Loader\StaticMethodLoader;
+use Symfony\Component\Validator\Tests\Fixtures\ConstraintA;
+
+class StaticMethodLoaderTest extends \PHPUnit_Framework_TestCase
+{
+    public function testLoadClassMetadataReturnsTrueIfSuccessful()
+    {
+        $loader = new StaticMethodLoader('loadMetadata');
+        $metadata = new ClassMetadata(__NAMESPACE__.'\StaticLoaderEntity');
+
+        $this->assertTrue($loader->loadClassMetadata($metadata));
+    }
+
+    public function testLoadClassMetadataReturnsFalseIfNotSuccessful()
+    {
+        $loader = new StaticMethodLoader('loadMetadata');
+        $metadata = new ClassMetadata('\stdClass');
+
+        $this->assertFalse($loader->loadClassMetadata($metadata));
+    }
+
+    public function testLoadClassMetadata()
+    {
+        $loader = new StaticMethodLoader('loadMetadata');
+        $metadata = new ClassMetadata(__NAMESPACE__.'\StaticLoaderEntity');
+
+        $loader->loadClassMetadata($metadata);
+
+        $this->assertEquals(StaticLoaderEntity::$invokedWith, $metadata);
+    }
+
+    public function testLoadClassMetadataDoesNotRepeatLoadWithParentClasses()
+    {
+        $loader = new StaticMethodLoader('loadMetadata');
+        $metadata = new ClassMetadata(__NAMESPACE__.'\StaticLoaderDocument');
+        $loader->loadClassMetadata($metadata);
+        $this->assertSame(0, count($metadata->getConstraints()));
+
+        $loader = new StaticMethodLoader('loadMetadata');
+        $metadata = new ClassMetadata(__NAMESPACE__.'\BaseStaticLoaderDocument');
+        $loader->loadClassMetadata($metadata);
+        $this->assertSame(1, count($metadata->getConstraints()));
+    }
+
+    public function testLoadClassMetadataIgnoresInterfaces()
+    {
+        $loader = new StaticMethodLoader('loadMetadata');
+        $metadata = new ClassMetadata(__NAMESPACE__.'\StaticLoaderInterface');
+
+        $loader->loadClassMetadata($metadata);
+
+        $this->assertSame(0, count($metadata->getConstraints()));
+    }
+}
+
+interface StaticLoaderInterface
+{
+    public static function loadMetadata(ClassMetadata $metadata);
+}
+
+class StaticLoaderEntity
+{
+    public static $invokedWith = null;
+
+    public static function loadMetadata(ClassMetadata $metadata)
+    {
+        self::$invokedWith = $metadata;
+    }
+}
+
+class StaticLoaderDocument extends BaseStaticLoaderDocument
+{
+}
+
+class BaseStaticLoaderDocument
+{
+    public static function loadMetadata(ClassMetadata $metadata)
+    {
+        $metadata->addConstraint(new ConstraintA());
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/XmlFileLoaderTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/XmlFileLoaderTest.php
new file mode 100644
index 0000000..428fe6b
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/XmlFileLoaderTest.php
@@ -0,0 +1,95 @@
+<?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\Mapping\Loader;
+
+use Symfony\Component\Validator\Constraints\All;
+use Symfony\Component\Validator\Constraints\Collection;
+use Symfony\Component\Validator\Constraints\NotNull;
+use Symfony\Component\Validator\Constraints\Min;
+use Symfony\Component\Validator\Constraints\Choice;
+use Symfony\Component\Validator\Mapping\ClassMetadata;
+use Symfony\Component\Validator\Mapping\Loader\XmlFileLoader;
+use Symfony\Component\Validator\Tests\Fixtures\ConstraintA;
+use Symfony\Component\Validator\Tests\Fixtures\ConstraintB;
+
+class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase
+{
+    public function testLoadClassMetadataReturnsTrueIfSuccessful()
+    {
+        $loader = new XmlFileLoader(__DIR__.'/constraint-mapping.xml');
+        $metadata = new ClassMetadata('Symfony\Component\Validator\Tests\Fixtures\Entity');
+
+        $this->assertTrue($loader->loadClassMetadata($metadata));
+    }
+
+    public function testLoadClassMetadataReturnsFalseIfNotSuccessful()
+    {
+        $loader = new XmlFileLoader(__DIR__.'/constraint-mapping.xml');
+        $metadata = new ClassMetadata('\stdClass');
+
+        $this->assertFalse($loader->loadClassMetadata($metadata));
+    }
+
+    public function testLoadClassMetadata()
+    {
+        $loader = new XmlFileLoader(__DIR__.'/constraint-mapping.xml');
+        $metadata = new ClassMetadata('Symfony\Component\Validator\Tests\Fixtures\Entity');
+
+        $loader->loadClassMetadata($metadata);
+
+        $expected = new ClassMetadata('Symfony\Component\Validator\Tests\Fixtures\Entity');
+        $expected->setGroupSequence(array('Foo', 'Entity'));
+        $expected->addConstraint(new ConstraintA());
+        $expected->addConstraint(new ConstraintB());
+        $expected->addPropertyConstraint('firstName', new NotNull());
+        $expected->addPropertyConstraint('firstName', new Min(3));
+        $expected->addPropertyConstraint('firstName', new Choice(array('A', 'B')));
+        $expected->addPropertyConstraint('firstName', new All(array(new NotNull(), new Min(3))));
+        $expected->addPropertyConstraint('firstName', new All(array('constraints' => array(new NotNull(), new Min(3)))));
+        $expected->addPropertyConstraint('firstName', new Collection(array('fields' => array(
+            'foo' => array(new NotNull(), new Min(3)),
+            'bar' => array(new Min(5)),
+        ))));
+        $expected->addPropertyConstraint('firstName', new Choice(array(
+            'message' => 'Must be one of %choices%',
+            'choices' => array('A', 'B'),
+        )));
+        $expected->addGetterConstraint('lastName', new NotNull());
+
+        $this->assertEquals($expected, $metadata);
+    }
+
+    public function testLoadGroupSequenceProvider()
+    {
+        $loader = new XmlFileLoader(__DIR__.'/constraint-mapping.xml');
+        $metadata = new ClassMetadata('Symfony\Component\Validator\Tests\Fixtures\GroupSequenceProviderEntity');
+
+        $loader->loadClassMetadata($metadata);
+
+        $expected = new ClassMetadata('Symfony\Component\Validator\Tests\Fixtures\GroupSequenceProviderEntity');
+        $expected->setGroupSequenceProvider(true);
+
+        $this->assertEquals($expected, $metadata);
+    }
+
+    /**
+     * @expectedException        Symfony\Component\Validator\Exception\MappingException
+     * @expectedExceptionMessage Document types are not allowed.
+     */
+    public function testDocTypeIsNotAllowed()
+    {
+        $loader = new XmlFileLoader(__DIR__.'/withdoctype.xml');
+        $metadata = new ClassMetadata('Symfony\Component\Validator\Tests\Fixtures\Entity');
+
+        $loader->loadClassMetadata($metadata);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/YamlFileLoaderTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/YamlFileLoaderTest.php
new file mode 100644
index 0000000..a175817
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/YamlFileLoaderTest.php
@@ -0,0 +1,108 @@
+<?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\Mapping\Loader;
+
+use Symfony\Component\Validator\Constraints\All;
+use Symfony\Component\Validator\Constraints\Collection;
+use Symfony\Component\Validator\Constraints\NotNull;
+use Symfony\Component\Validator\Constraints\Min;
+use Symfony\Component\Validator\Constraints\Choice;
+use Symfony\Component\Validator\Mapping\ClassMetadata;
+use Symfony\Component\Validator\Mapping\Loader\YamlFileLoader;
+use Symfony\Component\Validator\Tests\Fixtures\ConstraintA;
+use Symfony\Component\Validator\Tests\Fixtures\ConstraintB;
+
+class YamlFileLoaderTest extends \PHPUnit_Framework_TestCase
+{
+    protected function setUp()
+    {
+        if (!class_exists('Symfony\Component\Yaml\Yaml')) {
+            $this->markTestSkipped('The "Yaml" component is not available');
+        }
+    }
+
+    public function testLoadClassMetadataReturnsFalseIfEmpty()
+    {
+        $loader = new YamlFileLoader(__DIR__.'/empty-mapping.yml');
+        $metadata = new ClassMetadata('Symfony\Component\Validator\Tests\Fixtures\Entity');
+
+        $this->assertFalse($loader->loadClassMetadata($metadata));
+    }
+
+    /**
+     * @expectedException \InvalidArgumentException
+     */
+    public function testLoadClassMetadataThrowsExceptionIfNotAnArray()
+    {
+        $loader = new YamlFileLoader(__DIR__.'/nonvalid-mapping.yml');
+        $metadata = new ClassMetadata('Symfony\Component\Validator\Tests\Fixtures\Entity');
+        $loader->loadClassMetadata($metadata);
+    }
+
+    public function testLoadClassMetadataReturnsTrueIfSuccessful()
+    {
+        $loader = new YamlFileLoader(__DIR__.'/constraint-mapping.yml');
+        $metadata = new ClassMetadata('Symfony\Component\Validator\Tests\Fixtures\Entity');
+
+        $this->assertTrue($loader->loadClassMetadata($metadata));
+    }
+
+    public function testLoadClassMetadataReturnsFalseIfNotSuccessful()
+    {
+        $loader = new YamlFileLoader(__DIR__.'/constraint-mapping.yml');
+        $metadata = new ClassMetadata('\stdClass');
+
+        $this->assertFalse($loader->loadClassMetadata($metadata));
+    }
+
+    public function testLoadClassMetadata()
+    {
+        $loader = new YamlFileLoader(__DIR__.'/constraint-mapping.yml');
+        $metadata = new ClassMetadata('Symfony\Component\Validator\Tests\Fixtures\Entity');
+
+        $loader->loadClassMetadata($metadata);
+
+        $expected = new ClassMetadata('Symfony\Component\Validator\Tests\Fixtures\Entity');
+        $expected->setGroupSequence(array('Foo', 'Entity'));
+        $expected->addConstraint(new ConstraintA());
+        $expected->addConstraint(new ConstraintB());
+        $expected->addPropertyConstraint('firstName', new NotNull());
+        $expected->addPropertyConstraint('firstName', new Min(3));
+        $expected->addPropertyConstraint('firstName', new Choice(array('A', 'B')));
+        $expected->addPropertyConstraint('firstName', new All(array(new NotNull(), new Min(3))));
+        $expected->addPropertyConstraint('firstName', new All(array('constraints' => array(new NotNull(), new Min(3)))));
+        $expected->addPropertyConstraint('firstName', new Collection(array('fields' => array(
+            'foo' => array(new NotNull(), new Min(3)),
+            'bar' => array(new Min(5)),
+        ))));
+        $expected->addPropertyConstraint('firstName', new Choice(array(
+            'message' => 'Must be one of %choices%',
+            'choices' => array('A', 'B'),
+        )));
+        $expected->addGetterConstraint('lastName', new NotNull());
+
+        $this->assertEquals($expected, $metadata);
+    }
+
+    public function testLoadGroupSequenceProvider()
+    {
+        $loader = new YamlFileLoader(__DIR__.'/constraint-mapping.yml');
+        $metadata = new ClassMetadata('Symfony\Component\Validator\Tests\Fixtures\GroupSequenceProviderEntity');
+
+        $loader->loadClassMetadata($metadata);
+
+        $expected = new ClassMetadata('Symfony\Component\Validator\Tests\Fixtures\GroupSequenceProviderEntity');
+        $expected->setGroupSequenceProvider(true);
+
+        $this->assertEquals($expected, $metadata);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/constraint-mapping.xml b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/constraint-mapping.xml
new file mode 100644
index 0000000..e815dce
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/constraint-mapping.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" ?>
+
+<constraint-mapping xmlns="http://symfony.com/schema/dic/constraint-mapping"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/constraint-mapping http://symfony.com/schema/dic/services/constraint-mapping-1.0.xsd">
+
+  <namespace prefix="custom">Symfony\Component\Validator\Tests\Fixtures\</namespace>
+
+  <class name="Symfony\Component\Validator\Tests\Fixtures\Entity">
+
+    <group-sequence>
+       <value>Foo</value>
+       <value>Entity</value>
+    </group-sequence>
+
+    <!-- CLASS CONSTRAINTS -->
+
+    <!-- Custom constraint -->
+    <constraint name="Symfony\Component\Validator\Tests\Fixtures\ConstraintA" />
+
+    <!-- Custom constraint with namespace abbreviation-->
+    <constraint name="custom:ConstraintB" />
+
+    <!-- PROPERTY CONSTRAINTS -->
+
+    <property name="firstName">
+
+      <!-- Constraint without value -->
+      <constraint name="NotNull" />
+
+      <!-- Constraint with single value -->
+      <constraint name="Min">3</constraint>
+
+      <!-- Constraint with multiple values -->
+      <constraint name="Choice">
+        <value>A</value>
+        <value>B</value>
+      </constraint>
+
+      <!-- Constraint with child constraints -->
+      <constraint name="All">
+        <constraint name="NotNull" />
+        <constraint name="Min">3</constraint>
+      </constraint>
+
+      <!-- Option with child constraints -->
+      <constraint name="All">
+        <option name="constraints">
+          <constraint name="NotNull" />
+          <constraint name="Min">3</constraint>
+        </option>
+      </constraint>
+
+      <!-- Value with child constraints -->
+      <constraint name="Collection">
+        <option name="fields">
+          <value key="foo">
+            <constraint name="NotNull" />
+            <constraint name="Min">3</constraint>
+          </value>
+          <value key="bar">
+            <constraint name="Min">5</constraint>
+          </value>
+        </option>
+      </constraint>
+
+      <!-- Constraint with options -->
+      <constraint name="Choice">
+        <!-- Option with single value -->
+        <option name="message">Must be one of %choices%</option>
+        <!-- Option with multiple values -->
+        <option name="choices">
+          <value>A</value>
+          <value>B</value>
+        </option>
+      </constraint>
+    </property>
+
+    <!-- GETTER CONSTRAINTS -->
+
+    <getter property="lastName">
+      <constraint name="NotNull" />
+    </getter>
+  </class>
+
+  <class name="Symfony\Component\Validator\Tests\Fixtures\GroupSequenceProviderEntity">
+
+    <!-- GROUP SEQUENCE PROVIDER -->
+    <group-sequence-provider />
+
+  </class>
+</constraint-mapping>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/constraint-mapping.yml b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/constraint-mapping.yml
new file mode 100644
index 0000000..b910c88
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/constraint-mapping.yml
@@ -0,0 +1,49 @@
+namespaces:
+  custom: Symfony\Component\Validator\Tests\Fixtures\
+
+Symfony\Component\Validator\Tests\Fixtures\Entity:
+  group_sequence:
+    - Foo
+    - Entity
+
+  constraints:
+    # Custom constraint
+    - Symfony\Component\Validator\Tests\Fixtures\ConstraintA: ~
+    # Custom constraint with namespaces prefix
+    - "custom:ConstraintB": ~
+
+  properties:
+    firstName:
+      # Constraint without value
+      - NotNull: ~
+      # Constraint with single value
+      - Min: 3
+      # Constraint with multiple values
+      - Choice: [A, B]
+      # Constraint with child constraints
+      - All:
+          - NotNull: ~
+          - Min: 3
+      # Option with child constraints
+      - All:
+          constraints:
+            - NotNull: ~
+            - Min: 3
+      # Value with child constraints
+      - Collection:
+          fields:
+            foo:
+              - NotNull: ~
+              - Min: 3
+            bar:
+              - Min: 5
+      # Constraint with options
+      - Choice: { choices: [A, B], message: Must be one of %choices% }
+    dummy:
+
+  getters:
+    lastName:
+      - NotNull: ~
+
+Symfony\Component\Validator\Tests\Fixtures\GroupSequenceProviderEntity:
+  group_sequence_provider: true
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/empty-mapping.yml b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/empty-mapping.yml
new file mode 100644
index 0000000..e69de29
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/nonvalid-mapping.yml b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/nonvalid-mapping.yml
new file mode 100644
index 0000000..257cc56
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/nonvalid-mapping.yml
@@ -0,0 +1 @@
+foo
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/withdoctype.xml b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/withdoctype.xml
new file mode 100644
index 0000000..557cccb
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/Loader/withdoctype.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<!DOCTYPE foo>
+<constraint-mapping xmlns="http://symfony.com/schema/dic/constraint-mapping"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/dic/constraint-mapping http://symfony.com/schema/dic/services/constraint-mapping-1.0.xsd">
+  <class name="Symfony\Tests\Component\Validator\Fixtures\Entity" />
+</constraint-mapping>
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/MemberMetadataTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/MemberMetadataTest.php
new file mode 100644
index 0000000..747a36b
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/MemberMetadataTest.php
@@ -0,0 +1,83 @@
+<?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\Mapping;
+
+use Symfony\Component\Validator\Tests\Fixtures\ConstraintA;
+use Symfony\Component\Validator\Tests\Fixtures\ConstraintB;
+use Symfony\Component\Validator\Tests\Fixtures\ClassConstraint;
+use Symfony\Component\Validator\Constraints\Valid;
+use Symfony\Component\Validator\Mapping\MemberMetadata;
+
+class MemberMetadataTest extends \PHPUnit_Framework_TestCase
+{
+    protected $metadata;
+
+    protected function setUp()
+    {
+        $this->metadata = new TestMemberMetadata(
+            'Symfony\Component\Validator\Tests\Fixtures\Entity',
+            'getLastName',
+            'lastName'
+        );
+    }
+
+    protected function tearDown()
+    {
+        $this->metadata = null;
+    }
+
+    public function testAddValidSetsMemberToCascaded()
+    {
+        $result = $this->metadata->addConstraint(new Valid());
+
+        $this->assertEquals(array(), $this->metadata->getConstraints());
+        $this->assertEquals($result, $this->metadata);
+        $this->assertTrue($this->metadata->isCascaded());
+    }
+
+    public function testAddOtherConstraintDoesNotSetMemberToCascaded()
+    {
+        $result = $this->metadata->addConstraint($constraint = new ConstraintA());
+
+        $this->assertEquals(array($constraint), $this->metadata->getConstraints());
+        $this->assertEquals($result, $this->metadata);
+        $this->assertFalse($this->metadata->isCascaded());
+    }
+
+    public function testAddConstraintRequiresClassConstraints()
+    {
+        $this->setExpectedException('Symfony\Component\Validator\Exception\ConstraintDefinitionException');
+
+        $this->metadata->addConstraint(new ClassConstraint());
+    }
+
+    public function testSerialize()
+    {
+        $this->metadata->addConstraint(new ConstraintA(array('property1' => 'A')));
+        $this->metadata->addConstraint(new ConstraintB(array('groups' => 'TestGroup')));
+
+        $metadata = unserialize(serialize($this->metadata));
+
+        $this->assertEquals($this->metadata, $metadata);
+    }
+}
+
+class TestMemberMetadata extends MemberMetadata
+{
+    public function getPropertyValue($object)
+    {
+    }
+
+    protected function newReflectionMember()
+    {
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/PropertyMetadataTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/PropertyMetadataTest.php
new file mode 100644
index 0000000..0dc1bb6
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/Mapping/PropertyMetadataTest.php
@@ -0,0 +1,35 @@
+<?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\Mapping;
+
+use Symfony\Component\Validator\Mapping\PropertyMetadata;
+use Symfony\Component\Validator\Tests\Fixtures\Entity;
+
+class PropertyMetadataTest extends \PHPUnit_Framework_TestCase
+{
+    const CLASSNAME = 'Symfony\Component\Validator\Tests\Fixtures\Entity';
+
+    public function testInvalidPropertyName()
+    {
+        $this->setExpectedException('Symfony\Component\Validator\Exception\ValidatorException');
+
+        new PropertyMetadata(self::CLASSNAME, 'foobar');
+    }
+
+    public function testGetValueFromPrivateProperty()
+    {
+        $entity = new Entity('foobar');
+        $metadata = new PropertyMetadata(self::CLASSNAME, 'internal');
+
+        $this->assertEquals('foobar', $metadata->getValue($entity));
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ValidationVisitorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ValidationVisitorTest.php
new file mode 100644
index 0000000..ab35b6f
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ValidationVisitorTest.php
@@ -0,0 +1,508 @@
+<?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;
+
+use Symfony\Component\Validator\Tests\Fixtures\FakeMetadataFactory;
+use Symfony\Component\Validator\Constraints\Valid;
+use Symfony\Component\Validator\Tests\Fixtures\Reference;
+use Symfony\Component\Validator\ConstraintViolation;
+use Symfony\Component\Validator\ConstraintViolationList;
+use Symfony\Component\Validator\Tests\Fixtures\FailingConstraint;
+use Symfony\Component\Validator\Tests\Fixtures\ConstraintAValidator;
+use Symfony\Component\Validator\Tests\Fixtures\Entity;
+use Symfony\Component\Validator\Tests\Fixtures\ConstraintA;
+use Symfony\Component\Validator\Mapping\ClassMetadata;
+use Symfony\Component\Validator\ConstraintValidatorFactory;
+use Symfony\Component\Validator\ValidationVisitor;
+
+/**
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class ValidationVisitorTest extends \PHPUnit_Framework_TestCase
+{
+    const CLASS_NAME = 'Symfony\Component\Validator\Tests\Fixtures\Entity';
+
+    /**
+     * @var ValidationVisitor
+     */
+    private $visitor;
+
+    /**
+     * @var FakeMetadataFactory
+     */
+    private $metadataFactory;
+
+    /**
+     * @var ClassMetadata
+     */
+    private $metadata;
+
+    protected function setUp()
+    {
+        $this->metadataFactory = new FakeMetadataFactory();
+        $this->visitor = new ValidationVisitor('Root', $this->metadataFactory, new ConstraintValidatorFactory());
+        $this->metadata = new ClassMetadata(self::CLASS_NAME);
+        $this->metadataFactory->addMetadata($this->metadata);
+    }
+
+    protected function tearDown()
+    {
+        $this->metadataFactory = null;
+        $this->visitor = null;
+        $this->metadata = null;
+    }
+
+    public function testValidatePassesCorrectClassAndProperty()
+    {
+        $this->metadata->addConstraint(new ConstraintA());
+
+        $entity = new Entity();
+        $this->visitor->validate($entity, 'Default', '');
+
+        $context = ConstraintAValidator::$passedContext;
+
+        $this->assertEquals('Symfony\Component\Validator\Tests\Fixtures\Entity', $context->getClassName());
+        $this->assertNull($context->getPropertyName());
+    }
+
+    public function testValidateConstraints()
+    {
+        $this->metadata->addConstraint(new ConstraintA());
+
+        $this->visitor->validate(new Entity(), 'Default', '');
+
+        $this->assertCount(1, $this->visitor->getViolations());
+    }
+
+    public function testValidateTwiceValidatesConstraintsOnce()
+    {
+        $this->metadata->addConstraint(new ConstraintA());
+
+        $entity = new Entity();
+
+        $this->visitor->validate($entity, 'Default', '');
+        $this->visitor->validate($entity, 'Default', '');
+
+        $this->assertCount(1, $this->visitor->getViolations());
+    }
+
+    public function testValidateDifferentObjectsValidatesTwice()
+    {
+        $this->metadata->addConstraint(new ConstraintA());
+
+        $this->visitor->validate(new Entity(), 'Default', '');
+        $this->visitor->validate(new Entity(), 'Default', '');
+
+        $this->assertCount(2, $this->visitor->getViolations());
+    }
+
+    public function testValidateTwiceInDifferentGroupsValidatesTwice()
+    {
+        $this->metadata->addConstraint(new ConstraintA());
+        $this->metadata->addConstraint(new ConstraintA(array('groups' => 'Custom')));
+
+        $entity = new Entity();
+
+        $this->visitor->validate($entity, 'Default', '');
+        $this->visitor->validate($entity, 'Custom', '');
+
+        $this->assertCount(2, $this->visitor->getViolations());
+    }
+
+    public function testValidatePropertyConstraints()
+    {
+        $this->metadata->addPropertyConstraint('firstName', new ConstraintA());
+
+        $this->visitor->validate(new Entity(), 'Default', '');
+
+        $this->assertCount(1, $this->visitor->getViolations());
+    }
+
+    public function testValidateGetterConstraints()
+    {
+        $this->metadata->addGetterConstraint('lastName', new ConstraintA());
+
+        $this->visitor->validate(new Entity(), 'Default', '');
+
+        $this->assertCount(1, $this->visitor->getViolations());
+    }
+
+    public function testValidateInDefaultGroupTraversesGroupSequence()
+    {
+        $entity = new Entity();
+
+        $this->metadata->addPropertyConstraint('firstName', new FailingConstraint(array(
+            'groups' => 'First',
+        )));
+        $this->metadata->addGetterConstraint('lastName', new FailingConstraint(array(
+            'groups' => 'Default',
+        )));
+        $this->metadata->setGroupSequence(array('First', $this->metadata->getDefaultGroup()));
+
+        $this->visitor->validate($entity, 'Default', '');
+
+        // After validation of group "First" failed, no more group was
+        // validated
+        $violations = new ConstraintViolationList(array(
+            new ConstraintViolation(
+                'Failed',
+                array(),
+                'Root',
+                'firstName',
+                ''
+            ),
+        ));
+
+        $this->assertEquals($violations, $this->visitor->getViolations());
+    }
+
+    public function testValidateInGroupSequencePropagatesDefaultGroup()
+    {
+        $entity = new Entity();
+        $entity->reference = new Reference();
+
+        $this->metadata->addPropertyConstraint('reference', new Valid());
+        $this->metadata->setGroupSequence(array($this->metadata->getDefaultGroup()));
+
+        $referenceMetadata = new ClassMetadata(get_class($entity->reference));
+        $referenceMetadata->addConstraint(new FailingConstraint(array(
+                // this constraint is only evaluated if group "Default" is
+                // propagated to the reference
+                'groups' => 'Default',
+            )));
+        $this->metadataFactory->addMetadata($referenceMetadata);
+
+        $this->visitor->validate($entity, 'Default', '');
+
+        // The validation of the reference's FailingConstraint in group
+        // "Default" was launched
+        $violations = new ConstraintViolationList(array(
+            new ConstraintViolation(
+                'Failed',
+                array(),
+                'Root',
+                'reference',
+                $entity->reference
+            ),
+        ));
+
+        $this->assertEquals($violations, $this->visitor->getViolations());
+    }
+
+    public function testValidateInOtherGroupTraversesNoGroupSequence()
+    {
+        $entity = new Entity();
+
+        $this->metadata->addPropertyConstraint('firstName', new FailingConstraint(array(
+            'groups' => 'First',
+        )));
+        $this->metadata->addGetterConstraint('lastName', new FailingConstraint(array(
+            'groups' => $this->metadata->getDefaultGroup(),
+        )));
+        $this->metadata->setGroupSequence(array('First', $this->metadata->getDefaultGroup()));
+
+        $this->visitor->validate($entity, $this->metadata->getDefaultGroup(), '');
+
+        // Only group "Second" was validated
+        $violations = new ConstraintViolationList(array(
+            new ConstraintViolation(
+                'Failed',
+                array(),
+                'Root',
+                'lastName',
+                ''
+            ),
+        ));
+
+        $this->assertEquals($violations, $this->visitor->getViolations());
+    }
+
+    public function testValidateCascadedPropertyValidatesReferences()
+    {
+        $entity = new Entity();
+        $entity->reference = new Entity();
+
+        // add a constraint for the entity that always fails
+        $this->metadata->addConstraint(new FailingConstraint());
+
+        // validate entity when validating the property "reference"
+        $this->metadata->addPropertyConstraint('reference', new Valid());
+
+        // invoke validation on an object
+        $this->visitor->validate($entity, 'Default', '');
+
+        $violations = new ConstraintViolationList(array(
+            // generated by the root object
+            new ConstraintViolation(
+                'Failed',
+                array(),
+                'Root',
+                '',
+                $entity
+            ),
+            // generated by the reference
+            new ConstraintViolation(
+                'Failed',
+                array(),
+                'Root',
+                'reference',
+                $entity->reference
+            ),
+        ));
+
+        $this->assertEquals($violations, $this->visitor->getViolations());
+    }
+
+    public function testValidateCascadedPropertyValidatesArraysByDefault()
+    {
+        $entity = new Entity();
+        $entity->reference = array('key' => new Entity());
+
+        // add a constraint for the entity that always fails
+        $this->metadata->addConstraint(new FailingConstraint());
+
+        // validate array when validating the property "reference"
+        $this->metadata->addPropertyConstraint('reference', new Valid());
+
+        $this->visitor->validate($entity, 'Default', '');
+
+        $violations = new ConstraintViolationList(array(
+            // generated by the root object
+            new ConstraintViolation(
+                'Failed',
+                array(),
+                'Root',
+                '',
+                $entity
+            ),
+            // generated by the reference
+            new ConstraintViolation(
+                'Failed',
+                array(),
+                'Root',
+                'reference[key]',
+                $entity->reference['key']
+            ),
+        ));
+
+        $this->assertEquals($violations, $this->visitor->getViolations());
+    }
+
+    public function testValidateCascadedPropertyValidatesTraversableByDefault()
+    {
+        $entity = new Entity();
+        $entity->reference = new \ArrayIterator(array('key' => new Entity()));
+
+        // add a constraint for the entity that always fails
+        $this->metadata->addConstraint(new FailingConstraint());
+
+        // validate array when validating the property "reference"
+        $this->metadata->addPropertyConstraint('reference', new Valid());
+
+        $this->visitor->validate($entity, 'Default', '');
+
+        $violations = new ConstraintViolationList(array(
+            // generated by the root object
+            new ConstraintViolation(
+                'Failed',
+                array(),
+                'Root',
+                '',
+                $entity
+            ),
+            // generated by the reference
+            new ConstraintViolation(
+                'Failed',
+                array(),
+                'Root',
+                'reference[key]',
+                $entity->reference['key']
+            ),
+        ));
+
+        $this->assertEquals($violations, $this->visitor->getViolations());
+    }
+
+    public function testValidateCascadedPropertyDoesNotValidateTraversableIfDisabled()
+    {
+        $entity = new Entity();
+        $entity->reference = new \ArrayIterator(array('key' => new Entity()));
+
+        $this->metadataFactory->addMetadata(new ClassMetadata('ArrayIterator'));
+
+        // add a constraint for the entity that always fails
+        $this->metadata->addConstraint(new FailingConstraint());
+
+        // validate array when validating the property "reference"
+        $this->metadata->addPropertyConstraint('reference', new Valid(array(
+            'traverse' => false,
+        )));
+
+        $this->visitor->validate($entity, 'Default', '');
+
+        $violations = new ConstraintViolationList(array(
+            // generated by the root object
+            new ConstraintViolation(
+                'Failed',
+                array(),
+                'Root',
+                '',
+                $entity
+            ),
+            // nothing generated by the reference!
+        ));
+
+        $this->assertEquals($violations, $this->visitor->getViolations());
+    }
+
+    public function testMetadataMayNotExistIfTraversalIsEnabled()
+    {
+        $entity = new Entity();
+        $entity->reference = new \ArrayIterator();
+
+        $this->metadata->addPropertyConstraint('reference', new Valid(array(
+            'traverse' => true,
+        )));
+
+        $this->visitor->validate($entity, 'Default', '');
+    }
+
+    /**
+     * @expectedException \Symfony\Component\Validator\Exception\NoSuchMetadataException
+     */
+    public function testMetadataMustExistIfTraversalIsDisabled()
+    {
+        $entity = new Entity();
+        $entity->reference = new \ArrayIterator();
+
+        $this->metadata->addPropertyConstraint('reference', new Valid(array(
+            'traverse' => false,
+        )));
+
+        $this->visitor->validate($entity, 'Default', '');
+    }
+
+    public function testValidateCascadedPropertyDoesNotRecurseByDefault()
+    {
+        $entity = new Entity();
+        $entity->reference = new \ArrayIterator(array(
+            // The inner iterator should not be traversed by default
+            'key' => new \ArrayIterator(array(
+                'nested' => new Entity(),
+            )),
+        ));
+
+        $this->metadataFactory->addMetadata(new ClassMetadata('ArrayIterator'));
+
+        // add a constraint for the entity that always fails
+        $this->metadata->addConstraint(new FailingConstraint());
+
+        // validate iterator when validating the property "reference"
+        $this->metadata->addPropertyConstraint('reference', new Valid());
+
+        $this->visitor->validate($entity, 'Default', '');
+
+        $violations = new ConstraintViolationList(array(
+            // generated by the root object
+            new ConstraintViolation(
+                'Failed',
+                array(),
+                'Root',
+                '',
+                $entity
+            ),
+            // nothing generated by the reference!
+        ));
+
+        $this->assertEquals($violations, $this->visitor->getViolations());
+    }
+
+    public function testValidateCascadedPropertyRecursesIfDeepIsSet()
+    {
+        $entity = new Entity();
+        $entity->reference = new \ArrayIterator(array(
+            // The inner iterator should now be traversed
+            'key' => new \ArrayIterator(array(
+                'nested' => new Entity(),
+            )),
+        ));
+
+        // add a constraint for the entity that always fails
+        $this->metadata->addConstraint(new FailingConstraint());
+
+        // validate iterator when validating the property "reference"
+        $this->metadata->addPropertyConstraint('reference', new Valid(array(
+            'deep' => true,
+        )));
+
+        $this->visitor->validate($entity, 'Default', '');
+
+        $violations = new ConstraintViolationList(array(
+            // generated by the root object
+            new ConstraintViolation(
+                'Failed',
+                array(),
+                'Root',
+                '',
+                $entity
+            ),
+            // nothing generated by the reference!
+            new ConstraintViolation(
+                'Failed',
+                array(),
+                'Root',
+                'reference[key][nested]',
+                $entity->reference['key']['nested']
+            ),
+        ));
+
+        $this->assertEquals($violations, $this->visitor->getViolations());
+    }
+
+    public function testValidateCascadedPropertyDoesNotValidateNestedScalarValues()
+    {
+        $entity = new Entity();
+        $entity->reference = array('scalar', 'values');
+
+        // validate array when validating the property "reference"
+        $this->metadata->addPropertyConstraint('reference', new Valid());
+
+        $this->visitor->validate($entity, 'Default', '');
+
+        $this->assertCount(0, $this->visitor->getViolations());
+    }
+
+    public function testValidateCascadedPropertyDoesNotValidateNullValues()
+    {
+        $entity = new Entity();
+        $entity->reference = null;
+
+        $this->metadata->addPropertyConstraint('reference', new Valid());
+
+        $this->visitor->validate($entity, 'Default', '');
+
+        $this->assertCount(0, $this->visitor->getViolations());
+    }
+
+    /**
+     * @expectedException \Symfony\Component\Validator\Exception\NoSuchMetadataException
+     */
+    public function testValidateCascadedPropertyRequiresObjectOrArray()
+    {
+        $entity = new Entity();
+        $entity->reference = 'no object';
+
+        $this->metadata->addPropertyConstraint('reference', new Valid());
+
+        $this->visitor->validate($entity, 'Default', '');
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ValidatorBuilderTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ValidatorBuilderTest.php
new file mode 100644
index 0000000..d963e4a
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ValidatorBuilderTest.php
@@ -0,0 +1,110 @@
+<?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;
+
+use Symfony\Component\Validator\ValidatorBuilder;
+use Symfony\Component\Validator\ValidatorBuilderInterface;
+
+class ValidatorBuilderTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var ValidatorBuilderInterface
+     */
+    protected $builder;
+
+    protected function setUp()
+    {
+        $this->builder = new ValidatorBuilder();
+    }
+
+    protected function tearDown()
+    {
+        $this->builder = null;
+    }
+
+    public function testAddObjectInitializer()
+    {
+        $this->assertSame($this->builder, $this->builder->addObjectInitializer(
+            $this->getMock('Symfony\Component\Validator\ObjectInitializerInterface')
+        ));
+    }
+
+    public function testAddObjectInitializers()
+    {
+        $this->assertSame($this->builder, $this->builder->addObjectInitializers(array()));
+    }
+
+    public function testAddXmlMapping()
+    {
+        $this->assertSame($this->builder, $this->builder->addXmlMapping('mapping'));
+    }
+
+    public function testAddXmlMappings()
+    {
+        $this->assertSame($this->builder, $this->builder->addXmlMappings(array()));
+    }
+
+    public function testAddYamlMapping()
+    {
+        $this->assertSame($this->builder, $this->builder->addYamlMapping('mapping'));
+    }
+
+    public function testAddYamlMappings()
+    {
+        $this->assertSame($this->builder, $this->builder->addYamlMappings(array()));
+    }
+
+    public function testAddMethodMapping()
+    {
+        $this->assertSame($this->builder, $this->builder->addMethodMapping('mapping'));
+    }
+
+    public function testAddMethodMappings()
+    {
+        $this->assertSame($this->builder, $this->builder->addMethodMappings(array()));
+    }
+
+    public function testEnableAnnotationMapping()
+    {
+        if (!class_exists('Doctrine\Common\Annotations\AnnotationReader')) {
+            $this->markTestSkipped('Annotations is required for this test');
+        }
+
+        $this->assertSame($this->builder, $this->builder->enableAnnotationMapping());
+    }
+
+    public function testDisableAnnotationMapping()
+    {
+        $this->assertSame($this->builder, $this->builder->disableAnnotationMapping());
+    }
+
+    public function testSetMetadataFactory()
+    {
+        $this->assertSame($this->builder, $this->builder->setMetadataFactory(
+            $this->getMock('Symfony\Component\Validator\Mapping\ClassMetadataFactoryInterface'))
+        );
+    }
+
+    public function testSetMetadataCache()
+    {
+        $this->assertSame($this->builder, $this->builder->setMetadataCache($this->getMock(
+            'Symfony\Component\Validator\Mapping\Cache\CacheInterface'))
+        );
+    }
+
+    public function testSetConstraintValidatorFactory()
+    {
+        $this->assertSame($this->builder, $this->builder->setConstraintValidatorFactory(
+            $this->getMock('Symfony\Component\Validator\ConstraintValidatorFactoryInterface'))
+        );
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ValidatorContextTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ValidatorContextTest.php
new file mode 100644
index 0000000..e10c2da
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ValidatorContextTest.php
@@ -0,0 +1,62 @@
+<?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;
+
+use Symfony\Component\Validator\Validator;
+use Symfony\Component\Validator\Mapping\ClassMetadataFactoryAdapter;
+use Symfony\Component\Validator\ValidatorContext;
+
+class ValidatorContextTest extends \PHPUnit_Framework_TestCase
+{
+    protected $context;
+
+    protected function setUp()
+    {
+        $this->context = new ValidatorContext();
+    }
+
+    protected function tearDown()
+    {
+        $this->context = null;
+    }
+
+    public function testSetClassMetadataFactory()
+    {
+        $factory = $this->getMock('Symfony\Component\Validator\Mapping\ClassMetadataFactoryInterface');
+        $result = $this->context->setClassMetadataFactory($factory);
+
+        $this->assertSame($this->context, $result);
+        $this->assertSame($factory, $this->context->getClassMetadataFactory());
+    }
+
+    public function testSetConstraintValidatorFactory()
+    {
+        $factory = $this->getMock('Symfony\Component\Validator\ConstraintValidatorFactoryInterface');
+        $result = $this->context->setConstraintValidatorFactory($factory);
+
+        $this->assertSame($this->context, $result);
+        $this->assertSame($factory, $this->context->getConstraintValidatorFactory());
+    }
+
+    public function testGetValidator()
+    {
+        $metadataFactory = $this->getMock('Symfony\Component\Validator\Mapping\ClassMetadataFactoryInterface');
+        $validatorFactory = $this->getMock('Symfony\Component\Validator\ConstraintValidatorFactoryInterface');
+
+        $validator = $this->context
+            ->setClassMetadataFactory($metadataFactory)
+            ->setConstraintValidatorFactory($validatorFactory)
+            ->getValidator();
+
+        $this->assertEquals(new Validator(new ClassMetadataFactoryAdapter($metadataFactory), $validatorFactory), $validator);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ValidatorFactoryTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ValidatorFactoryTest.php
new file mode 100644
index 0000000..8ca3758
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ValidatorFactoryTest.php
@@ -0,0 +1,179 @@
+<?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;
+
+use Doctrine\Common\Annotations\AnnotationReader;
+use Symfony\Component\Validator\Mapping\ClassMetadataFactoryAdapter;
+use Symfony\Component\Validator\Validator;
+use Symfony\Component\Validator\ValidatorContext;
+use Symfony\Component\Validator\ValidatorFactory;
+use Symfony\Component\Validator\ConstraintValidatorFactory;
+use Symfony\Component\Validator\Mapping\ClassMetadataFactory;
+use Symfony\Component\Validator\Mapping\Loader\XmlFilesLoader;
+use Symfony\Component\Validator\Mapping\Loader\YamlFilesLoader;
+use Symfony\Component\Validator\Mapping\Loader\AnnotationLoader;
+use Symfony\Component\Validator\Mapping\Loader\StaticMethodLoader;
+use Symfony\Component\Validator\Mapping\Loader\LoaderChain;
+
+class ValidatorFactoryTest extends \PHPUnit_Framework_TestCase
+{
+    protected $defaultContext;
+    protected $factory;
+
+    protected function setUp()
+    {
+        $this->defaultContext = new ValidatorContext();
+        $this->factory = new ValidatorFactory($this->defaultContext);
+    }
+
+    protected function tearDown()
+    {
+        $this->defaultContext = null;
+        $this->factory = null;
+    }
+
+    public function testOverrideClassMetadataFactory()
+    {
+        $factory1 = $this->getMock('Symfony\Component\Validator\Mapping\ClassMetadataFactoryInterface');
+        $factory2 = $this->getMock('Symfony\Component\Validator\Mapping\ClassMetadataFactoryInterface');
+
+        $this->defaultContext->setClassMetadataFactory($factory1);
+
+        $result = $this->factory->setClassMetadataFactory($factory2);
+
+        $this->assertSame($factory1, $this->defaultContext->getClassMetadataFactory());
+        $this->assertSame($factory2, $result->getClassMetadataFactory());
+    }
+
+    public function testOverrideConstraintValidatorFactory()
+    {
+        $factory1 = $this->getMock('Symfony\Component\Validator\ConstraintValidatorFactoryInterface');
+        $factory2 = $this->getMock('Symfony\Component\Validator\ConstraintValidatorFactoryInterface');
+
+        $this->defaultContext->setConstraintValidatorFactory($factory1);
+
+        $result = $this->factory->setConstraintValidatorFactory($factory2);
+
+        $this->assertSame($factory1, $this->defaultContext->getConstraintValidatorFactory());
+        $this->assertSame($factory2, $result->getConstraintValidatorFactory());
+    }
+
+    public function testGetValidator()
+    {
+        $metadataFactory = $this->getMock('Symfony\Component\Validator\Mapping\ClassMetadataFactoryInterface');
+        $validatorFactory = $this->getMock('Symfony\Component\Validator\ConstraintValidatorFactoryInterface');
+
+        $this->defaultContext
+            ->setClassMetadataFactory($metadataFactory)
+            ->setConstraintValidatorFactory($validatorFactory);
+
+        $validator = $this->factory->getValidator();
+
+        $this->assertEquals(new Validator(new ClassMetadataFactoryAdapter($metadataFactory), $validatorFactory), $validator);
+    }
+
+    public function testBuildDefaultFromAnnotationsWithCustomNamespaces()
+    {
+        if (!class_exists('Doctrine\Common\Annotations\AnnotationReader')) {
+            $this->markTestSkipped('Annotations is required for this test');
+        }
+        $factory = ValidatorFactory::buildDefault(array(), true);
+
+        $context = new ValidatorContext();
+        $context
+            ->setClassMetadataFactory(new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())))
+            ->setConstraintValidatorFactory(new ConstraintValidatorFactory());
+
+        $this->assertEquals(new ValidatorFactory($context), $factory);
+    }
+
+    public function testBuildDefaultFromXml()
+    {
+        $path = __DIR__.'/Mapping/Loader/constraint-mapping.xml';
+        $factory = ValidatorFactory::buildDefault(array($path), false);
+
+        $context = new ValidatorContext();
+        $context
+            ->setClassMetadataFactory(new ClassMetadataFactory(new XmlFilesLoader(array($path))))
+            ->setConstraintValidatorFactory(new ConstraintValidatorFactory());
+
+        $this->assertEquals(new ValidatorFactory($context), $factory);
+    }
+
+    public function testBuildDefaultFromYaml()
+    {
+        $path = __DIR__.'/Mapping/Loader/constraint-mapping.yml';
+        $factory = ValidatorFactory::buildDefault(array($path), false);
+
+        $context = new ValidatorContext();
+        $context
+            ->setClassMetadataFactory(new ClassMetadataFactory(new YamlFilesLoader(array($path))))
+            ->setConstraintValidatorFactory(new ConstraintValidatorFactory());
+
+        $this->assertEquals(new ValidatorFactory($context), $factory);
+    }
+
+    public function testBuildDefaultFromStaticMethod()
+    {
+        $path = __DIR__.'/Mapping/Loader/constraint-mapping.yml';
+        $factory = ValidatorFactory::buildDefault(array(), false, 'loadMetadata');
+
+        $context = new ValidatorContext();
+        $context
+            ->setClassMetadataFactory(new ClassMetadataFactory(new StaticMethodLoader('loadMetadata')))
+            ->setConstraintValidatorFactory(new ConstraintValidatorFactory());
+
+        $this->assertEquals(new ValidatorFactory($context), $factory);
+    }
+
+    public function testBuildDefaultFromMultipleLoaders()
+    {
+        if (!class_exists('Doctrine\Common\Annotations\AnnotationReader')) {
+            $this->markTestSkipped('Annotations is required for this test');
+        }
+        $xmlPath = __DIR__.'/Mapping/Loader/constraint-mapping.xml';
+        $yamlPath = __DIR__.'/Mapping/Loader/constraint-mapping.yml';
+        $factory = ValidatorFactory::buildDefault(array($xmlPath, $yamlPath), true, 'loadMetadata');
+
+        $chain = new LoaderChain(array(
+            new XmlFilesLoader(array($xmlPath)),
+            new YamlFilesLoader(array($yamlPath)),
+            new AnnotationLoader(new AnnotationReader()),
+            new StaticMethodLoader('loadMetadata'),
+        ));
+
+        $context = new ValidatorContext();
+        $context
+            ->setClassMetadataFactory(new ClassMetadataFactory($chain))
+            ->setConstraintValidatorFactory(new ConstraintValidatorFactory());
+
+        $this->assertEquals(new ValidatorFactory($context), $factory);
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\MappingException
+     */
+    public function testBuildDefaultThrowsExceptionIfNoLoaderIsFound()
+    {
+        ValidatorFactory::buildDefault();
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\MappingException
+     */
+    public function testBuildDefaultThrowsExceptionIfUnknownExtension()
+    {
+        ValidatorFactory::buildDefault(array(
+            __DIR__.'/Mapping/Loader/StaticMethodLoaderTest.php'
+        ));
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ValidatorTest.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ValidatorTest.php
new file mode 100644
index 0000000..a2fccc6
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Tests/ValidatorTest.php
@@ -0,0 +1,264 @@
+<?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;
+
+use Symfony\Component\Validator\Tests\Fixtures\Entity;
+use Symfony\Component\Validator\Tests\Fixtures\GroupSequenceProviderEntity;
+use Symfony\Component\Validator\Tests\Fixtures\FakeMetadataFactory;
+use Symfony\Component\Validator\Tests\Fixtures\FailingConstraint;
+use Symfony\Component\Validator\Validator;
+use Symfony\Component\Validator\ConstraintViolation;
+use Symfony\Component\Validator\ConstraintViolationList;
+use Symfony\Component\Validator\ConstraintValidatorFactory;
+use Symfony\Component\Validator\Constraints\Valid;
+use Symfony\Component\Validator\Mapping\ClassMetadata;
+
+class ValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var FakeMetadataFactory
+     */
+    private $metadataFactory;
+
+    /**
+     * @var Validator
+     */
+    private $validator;
+
+    protected function setUp()
+    {
+        $this->metadataFactory = new FakeMetadataFactory();
+        $this->validator = new Validator($this->metadataFactory, new ConstraintValidatorFactory());
+    }
+
+    protected function tearDown()
+    {
+        $this->metadataFactory = null;
+        $this->validator = null;
+    }
+
+    public function testValidate_defaultGroup()
+    {
+        $entity = new Entity();
+        $metadata = new ClassMetadata(get_class($entity));
+        $metadata->addPropertyConstraint('firstName', new FailingConstraint());
+        $metadata->addPropertyConstraint('lastName', new FailingConstraint(array(
+            'groups' => 'Custom',
+        )));
+        $this->metadataFactory->addMetadata($metadata);
+
+        // Only the constraint of group "Default" failed
+        $violations = new ConstraintViolationList();
+        $violations->add(new ConstraintViolation(
+            'Failed',
+            array(),
+            $entity,
+            'firstName',
+            ''
+        ));
+
+        $this->assertEquals($violations, $this->validator->validate($entity));
+    }
+
+    public function testValidate_oneGroup()
+    {
+        $entity = new Entity();
+        $metadata = new ClassMetadata(get_class($entity));
+        $metadata->addPropertyConstraint('firstName', new FailingConstraint());
+        $metadata->addPropertyConstraint('lastName', new FailingConstraint(array(
+            'groups' => 'Custom',
+        )));
+        $this->metadataFactory->addMetadata($metadata);
+
+        // Only the constraint of group "Custom" failed
+        $violations = new ConstraintViolationList();
+        $violations->add(new ConstraintViolation(
+            'Failed',
+            array(),
+            $entity,
+            'lastName',
+            ''
+        ));
+
+        $this->assertEquals($violations, $this->validator->validate($entity, 'Custom'));
+    }
+
+    public function testValidate_multipleGroups()
+    {
+        $entity = new Entity();
+        $metadata = new ClassMetadata(get_class($entity));
+        $metadata->addPropertyConstraint('firstName', new FailingConstraint(array(
+            'groups' => 'First',
+        )));
+        $metadata->addPropertyConstraint('lastName', new FailingConstraint(array(
+            'groups' => 'Second',
+        )));
+        $this->metadataFactory->addMetadata($metadata);
+
+        // The constraints of both groups failed
+        $violations = new ConstraintViolationList();
+        $violations->add(new ConstraintViolation(
+            'Failed',
+            array(),
+            $entity,
+            'firstName',
+            ''
+        ));
+        $violations->add(new ConstraintViolation(
+            'Failed',
+            array(),
+            $entity,
+            'lastName',
+            ''
+        ));
+
+        $result = $this->validator->validate($entity, array('First', 'Second'));
+
+        $this->assertEquals($violations, $result);
+    }
+
+    public function testValidate_groupSequenceProvider()
+    {
+        $entity = new GroupSequenceProviderEntity();
+        $metadata = new ClassMetadata(get_class($entity));
+        $metadata->addPropertyConstraint('firstName', new FailingConstraint(array(
+            'groups' => 'First',
+        )));
+        $metadata->addPropertyConstraint('lastName', new FailingConstraint(array(
+            'groups' => 'Second',
+        )));
+        $metadata->setGroupSequenceProvider(true);
+        $this->metadataFactory->addMetadata($metadata);
+
+        $violations = new ConstraintViolationList();
+        $violations->add(new ConstraintViolation(
+            'Failed',
+            array(),
+            $entity,
+            'firstName',
+            ''
+        ));
+
+        $entity->setGroups(array('First'));
+        $result = $this->validator->validate($entity);
+        $this->assertEquals($violations, $result);
+
+        $violations = new ConstraintViolationList();
+        $violations->add(new ConstraintViolation(
+            'Failed',
+            array(),
+            $entity,
+            'lastName',
+            ''
+        ));
+
+        $entity->setGroups(array('Second'));
+        $result = $this->validator->validate($entity);
+        $this->assertEquals($violations, $result);
+
+        $entity->setGroups(array());
+        $result = $this->validator->validate($entity);
+        $this->assertEquals(new ConstraintViolationList(), $result);
+    }
+
+    public function testValidateProperty()
+    {
+        $entity = new Entity();
+        $metadata = new ClassMetadata(get_class($entity));
+        $metadata->addPropertyConstraint('firstName', new FailingConstraint());
+        $this->metadataFactory->addMetadata($metadata);
+
+        $result = $this->validator->validateProperty($entity, 'firstName');
+
+        $this->assertCount(1, $result);
+    }
+
+    public function testValidatePropertyValue()
+    {
+        $entity = new Entity();
+        $metadata = new ClassMetadata(get_class($entity));
+        $metadata->addPropertyConstraint('firstName', new FailingConstraint());
+        $this->metadataFactory->addMetadata($metadata);
+
+        $result = $this->validator->validatePropertyValue(get_class($entity), 'firstName', 'Bernhard');
+
+        $this->assertCount(1, $result);
+    }
+
+    public function testValidateValue()
+    {
+        $violations = new ConstraintViolationList();
+        $violations->add(new ConstraintViolation(
+            'Failed',
+            array(),
+            '',
+            '',
+            'Bernhard'
+        ));
+
+        $this->assertEquals($violations, $this->validator->validateValue('Bernhard', new FailingConstraint()));
+    }
+
+    /**
+     * @expectedException \Symfony\Component\Validator\Exception\ValidatorException
+     */
+    public function testValidateValueRejectsValid()
+    {
+        $entity = new Entity();
+        $metadata = new ClassMetadata(get_class($entity));
+        $this->metadataFactory->addMetadata($metadata);
+
+        $this->validator->validateValue($entity, new Valid());
+    }
+
+    /**
+     * @expectedException \Symfony\Component\Validator\Exception\ValidatorException
+     */
+    public function testValidatePropertyFailsIfPropertiesNotSupported()
+    {
+        // $metadata does not implement PropertyMetadataContainerInterface
+        $metadata = $this->getMock('Symfony\Component\Validator\MetadataInterface');
+        $this->metadataFactory = $this->getMock('Symfony\Component\Validator\MetadataFactoryInterface');
+        $this->metadataFactory->expects($this->any())
+            ->method('getMetadataFor')
+            ->with('VALUE')
+            ->will($this->returnValue($metadata));
+        $this->validator = new Validator($this->metadataFactory, new ConstraintValidatorFactory());
+
+        $this->validator->validateProperty('VALUE', 'someProperty');
+    }
+
+    /**
+     * @expectedException \Symfony\Component\Validator\Exception\ValidatorException
+     */
+    public function testValidatePropertyValueFailsIfPropertiesNotSupported()
+    {
+        // $metadata does not implement PropertyMetadataContainerInterface
+        $metadata = $this->getMock('Symfony\Component\Validator\MetadataInterface');
+        $this->metadataFactory = $this->getMock('Symfony\Component\Validator\MetadataFactoryInterface');
+        $this->metadataFactory->expects($this->any())
+            ->method('getMetadataFor')
+            ->with('VALUE')
+            ->will($this->returnValue($metadata));
+        $this->validator = new Validator($this->metadataFactory, new ConstraintValidatorFactory());
+
+        $this->validator->validatePropertyValue('VALUE', 'someProperty', 'propertyValue');
+    }
+
+    public function testGetMetadataFactory()
+    {
+        $this->assertInstanceOf(
+            'Symfony\Component\Validator\MetadataFactoryInterface',
+            $this->validator->getMetadataFactory()
+        );
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Validation.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Validation.php
new file mode 100644
index 0000000..de77e83
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Validation.php
@@ -0,0 +1,50 @@
+<?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;
+
+/**
+ * Entry point for the Validator component.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+final class Validation
+{
+    /**
+     * Creates a new validator.
+     *
+     * If you want to configure the validator, use
+     * {@link createValidatorBuilder()} instead.
+     *
+     * @return ValidatorInterface The new validator.
+     */
+    public static function createValidator()
+    {
+        return self::createValidatorBuilder()->getValidator();
+    }
+
+    /**
+     * Creates a configurable builder for validator objects.
+     *
+     * @return ValidatorBuilderInterface The new builder.
+     */
+    public static function createValidatorBuilder()
+    {
+        return new ValidatorBuilder();
+    }
+
+    /**
+     * This class cannot be instantiated.
+     */
+    private function __construct()
+    {
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/ValidationVisitor.php b/core/vendor/symfony/validator/Symfony/Component/Validator/ValidationVisitor.php
new file mode 100644
index 0000000..c826830
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/ValidationVisitor.php
@@ -0,0 +1,204 @@
+<?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;
+
+use Symfony\Component\Validator\Exception\NoSuchMetadataException;
+use Symfony\Component\Validator\Exception\UnexpectedTypeException;
+
+/**
+ * Default implementation of {@link ValidationVisitorInterface} and
+ * {@link GlobalExecutionContextInterface}.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class ValidationVisitor implements ValidationVisitorInterface, GlobalExecutionContextInterface
+{
+    /**
+     * @var mixed
+     */
+    private $root;
+
+    /**
+     * @var MetadataFactoryInterface
+     */
+    private $metadataFactory;
+
+    /**
+     * @var ConstraintValidatorFactoryInterface
+     */
+    private $validatorFactory;
+
+    /**
+     * @var array
+     */
+    private $objectInitializers;
+
+    /**
+     * @var ConstraintViolationList
+     */
+    private $violations;
+
+    /**
+     * @var array
+     */
+    private $validatedObjects = array();
+
+    /**
+     * @var GraphWalker
+     *
+     * @deprecated Deprecated since version 2.2, to be removed in 2.3.
+     */
+    private $graphWalker;
+
+    /**
+     * Creates a new validation visitor.
+     *
+     * @param mixed                               $root               The value passed to the validator.
+     * @param MetadataFactoryInterface            $metadataFactory    The factory for obtaining metadata instances.
+     * @param ConstraintValidatorFactoryInterface $validatorFactory   The factory for creating constraint validators.
+     * @param ObjectInitializerInterface[]        $objectInitializers The initializers for preparing objects before validation.
+     *
+     * @throws UnexpectedTypeException If any of the object initializers is not an instance of ObjectInitializerInterface
+     */
+    public function __construct($root, MetadataFactoryInterface $metadataFactory, ConstraintValidatorFactoryInterface $validatorFactory, array $objectInitializers = array())
+    {
+        foreach ($objectInitializers as $initializer) {
+            if (!$initializer instanceof ObjectInitializerInterface) {
+                throw new UnexpectedTypeException($initializer, 'Symfony\Component\Validator\ObjectInitializerInterface');
+            }
+        }
+
+        $this->root = $root;
+        $this->metadataFactory = $metadataFactory;
+        $this->validatorFactory = $validatorFactory;
+        $this->objectInitializers = $objectInitializers;
+        $this->violations = new ConstraintViolationList();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function visit(MetadataInterface $metadata, $value, $group, $propertyPath)
+    {
+        $context = new ExecutionContext(
+            $this,
+            $metadata,
+            $value,
+            $group,
+            $propertyPath
+        );
+
+        $context->validateValue($value, $metadata->findConstraints($group));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function validate($value, $group, $propertyPath, $traverse = false, $deep = false)
+    {
+        if (null === $value) {
+            return;
+        }
+
+        if (is_object($value)) {
+            $hash = spl_object_hash($value);
+
+            // Exit, if the object is already validated for the current group
+            if (isset($this->validatedObjects[$hash][$group])) {
+                return;
+            }
+
+            // Remember validating this object before starting and possibly
+            // traversing the object graph
+            $this->validatedObjects[$hash][$group] = true;
+
+            foreach ($this->objectInitializers as $initializer) {
+                if (!$initializer instanceof ObjectInitializerInterface) {
+                    throw new \LogicException('Validator initializers must implement ObjectInitializerInterface.');
+                }
+                $initializer->initialize($value);
+            }
+        }
+
+        if ($traverse && (is_array($value) || $value instanceof \Traversable)) {
+            foreach ($value as $key => $element) {
+                // Ignore any scalar values in the collection
+                if (is_object($element) || is_array($element)) {
+                    // Only repeat the traversal if $deep is set
+                    $this->validate($element, $group, $propertyPath.'['.$key.']', $deep, $deep);
+                }
+            }
+
+            try {
+                $this->metadataFactory->getMetadataFor($value)->accept($this, $value, $group, $propertyPath);
+            } catch (NoSuchMetadataException $e) {
+                // Metadata doesn't necessarily have to exist for
+                // traversable objects, because we know how to validate
+                // them anyway. Optionally, additional metadata is supported.
+            }
+        } else {
+            $this->metadataFactory->getMetadataFor($value)->accept($this, $value, $group, $propertyPath);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getGraphWalker()
+    {
+        if (null === $this->graphWalker) {
+            $this->graphWalker = new GraphWalker($this, $this->metadataFactory, $this->validatedObjects);
+        }
+
+        return $this->graphWalker;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getViolations()
+    {
+        return $this->violations;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getRoot()
+    {
+        return $this->root;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getVisitor()
+    {
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getValidatorFactory()
+    {
+        return $this->validatorFactory;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getMetadataFactory()
+    {
+        return $this->metadataFactory;
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/ValidationVisitorInterface.php b/core/vendor/symfony/validator/Symfony/Component/Validator/ValidationVisitorInterface.php
new file mode 100644
index 0000000..fb1022f
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/ValidationVisitorInterface.php
@@ -0,0 +1,90 @@
+<?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;
+
+/**
+ * Validates values against constraints defined in {@link MetadataInterface}
+ * instances.
+ *
+ * This interface is an implementation of the Visitor design pattern. A value
+ * is validated by first passing it to the {@link validate} method. That method
+ * will determine the matching {@link MetadataInterface} for validating the
+ * value. It then calls the {@link MetadataInterface::accept} method of that
+ * metadata. <tt>accept()</tt> does two things:
+ *
+ * <ol>
+ * <li>It calls {@link visit} to validate the value against the constraints of
+ * the metadata.</li>
+ * <li>It calls <tt>accept()</tt> on all nested metadata instances with the
+ * corresponding values extracted from the current value. For example, if the
+ * current metadata represents a class and the current value is an object of
+ * that class, the metadata contains nested instances for each property of that
+ * class. It forwards the call to these nested metadata with the values of the
+ * corresponding properties in the original object.</li>
+ * </ol>
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+interface ValidationVisitorInterface
+{
+    /**
+     * Validates a value.
+     *
+     * If the value is an array or a traversable object, you can set the
+     * parameter <tt>$traverse</tt> to <tt>true</tt> in order to run through
+     * the collection and validate each element. If these elements can be
+     * collections again and you want to traverse them recursively, set the
+     * parameter <tt>$deep</tt> to <tt>true</tt> as well.
+     *
+     * If you set <tt>$traversable</tt> to <tt>true</tt>, the visitor will
+     * nevertheless try to find metadata for the collection and validate its
+     * constraints. If no such metadata is found, the visitor ignores that and
+     * only iterates the collection.
+     *
+     * If you don't set <tt>$traversable</tt> to <tt>true</tt> and the visitor
+     * does not find metadata for the given value, it will fail with an
+     * exception.
+     *
+     * @param mixed   $value        The value to validate.
+     * @param string  $group        The validation group to validate.
+     * @param string  $propertyPath The current property path in the validation graph.
+     * @param Boolean $traverse     Whether to traverse the value if it is traversable.
+     * @param Boolean $deep         Whether to traverse nested traversable values recursively.
+     *
+     * @throws Exception\NoSuchMetadataException If no metadata can be found for
+     *                                           the given value.
+     */
+    public function validate($value, $group, $propertyPath, $traverse = false, $deep = false);
+
+    /**
+     * Validates a value against the constraints defined in some metadata.
+     *
+     * This method implements the Visitor design pattern. See also
+     * {@link ValidationVisitorInterface}.
+     *
+     * @param MetadataInterface $metadata     The metadata holding the constraints.
+     * @param mixed             $value        The value to validate.
+     * @param string            $group        The validation group to validate.
+     * @param string            $propertyPath The current property path in the validation graph.
+     */
+    public function visit(MetadataInterface $metadata, $value, $group, $propertyPath);
+
+    /**
+     * Returns a graph walker with an alternative, deprecated API of the
+     * visitor.
+     *
+     * @return GraphWalker The graph walker.
+     *
+     * @deprecated Deprecated since version 2.2, to be removed in 2.3.
+     */
+    public function getGraphWalker();
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/Validator.php b/core/vendor/symfony/validator/Symfony/Component/Validator/Validator.php
new file mode 100644
index 0000000..c4d17488
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/Validator.php
@@ -0,0 +1,191 @@
+<?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;
+
+use Symfony\Component\Validator\Constraints\Valid;
+use Symfony\Component\Validator\Exception\ValidatorException;
+
+/**
+ * Default implementation of {@link ValidatorInterface}.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class Validator implements ValidatorInterface
+{
+    /**
+     * @var MetadataFactoryInterface
+     */
+    protected $metadataFactory;
+
+    /**
+     * @var ConstraintValidatorFactoryInterface
+     */
+    protected $validatorFactory;
+
+    /**
+     * @var array
+     */
+    protected $objectInitializers;
+
+    public function __construct(
+        MetadataFactoryInterface $metadataFactory,
+        ConstraintValidatorFactoryInterface $validatorFactory,
+        array $objectInitializers = array()
+    )
+    {
+        $this->metadataFactory = $metadataFactory;
+        $this->validatorFactory = $validatorFactory;
+        $this->objectInitializers = $objectInitializers;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getMetadataFactory()
+    {
+        return $this->metadataFactory;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getMetadataFor($value)
+    {
+        return $this->metadataFactory->getMetadataFor($value);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function validate($value, $groups = null, $traverse = false, $deep = false)
+    {
+        $visitor = $this->createVisitor($value);
+
+        foreach ($this->resolveGroups($groups) as $group) {
+            $visitor->validate($value, $group, '');
+        }
+
+        return $visitor->getViolations();
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @throws ValidatorException If the metadata for the value does not support properties.
+     */
+    public function validateProperty($containingValue, $property, $groups = null)
+    {
+        $visitor = $this->createVisitor($containingValue);
+        $metadata = $this->metadataFactory->getMetadataFor($containingValue);
+
+        if (!$metadata instanceof PropertyMetadataContainerInterface) {
+            $valueAsString = is_scalar($containingValue)
+                ? '"' . $containingValue . '"'
+                : 'the value of type ' . gettype($containingValue);
+
+            throw new ValidatorException(sprintf('The metadata for ' . $valueAsString . ' does not support properties.'));
+        }
+
+        foreach ($this->resolveGroups($groups) as $group) {
+            foreach ($metadata->getPropertyMetadata($property) as $propMeta) {
+                $propMeta->accept($visitor, $propMeta->getPropertyValue($containingValue), $group, $property);
+            }
+        }
+
+        return $visitor->getViolations();
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @throws ValidatorException If the metadata for the value does not support properties.
+     */
+    public function validatePropertyValue($containingValue, $property, $value, $groups = null)
+    {
+        $visitor = $this->createVisitor($containingValue);
+        $metadata = $this->metadataFactory->getMetadataFor($containingValue);
+
+        if (!$metadata instanceof PropertyMetadataContainerInterface) {
+            $valueAsString = is_scalar($containingValue)
+                ? '"' . $containingValue . '"'
+                : 'the value of type ' . gettype($containingValue);
+
+            throw new ValidatorException(sprintf('The metadata for ' . $valueAsString . ' does not support properties.'));
+        }
+
+        foreach ($this->resolveGroups($groups) as $group) {
+            foreach ($metadata->getPropertyMetadata($property) as $propMeta) {
+                $propMeta->accept($visitor, $value, $group, $property);
+            }
+        }
+
+        return $visitor->getViolations();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function validateValue($value, $constraints, $groups = null)
+    {
+        $context = new ExecutionContext($this->createVisitor(null));
+
+        $constraints = is_array($constraints) ? $constraints : array($constraints);
+
+        foreach ($constraints as $constraint) {
+            if ($constraint instanceof Valid) {
+                // Why can't the Valid constraint be executed directly?
+                //
+                // It cannot be executed like regular other constraints, because regular
+                // constraints are only executed *if they belong to the validated group*.
+                // The Valid constraint, on the other hand, is always executed and propagates
+                // the group to the cascaded object. The propagated group depends on
+                //
+                //  * Whether a group sequence is currently being executed. Then the default
+                //    group is propagated.
+                //
+                //  * Otherwise the validated group is propagated.
+
+                throw new ValidatorException(
+                    sprintf(
+                        'The constraint %s cannot be validated. Use the method validate() instead.',
+                        get_class($constraint)
+                    )
+                );
+            }
+
+            $context->validateValue($value, $constraint, $groups);
+        }
+
+        return $context->getViolations();
+    }
+
+    /**
+     * @param mixed $root
+     *
+     * @return ValidationVisitor
+     */
+    protected function createVisitor($root)
+    {
+        return new ValidationVisitor($root, $this->metadataFactory, $this->validatorFactory, $this->objectInitializers);
+    }
+
+    /**
+     * @param null|string|string[] $groups
+     *
+     * @return string[]
+     */
+    private function resolveGroups($groups)
+    {
+        return $groups ? (array) $groups : array(Constraint::DEFAULT_GROUP);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/ValidatorBuilder.php b/core/vendor/symfony/validator/Symfony/Component/Validator/ValidatorBuilder.php
new file mode 100644
index 0000000..8f39d4a
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/ValidatorBuilder.php
@@ -0,0 +1,302 @@
+<?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;
+
+use Symfony\Component\Validator\Mapping\ClassMetadataFactory;
+use Symfony\Component\Validator\Mapping\ClassMetadataFactoryAdapter;
+use Symfony\Component\Validator\Exception\ValidatorException;
+use Symfony\Component\Validator\Mapping\Loader\LoaderChain;
+use Symfony\Component\Validator\Mapping\ClassMetadataFactoryInterface;
+use Symfony\Component\Validator\Mapping\Cache\CacheInterface;
+use Symfony\Component\Validator\Mapping\Loader\StaticMethodLoader;
+use Symfony\Component\Validator\Mapping\Loader\YamlFileLoader;
+use Symfony\Component\Validator\Mapping\Loader\AnnotationLoader;
+use Symfony\Component\Validator\Mapping\Loader\YamlFilesLoader;
+use Symfony\Component\Validator\Mapping\Loader\XmlFileLoader;
+use Symfony\Component\Validator\Mapping\Loader\XmlFilesLoader;
+use Doctrine\Common\Annotations\Reader;
+use Doctrine\Common\Annotations\AnnotationReader;
+use Doctrine\Common\Annotations\CachedReader;
+use Doctrine\Common\Cache\ArrayCache;
+
+/**
+ * The default implementation of {@link ValidatorBuilderInterface}.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+class ValidatorBuilder implements ValidatorBuilderInterface
+{
+    /**
+     * @var array
+     */
+    private $initializers = array();
+
+    /**
+     * @var array
+     */
+    private $xmlMappings = array();
+
+    /**
+     * @var array
+     */
+    private $yamlMappings = array();
+
+    /**
+     * @var array
+     */
+    private $methodMappings = array();
+
+    /**
+     * @var Reader
+     */
+    private $annotationReader = null;
+
+    /**
+     * @var MetadataFactoryInterface
+     */
+    private $metadataFactory;
+
+    /**
+     * @var ConstraintValidatorFactoryInterface
+     */
+    private $validatorFactory;
+
+    /**
+     * @var CacheInterface
+     */
+    private $metadataCache;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function addObjectInitializer(ObjectInitializerInterface $initializer)
+    {
+        $this->initializers[] = $initializer;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function addObjectInitializers(array $initializers)
+    {
+        $this->initializers = array_merge($this->initializers, $initializers);
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function addXmlMapping($path)
+    {
+        if (null !== $this->metadataFactory) {
+            throw new ValidatorException('You cannot add custom mappings after setting a custom metadata factory. Configure your metadata factory instead.');
+        }
+
+        $this->xmlMappings[] = $path;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function addXmlMappings(array $paths)
+    {
+        if (null !== $this->metadataFactory) {
+            throw new ValidatorException('You cannot add custom mappings after setting a custom metadata factory. Configure your metadata factory instead.');
+        }
+
+        $this->xmlMappings = array_merge($this->xmlMappings, $paths);
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function addYamlMapping($path)
+    {
+        if (null !== $this->metadataFactory) {
+            throw new ValidatorException('You cannot add custom mappings after setting a custom metadata factory. Configure your metadata factory instead.');
+        }
+
+        $this->yamlMappings[] = $path;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function addYamlMappings(array $paths)
+    {
+        if (null !== $this->metadataFactory) {
+            throw new ValidatorException('You cannot add custom mappings after setting a custom metadata factory. Configure your metadata factory instead.');
+        }
+
+        $this->yamlMappings = array_merge($this->yamlMappings, $paths);
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function addMethodMapping($methodName)
+    {
+        if (null !== $this->metadataFactory) {
+            throw new ValidatorException('You cannot add custom mappings after setting a custom metadata factory. Configure your metadata factory instead.');
+        }
+
+        $this->methodMappings[] = $methodName;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function addMethodMappings(array $methodNames)
+    {
+        if (null !== $this->metadataFactory) {
+            throw new ValidatorException('You cannot add custom mappings after setting a custom metadata factory. Configure your metadata factory instead.');
+        }
+
+        $this->methodMappings = array_merge($this->methodMappings, $methodNames);
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function enableAnnotationMapping(Reader $annotationReader = null)
+    {
+        if (null !== $this->metadataFactory) {
+            throw new ValidatorException('You cannot enable annotation mapping after setting a custom metadata factory. Configure your metadata factory instead.');
+        }
+
+        if (null === $annotationReader) {
+            if (!class_exists('Doctrine\Common\Annotations\AnnotationReader')) {
+                throw new \RuntimeException('Requested a ValidatorFactory with an AnnotationLoader, but the AnnotationReader was not found. You should add Doctrine Common to your project.');
+            }
+
+            $annotationReader = new CachedReader(new AnnotationReader(), new ArrayCache());
+        }
+
+        $this->annotationReader = $annotationReader;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function disableAnnotationMapping()
+    {
+        $this->annotationReader = null;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setMetadataFactory($metadataFactory)
+    {
+        if (count($this->xmlMappings) > 0 || count($this->yamlMappings) > 0 || count($this->methodMappings) > 0 || null !== $this->annotationReader) {
+            throw new ValidatorException('You cannot set a custom metadata factory after adding custom mappings. You should do either of both.');
+        }
+
+        if ($metadataFactory instanceof ClassMetadataFactoryInterface
+                && !$metadataFactory instanceof MetadataFactoryInterface) {
+            $metadataFactory = new ClassMetadataFactoryAdapter($metadataFactory);
+        }
+
+        $this->metadataFactory = $metadataFactory;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setMetadataCache(CacheInterface $cache)
+    {
+        if (null !== $this->metadataFactory) {
+            throw new ValidatorException('You cannot set a custom metadata cache after setting a custom metadata factory. Configure your metadata factory instead.');
+        }
+
+        $this->metadataCache = $cache;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setConstraintValidatorFactory(ConstraintValidatorFactoryInterface $validatorFactory)
+    {
+        $this->validatorFactory = $validatorFactory;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getValidator()
+    {
+        $metadataFactory = $this->metadataFactory;
+
+        if (!$metadataFactory) {
+            $loaders = array();
+
+            if (count($this->xmlMappings) > 1) {
+                $loaders[] = new XmlFilesLoader($this->xmlMappings);
+            } elseif (1 === count($this->xmlMappings)) {
+                $loaders[] = new XmlFileLoader($this->xmlMappings[0]);
+            }
+
+            if (count($this->yamlMappings) > 1) {
+                $loaders[] = new YamlFilesLoader($this->yamlMappings);
+            } elseif (1 === count($this->yamlMappings)) {
+                $loaders[] = new YamlFileLoader($this->yamlMappings[0]);
+            }
+
+            foreach ($this->methodMappings as $methodName) {
+                $loaders[] = new StaticMethodLoader($methodName);
+            }
+
+            if ($this->annotationReader) {
+                $loaders[] = new AnnotationLoader($this->annotationReader);
+            }
+
+            $loader = null;
+
+            if (count($loaders) > 1) {
+                $loader = new LoaderChain($loaders);
+            } elseif (1 === count($loaders)) {
+                $loader = $loaders[0];
+            }
+
+            $metadataFactory = new ClassMetadataFactory($loader, $this->metadataCache);
+        }
+
+        $validatorFactory = $this->validatorFactory ?: new ConstraintValidatorFactory();
+
+        return new Validator($metadataFactory, $validatorFactory, $this->initializers);
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/ValidatorBuilderInterface.php b/core/vendor/symfony/validator/Symfony/Component/Validator/ValidatorBuilderInterface.php
new file mode 100644
index 0000000..914d4f9
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/ValidatorBuilderInterface.php
@@ -0,0 +1,148 @@
+<?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;
+
+use Symfony\Component\Validator\Mapping\Cache\CacheInterface;
+use Doctrine\Common\Annotations\Reader;
+
+/**
+ * A configurable builder for ValidatorInterface objects.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ */
+interface ValidatorBuilderInterface
+{
+    /**
+     * Adds an object initializer to the validator.
+     *
+     * @param ObjectInitializerInterface $initializer The initializer.
+     *
+     * @return ValidatorBuilderInterface The builder object.
+     */
+    public function addObjectInitializer(ObjectInitializerInterface $initializer);
+
+    /**
+     * Adds a list of object initializers to the validator.
+     *
+     * @param array $initializers The initializer.
+     *
+     * @return ValidatorBuilderInterface The builder object.
+     */
+    public function addObjectInitializers(array $initializers);
+
+    /**
+     * Adds an XML constraint mapping file to the validator.
+     *
+     * @param string $path The path to the mapping file.
+     *
+     * @return ValidatorBuilderInterface The builder object.
+     */
+    public function addXmlMapping($path);
+
+    /**
+     * Adds a list of XML constraint mapping files to the validator.
+     *
+     * @param array $paths The paths to the mapping files.
+     *
+     * @return ValidatorBuilderInterface The builder object.
+     */
+    public function addXmlMappings(array $paths);
+
+    /**
+     * Adds a YAML constraint mapping file to the validator.
+     *
+     * @param string $path The path to the mapping file.
+     *
+     * @return ValidatorBuilderInterface The builder object.
+     */
+    public function addYamlMapping($path);
+
+    /**
+     * Adds a list of YAML constraint mappings file to the validator.
+     *
+     * @param array $paths The paths to the mapping files.
+     *
+     * @return ValidatorBuilderInterface The builder object.
+     */
+    public function addYamlMappings(array $paths);
+
+    /**
+     * Enables constraint mapping using the given static method.
+     *
+     * @param string $methodName The name of the method.
+     *
+     * @return ValidatorBuilderInterface The builder object.
+     */
+    public function addMethodMapping($methodName);
+
+    /**
+     * Enables constraint mapping using the given static methods.
+     *
+     * @param array $methodNames The names of the methods.
+     *
+     * @return ValidatorBuilderInterface The builder object.
+     */
+    public function addMethodMappings(array $methodNames);
+
+    /**
+     * Enables annotation based constraint mapping.
+     *
+     * @param Reader $annotationReader The annotation reader to be used.
+     *
+     * @return ValidatorBuilderInterface The builder object.
+     */
+    public function enableAnnotationMapping(Reader $annotationReader = null);
+
+    /**
+     * Disables annotation based constraint mapping.
+     *
+     * @return ValidatorBuilderInterface The builder object.
+     */
+    public function disableAnnotationMapping();
+
+    /**
+     * Sets the class metadata factory used by the validator.
+     *
+     * As of Symfony 2.3, the first parameter of this method will be typed
+     * against {@link MetadataFactoryInterface}.
+     *
+     * @param MetadataFactoryInterface|Mapping\ClassMetadataFactoryInterface $metadataFactory The metadata factory.
+     *
+     * @return ValidatorBuilderInterface The builder object.
+     */
+    public function setMetadataFactory($metadataFactory);
+
+    /**
+     * Sets the cache for caching class metadata.
+     *
+     * @param CacheInterface $cache The cache instance.
+     *
+     * @return ValidatorBuilderInterface The builder object.
+     */
+    public function setMetadataCache(CacheInterface $cache);
+
+    /**
+     * Sets the constraint validator factory used by the validator.
+     *
+     * @param ConstraintValidatorFactoryInterface $validatorFactory The validator factory.
+     *
+     * @return ValidatorBuilderInterface The builder object.
+     */
+    public function setConstraintValidatorFactory(ConstraintValidatorFactoryInterface $validatorFactory);
+
+    /**
+     * Builds and returns a new validator object.
+     *
+     * @return ValidatorInterface The built validator.
+     */
+    public function getValidator();
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/ValidatorContext.php b/core/vendor/symfony/validator/Symfony/Component/Validator/ValidatorContext.php
new file mode 100644
index 0000000..c2f6880
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/ValidatorContext.php
@@ -0,0 +1,113 @@
+<?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;
+
+use Symfony\Component\Validator\Mapping\ClassMetadataFactoryInterface;
+use Symfony\Component\Validator\Mapping\ClassMetadataFactoryAdapter;
+
+/**
+ * Default implementation of ValidatorContextInterface
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @deprecated Deprecated since version 2.1, to be removed in 2.3. Use
+ *             {@link Validation::createValidatorBuilder()} instead.
+ */
+class ValidatorContext implements ValidatorContextInterface
+{
+    /**
+     * @var MetadataFactoryInterface
+     */
+    private $metadataFactory;
+
+    /**
+     * The class metadata factory used in the new validator
+     * @var ClassMetadataFactoryInterface
+     */
+    protected $classMetadataFactory = null;
+
+    /**
+     * The constraint validator factory used in the new validator
+     * @var ConstraintValidatorFactoryInterface
+     */
+    protected $constraintValidatorFactory = null;
+
+    /**
+     * {@inheritDoc}
+     *
+     * @deprecated Deprecated since version 2.1, to be removed in 2.3. Use
+     *             {@link Validation::createValidatorBuilder()} instead.
+     */
+    public function setClassMetadataFactory(ClassMetadataFactoryInterface $classMetadataFactory)
+    {
+        if ($classMetadataFactory instanceof MetadataFactoryInterface) {
+            $this->metadataFactory = $classMetadataFactory;
+        } else {
+            $this->metadataFactory = new ClassMetadataFactoryAdapter($classMetadataFactory);
+        }
+
+        $this->classMetadataFactory = $classMetadataFactory;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @deprecated Deprecated since version 2.1, to be removed in 2.3. Use
+     *             {@link Validation::createValidatorBuilder()} instead.
+     */
+    public function setConstraintValidatorFactory(ConstraintValidatorFactoryInterface $constraintValidatorFactory)
+    {
+        $this->constraintValidatorFactory = $constraintValidatorFactory;
+
+        return $this;
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @deprecated Deprecated since version 2.1, to be removed in 2.3. Use
+     *             {@link Validation::createValidator()} instead.
+     */
+    public function getValidator()
+    {
+        return new Validator(
+            $this->metadataFactory,
+            $this->constraintValidatorFactory
+        );
+    }
+
+    /**
+     * Returns the class metadata factory used in the new validator
+     *
+     * @return ClassMetadataFactoryInterface  The factory instance
+     *
+     * @deprecated Deprecated since version 2.1, to be removed in 2.3.
+     */
+    public function getClassMetadataFactory()
+    {
+        return $this->classMetadataFactory;
+    }
+
+    /**
+     * Returns the constraint validator factory used in the new validator
+     *
+     * @return ConstraintValidatorFactoryInterface  The factory instance
+     *
+     * @deprecated Deprecated since version 2.1, to be removed in 2.3.
+     */
+    public function getConstraintValidatorFactory()
+    {
+        return $this->constraintValidatorFactory;
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/ValidatorContextInterface.php b/core/vendor/symfony/validator/Symfony/Component/Validator/ValidatorContextInterface.php
new file mode 100644
index 0000000..73ce6b6
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/ValidatorContextInterface.php
@@ -0,0 +1,65 @@
+<?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;
+
+use Symfony\Component\Validator\Mapping\ClassMetadataFactoryInterface;
+
+/**
+ * Stores settings for creating a new validator and creates validators
+ *
+ * The methods in this class are chainable, i.e. they return the context
+ * object itself. When you have finished configuring the new validator, call
+ * getValidator() to create the it.
+ *
+ * <code>
+ * $validator = $context
+ *     ->setClassMetadataFactory($customFactory)
+ *     ->getValidator();
+ * </code>
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @deprecated Deprecated since version 2.1, to be removed in 2.3. Use
+ *             {@link Validation::createValidatorBuilder()} instead.
+ */
+interface ValidatorContextInterface
+{
+    /**
+     * Sets the class metadata factory used in the new validator
+     *
+     * @param ClassMetadataFactoryInterface $classMetadataFactory The factory instance
+     *
+     * @deprecated Deprecated since version 2.1, to be removed in 2.3. Use
+     *             {@link Validation::createValidatorBuilder()} instead.
+     */
+    public function setClassMetadataFactory(ClassMetadataFactoryInterface $classMetadataFactory);
+
+    /**
+     * Sets the constraint validator factory used in the new validator
+     *
+     * @param ConstraintValidatorFactoryInterface $constraintValidatorFactory The factory instance
+     *
+     * @deprecated Deprecated since version 2.1, to be removed in 2.3. Use
+     *             {@link Validation::createValidatorBuilder()} instead.
+     */
+    public function setConstraintValidatorFactory(ConstraintValidatorFactoryInterface $constraintValidatorFactory);
+
+    /**
+     * Creates a new validator with the settings stored in this context
+     *
+     * @return ValidatorInterface   The new validator
+     *
+     * @deprecated Deprecated since version 2.1, to be removed in 2.3. Use
+     *             {@link Validation::createValidator()} instead.
+     */
+    public function getValidator();
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/ValidatorFactory.php b/core/vendor/symfony/validator/Symfony/Component/Validator/ValidatorFactory.php
new file mode 100644
index 0000000..5e16b2e
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/ValidatorFactory.php
@@ -0,0 +1,224 @@
+<?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;
+
+use Doctrine\Common\Annotations\AnnotationReader;
+use Symfony\Component\Validator\Exception\MappingException;
+use Symfony\Component\Validator\Mapping\ClassMetadataFactory;
+use Symfony\Component\Validator\Mapping\ClassMetadataFactoryInterface;
+use Symfony\Component\Validator\Mapping\Loader\XmlFilesLoader;
+use Symfony\Component\Validator\Mapping\Loader\YamlFilesLoader;
+use Symfony\Component\Validator\Mapping\Loader\AnnotationLoader;
+use Symfony\Component\Validator\Mapping\Loader\StaticMethodLoader;
+use Symfony\Component\Validator\Mapping\Loader\LoaderChain;
+
+/**
+ * Creates and configures new validator objects
+ *
+ * Usually you will use the static method buildDefault() to initialize a
+ * factory with default configuration. To this method you can pass various
+ * parameters that configure where the validator mapping is found. If you
+ * don't pass a parameter, the mapping will be read from annotations.
+ *
+ * <code>
+ * // read from annotations only
+ * $factory = ValidatorFactory::buildDefault();
+ *
+ * // read from XML and YAML, suppress annotations
+ * $factory = ValidatorFactory::buildDefault(array(
+ *   '/path/to/mapping.xml',
+ *   '/path/to/other/mapping.yml',
+ * ), false);
+ * </code>
+ *
+ * You then have to call getValidator() to create new validators.
+ *
+ * <code>
+ * $validator = $factory->getValidator();
+ * </code>
+ *
+ * When manually constructing a factory, the default configuration of the
+ * validators can be passed to the constructor as a ValidatorContextInterface
+ * object.
+ *
+ * <code>
+ * $defaultContext = new ValidatorContext();
+ * $defaultContext->setClassMetadataFactory($metadataFactory);
+ * $defaultContext->setConstraintValidatorFactory($validatorFactory);
+ * $factory = new ValidatorFactory($defaultContext);
+ *
+ * $form = $factory->getValidator();
+ * </code>
+ *
+ * You can also override the default configuration by calling any of the
+ * methods in this class. These methods return a ValidatorContextInterface object
+ * on which you can override further settings or call getValidator() to create
+ * a form.
+ *
+ * <code>
+ * $form = $factory
+ *     ->setClassMetadataFactory($customFactory);
+ *     ->getValidator();
+ * </code>
+ *
+ * ValidatorFactory instances should be cached and reused in your application.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @deprecated Deprecated since version 2.1, to be removed in 2.3. Use
+ *             {@link Validation::createValidatorBuilder()} instead.
+ */
+class ValidatorFactory implements ValidatorContextInterface
+{
+    /**
+     * Holds the context with the default configuration
+     * @var ValidatorContextInterface
+     */
+    protected $defaultContext;
+
+    /**
+     * Builds a validator factory with the default mapping loaders
+     *
+     * @param array $mappingFiles A list of XML or YAML file names
+     *                                      where mapping information can be
+     *                                      found. Can be empty.
+     * @param Boolean $annotations Whether to use annotations for
+     *                                      retrieving mapping information
+     * @param string $staticMethod The name of the static method to
+     *                                      use, if static method loading should
+     *                                      be enabled
+     *
+     * @return ValidatorFactory             The validator factory.
+     *
+     * @throws MappingException             If any of the files in $mappingFiles
+     *                                      has neither the extension ".xml" nor
+     *                                      ".yml" nor ".yaml"
+     * @throws \RuntimeException            If annotations are not supported.
+     *
+     * @deprecated Deprecated since version 2.1, to be removed in 2.3. Use
+     *             {@link Validation::createValidatorBuilder()} instead.
+     */
+    public static function buildDefault(array $mappingFiles = array(), $annotations = false, $staticMethod = null)
+    {
+        $xmlMappingFiles = array();
+        $yamlMappingFiles = array();
+        $loaders = array();
+        $context = new ValidatorContext();
+
+        foreach ($mappingFiles as $file) {
+            $extension = pathinfo($file, PATHINFO_EXTENSION);
+
+            if ($extension === 'xml') {
+                $xmlMappingFiles[] = $file;
+            } elseif ($extension === 'yaml' || $extension === 'yml') {
+                $yamlMappingFiles[] = $file;
+            } else {
+                throw new MappingException('The only supported mapping file formats are XML and YAML');
+            }
+        }
+
+        if (count($xmlMappingFiles) > 0) {
+            $loaders[] = new XmlFilesLoader($xmlMappingFiles);
+        }
+
+        if (count($yamlMappingFiles) > 0) {
+            $loaders[] = new YamlFilesLoader($yamlMappingFiles);
+        }
+
+        if ($annotations) {
+            if (!class_exists('Doctrine\Common\Annotations\AnnotationReader')) {
+                throw new \RuntimeException('Requested a ValidatorFactory with an AnnotationLoader, but the AnnotationReader was not found. You should add Doctrine Common to your project.');
+            }
+
+            $loaders[] = new AnnotationLoader(new AnnotationReader());
+        }
+
+        if ($staticMethod) {
+            $loaders[] = new StaticMethodLoader($staticMethod);
+        }
+
+        if (count($loaders) > 1) {
+            $loader = new LoaderChain($loaders);
+        } elseif (count($loaders) === 1) {
+            $loader = $loaders[0];
+        } else {
+            throw new MappingException('No mapping loader was found for the given parameters');
+        }
+
+        $context->setClassMetadataFactory(new ClassMetadataFactory($loader));
+        $context->setConstraintValidatorFactory(new ConstraintValidatorFactory());
+
+        return new static($context);
+    }
+
+    /**
+     * Sets the given context as default context
+     *
+     * @param ValidatorContextInterface $defaultContext A preconfigured context
+     *
+     * @deprecated Deprecated since version 2.1, to be removed in 2.3. Use
+     *             {@link Validation::createValidatorBuilder()} instead.
+     */
+    public function __construct(ValidatorContextInterface $defaultContext = null)
+    {
+        $this->defaultContext = null === $defaultContext ? new ValidatorContext() : $defaultContext;
+    }
+
+    /**
+     * Overrides the class metadata factory of the default context and returns
+     * the new context
+     *
+     * @param ClassMetadataFactoryInterface $metadataFactory The new factory instance
+     *
+     * @return ValidatorContextInterface                       The preconfigured form context
+     *
+     * @deprecated Deprecated since version 2.1, to be removed in 2.3. Use
+     *             {@link Validation::createValidatorBuilder()} instead.
+     */
+    public function setClassMetadataFactory(ClassMetadataFactoryInterface $metadataFactory)
+    {
+        $context = clone $this->defaultContext;
+
+        return $context->setClassMetadataFactory($metadataFactory);
+    }
+
+    /**
+     * Overrides the constraint validator factory of the default context and
+     * returns the new context
+     *
+     * @param ClassMetadataFactoryInterface $validatorFactory The new factory instance
+     *
+     * @return ValidatorContextInterface                        The preconfigured form context
+     *
+     * @deprecated Deprecated since version 2.1, to be removed in 2.3. Use
+     *             {@link Validation::createValidatorBuilder()} instead.
+     */
+    public function setConstraintValidatorFactory(ConstraintValidatorFactoryInterface $validatorFactory)
+    {
+        $context = clone $this->defaultContext;
+
+        return $context->setConstraintValidatorFactory($validatorFactory);
+    }
+
+    /**
+     * Creates a new validator with the settings stored in the default context
+     *
+     * @return ValidatorInterface  The new validator
+     *
+     * @deprecated Deprecated since version 2.1, to be removed in 2.3. Use
+     *             {@link Validation::createValidator()} instead.
+     */
+    public function getValidator()
+    {
+        return $this->defaultContext->getValidator();
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/ValidatorInterface.php b/core/vendor/symfony/validator/Symfony/Component/Validator/ValidatorInterface.php
new file mode 100644
index 0000000..b56c580
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/ValidatorInterface.php
@@ -0,0 +1,101 @@
+<?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;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * Validates values and graphs of objects and arrays.
+ *
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ *
+ * @api
+ */
+interface ValidatorInterface
+{
+    /**
+     * Validates a value.
+     *
+     * The accepted values depend on the {@link MetadataFactoryInterface}
+     * implementation.
+     *
+     * @param mixed      $value    The value to validate
+     * @param array|null $groups   The validation groups to validate.
+     * @param Boolean    $traverse Whether to traverse the value if it is traversable.
+     * @param Boolean    $deep     Whether to traverse nested traversable values recursively.
+     *
+     * @return ConstraintViolationListInterface A list of constraint violations. If the
+     *                                          list is empty, validation succeeded.
+     *
+     * @api
+     */
+    public function validate($value, $groups = null, $traverse = false, $deep = false);
+
+    /**
+     * Validates a property of a value against its current value.
+     *
+     * The accepted values depend on the {@link MetadataFactoryInterface}
+     * implementation.
+     *
+     * @param mixed      $containingValue The value containing the property.
+     * @param string     $property        The name of the property to validate.
+     * @param array|null $groups          The validation groups to validate.
+     *
+     * @return ConstraintViolationListInterface A list of constraint violations. If the
+     *                                          list is empty, validation succeeded.
+     *
+     * @api
+     */
+    public function validateProperty($containingValue, $property, $groups = null);
+
+    /**
+     * Validate a property of a value against a potential value.
+     *
+     * The accepted values depend on the {@link MetadataFactoryInterface}
+     * implementation.
+     *
+     * @param string     $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.
+     * @param array|null $groups          The validation groups to validate.
+     *
+     * @return ConstraintViolationListInterface A list of constraint violations. If the
+     *                                          list is empty, validation succeeded.
+     *
+     * @api
+     */
+    public function validatePropertyValue($containingValue, $property, $value, $groups = null);
+
+    /**
+     * Validates a value against a constraint or a list of constraints.
+     *
+     * @param mixed                   $value       The value to validate.
+     * @param Constraint|Constraint[] $constraints The constraint(s) to validate against.
+     * @param array|null              $groups      The validation groups to validate.
+     *
+     * @return ConstraintViolationListInterface A list of constraint violations. If the
+     *                                          list is empty, validation succeeded.
+     *
+     * @api
+     */
+    public function validateValue($value, $constraints, $groups = null);
+
+    /**
+     * Returns the factory for metadata instances.
+     *
+     * @return MetadataFactoryInterface The metadata factory.
+     *
+     * @api
+     */
+    public function getMetadataFactory();
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/composer.json b/core/vendor/symfony/validator/Symfony/Component/Validator/composer.json
new file mode 100644
index 0000000..a52d33b
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/composer.json
@@ -0,0 +1,41 @@
+{
+    "name": "symfony/validator",
+    "type": "library",
+    "description": "Symfony Validator Component",
+    "keywords": [],
+    "homepage": "http://symfony.com",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Fabien Potencier",
+            "email": "fabien@symfony.com"
+        },
+        {
+            "name": "Symfony Community",
+            "homepage": "http://symfony.com/contributors"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.3"
+    },
+    "require-dev": {
+        "symfony/http-foundation": "2.2.*",
+        "symfony/locale": "2.2.*",
+        "symfony/yaml": "2.2.*"
+    },
+    "suggest": {
+        "doctrine/common": ">=2.1,<2.4-dev",
+        "symfony/http-foundation": "2.2.*",
+        "symfony/yaml": "2.2.*"
+    },
+    "autoload": {
+        "psr-0": { "Symfony\\Component\\Validator\\": "" }
+    },
+    "target-dir": "Symfony/Component/Validator",
+    "minimum-stability": "dev",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "2.2-dev"
+        }
+    }
+}
diff --git a/core/vendor/symfony/validator/Symfony/Component/Validator/phpunit.xml.dist b/core/vendor/symfony/validator/Symfony/Component/Validator/phpunit.xml.dist
new file mode 100644
index 0000000..c7f1cef
--- /dev/null
+++ b/core/vendor/symfony/validator/Symfony/Component/Validator/phpunit.xml.dist
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit backupGlobals="false"
+         backupStaticAttributes="false"
+         colors="true"
+         convertErrorsToExceptions="true"
+         convertNoticesToExceptions="true"
+         convertWarningsToExceptions="true"
+         processIsolation="false"
+         stopOnFailure="false"
+         syntaxCheck="false"
+         bootstrap="vendor/autoload.php"
+>
+    <testsuites>
+        <testsuite name="Symfony Validator Component Test Suite">
+            <directory>./Tests/</directory>
+        </testsuite>
+    </testsuites>
+
+    <filter>
+        <whitelist>
+            <directory>./</directory>
+            <exclude>
+                <directory>./vendor</directory>
+                <directory>./Tests</directory>
+            </exclude>
+        </whitelist>
+    </filter>
+</phpunit>
