--- a/adm/style/acp_avatar_options_local.html
+++ b/adm/style/acp_avatar_options_local.html
@@ -12,7 +12,7 @@
 	<!-- BEGIN avatar_local_col -->
 		<li>
 			<label for="av-{avatar_local_row.S_ROW_COUNT}-{avatar_local_row.avatar_local_col.S_ROW_COUNT}"><img src="{avatar_local_row.avatar_local_col.AVATAR_IMAGE}" alt="" /><br />
-			<input type="radio" name="avatar_local_file" id="av-{avatar_local_row.S_ROW_COUNT}-{avatar_local_row.avatar_local_col.S_ROW_COUNT}" value="{avatar_local_row.avatar_local_col.AVATAR_FILE}" /></label>
+			<input type="radio" name="avatar_local_file" id="av-{avatar_local_row.S_ROW_COUNT}-{avatar_local_row.avatar_local_col.S_ROW_COUNT}" value="{avatar_local_row.avatar_local_col.AVATAR_FILE}"<!-- IF avatar_local_row.avatar_local_col.CHECKED -->checked="checked"<!-- ENDIF --> /></label>
 		</li>
 	<!-- END avatar_local_col -->
 	<!-- END avatar_local_row -->
--- a/adm/style/acp_ban.html
+++ b/adm/style/acp_ban.html
@@ -52,7 +52,7 @@
 	<legend>{L_TITLE}</legend>
 <dl>
 	<dt><label for="ban">{L_BAN_CELL}{L_COLON}</label></dt>
-	<dd><textarea name="ban" cols="40" rows="3" id="ban"></textarea></dd>
+	<dd><!-- EVENT acp_ban_cell_prepend --><textarea name="ban" cols="40" rows="3" id="ban"></textarea><!-- EVENT acp_ban_cell_append --></dd>
 	<!-- IF S_USERNAME_BAN --><dd>[ <a href="{U_FIND_USERNAME}" onclick="find_username(this.href); return false;">{L_FIND_USERNAME}</a> ]</dd><!-- ENDIF -->
 </dl>
 <dl>
--- a/adm/style/acp_captcha.html
+++ b/adm/style/acp_captcha.html
@@ -8,6 +8,13 @@
 
 <p>{L_ACP_VC_EXT_GET_MORE}</p>
 
+<!-- IF ERROR_MSG -->
+<div class="errorbox">
+	<h3>{L_WARNING}</h3>
+	<p>{ERROR_MSG}</p>
+</div>
+<!-- ENDIF -->
+
 <form id="acp_captcha" method="post" action="{U_ACTION}">
 
 <fieldset>
--- a/adm/style/acp_email.html
+++ b/adm/style/acp_email.html
@@ -19,12 +19,14 @@
 	<legend>{L_COMPOSE}</legend>
 <dl>
 	<dt><label for="group">{L_SEND_TO_GROUP}{L_COLON}</label></dt>
+	<!-- EVENT acp_email_group_options_prepend -->
 	<dd><select id="group" name="g">{S_GROUP_OPTIONS}</select></dd>
+	<!-- EVENT acp_email_group_options_append -->
 </dl>
 <dl>
 	<dt><label for="usernames">{L_SEND_TO_USERS}{L_COLON}</label><br /><span>{L_SEND_TO_USERS_EXPLAIN}</span></dt>
 	<dd><textarea name="usernames" id="usernames" rows="5" cols="40">{USERNAMES}</textarea></dd>
-	<dd>[ <a href="{U_FIND_USERNAME}" onclick="find_username(this.href); return false;">{L_FIND_USERNAME}</a> ]</dd>
+	<dd><!-- EVENT acp_email_find_username_prepend -->[ <a href="{U_FIND_USERNAME}" onclick="find_username(this.href); return false;">{L_FIND_USERNAME}</a> ]<!-- EVENT acp_email_find_username_append --></dd>
 </dl>
 <dl>
 	<dt><label for="subject">{L_SUBJECT}{L_COLON}</label></dt>
--- a/adm/style/acp_ext_list.html
+++ b/adm/style/acp_ext_list.html
@@ -47,8 +47,8 @@
 			<td class="row3" colspan="4"><strong>{L_EXTENSIONS_ENABLED}</strong></td>
 		</tr>
 		<!-- BEGIN enabled -->
-		<tr class="ext_enabled">
-			<td><strong>{enabled.META_DISPLAY_NAME}</strong></td>
+		<tr class="ext_enabled row-highlight">
+			<td><strong title="{enabled.NAME}">{enabled.META_DISPLAY_NAME}</strong></td>
 			<td style="text-align: center;">
 				<!-- IF enabled.S_VERSIONCHECK -->
 				<strong <!-- IF enabled.S_UP_TO_DATE -->style="color: #228822;"<!-- ELSE -->style="color: #BC2A4D;"<!-- ENDIF -->>{enabled.META_VERSION}</strong>
@@ -72,8 +72,8 @@
 			<td class="row3" colspan="4"><strong>{L_EXTENSIONS_DISABLED}</strong></td>
 		</tr>
 		<!-- BEGIN disabled -->
-		<tr class="ext_disabled">
-			<td><strong>{disabled.META_DISPLAY_NAME}</strong></td>
+		<tr class="ext_disabled row-highlight">
+			<td><strong title="{disabled.NAME}">{disabled.META_DISPLAY_NAME}</strong></td>
 			<td style="text-align: center;">
 				<!-- IF disabled.S_VERSIONCHECK -->
 				<strong <!-- IF disabled.S_UP_TO_DATE -->style="color: #228822;"<!-- ELSE -->style="color: #BC2A4D;"<!-- ENDIF -->>{disabled.META_VERSION}</strong>
--- a/adm/style/acp_forums.html
+++ b/adm/style/acp_forums.html
@@ -498,7 +498,7 @@
 	<fieldset class="quick">
 		{L_SELECT_FORUM}{L_COLON} <select name="parent_id" onchange="if(this.options[this.selectedIndex].value != -1){ this.form.submit(); }">{FORUM_BOX}</select>
 
-		<input class="button2" type="submit" value="{L_GO}" />
+		<!-- EVENT acp_forums_quick_select_button_prepend --><input class="button2" type="submit" value="{L_GO}" /><!-- EVENT acp_forums_quick_select_button_append -->
 		{S_FORM_TOKEN}
 	</fieldset>
 	</form>
--- a/adm/style/acp_groups.html
+++ b/adm/style/acp_groups.html
@@ -236,7 +236,7 @@
 	<dl>
 		<dt><label for="usernames">{L_USERNAME}{L_COLON}</label><br /><span>{L_USERNAMES_EXPLAIN}</span></dt>
 		<dd><textarea id="usernames" name="usernames" cols="40" rows="5"></textarea></dd>
-		<dd>[ <a href="{U_FIND_USERNAME}" onclick="find_username(this.href); return false;">{L_FIND_USERNAME}</a> ]</dd>
+		<dd><!-- EVENT acp_groups_find_username_prepend -->[ <a href="{U_FIND_USERNAME}" onclick="find_username(this.href); return false;">{L_FIND_USERNAME}</a> ]<!-- EVENT acp_groups_find_username_append --></dd>
 	</dl>
 
 	<p class="quick">
@@ -265,6 +265,7 @@
 
 	<form id="acp_groups" method="post" action="{U_ACTION}">
 
+	<!-- EVENT acp_groups_manage_before -->
 	<table class="table1">
 		<col class="col1" /><col class="col1" /><col class="col2" /><col class="col2" /><col class="col2" />
 	<thead>
@@ -285,6 +286,7 @@
 		<!-- ENDIF -->
 	</tbody>
 	</table>
+	<!-- EVENT acp_groups_manage_after -->
 
 	<fieldset class="quick">
 		<!-- IF S_GROUP_ADD -->
--- a/adm/style/acp_groups_position.html
+++ b/adm/style/acp_groups_position.html
@@ -65,8 +65,10 @@
 					<option<!-- IF add_legend.GROUP_SPECIAL --> class="sep"<!-- ENDIF --> value="{add_legend.GROUP_ID}">{add_legend.GROUP_NAME}</option>
 				<!-- END add_legend -->
 			</select>
+			<!-- EVENT acp_groups_position_legend_add_button_before -->
 			<input class="button2" type="submit" name="submit" value="{L_ADD}" />
 			<input type="hidden" name="action" value="add" />
+			<!-- EVENT acp_groups_position_legend_add_button_after -->
 			{S_FORM_TOKEN}
 		</fieldset>
 	</form>
@@ -162,8 +164,10 @@
 					<option<!-- IF add_teampage.GROUP_SPECIAL --> class="sep"<!-- ENDIF --> value="{add_teampage.GROUP_ID}">{add_teampage.GROUP_NAME}</option>
 				<!-- END add_teampage -->
 			</select>
+			<!-- EVENT acp_groups_position_teampage_add_button_before -->
 			<input class="button2" type="submit" name="submit" value="{L_ADD}" />
 			<input type="hidden" name="action" value="add" />
+			<!-- EVENT acp_groups_position_teampage_add_button_after -->
 			{S_FORM_TOKEN}
 		</fieldset>
 	</form>
--- a/adm/style/acp_inactive.html
+++ b/adm/style/acp_inactive.html
@@ -18,6 +18,7 @@
 <thead>
 <tr>
 	<th>{L_USERNAME}</th>
+	<th>{L_EMAIL}</th>
 	<th>{L_JOINED}</th>
 	<th>{L_INACTIVE_DATE}</th>
 	<th>{L_LAST_VISIT}</th>
@@ -32,6 +33,7 @@
 			{inactive.USERNAME_FULL}
 			<!-- IF inactive.POSTS --><br />{L_POSTS}{L_COLON} <strong>{inactive.POSTS}</strong> [<a href="{inactive.U_SEARCH_USER}">{L_SEARCH_USER_POSTS}</a>]<!-- ENDIF -->
 		</td>
+		<td style="vertical-align: top;">{inactive.USER_EMAIL}</td>
 		<td style="vertical-align: top;">{inactive.JOINED}</td>
 		<td style="vertical-align: top;">{inactive.INACTIVE_DATE}</td>
 		<td style="vertical-align: top;">{inactive.LAST_VISIT}</td>
--- a/adm/style/acp_logs.html
+++ b/adm/style/acp_logs.html
@@ -73,7 +73,7 @@
 <!-- IF S_SHOW_FORUMS -->
 	<fieldset class="quick">
 		{L_SELECT_FORUM}{L_COLON} <select name="f" onchange="if(this.options[this.selectedIndex].value != -1){ this.form.submit(); }">{S_FORUM_BOX}</select>
-		<input class="button2" type="submit" value="{L_GO}" />
+		<!-- EVENT acp_logs_quick_select_forum_button_prepend --><input class="button2" type="submit" value="{L_GO}" /><!-- EVENT acp_logs_quick_select_forum_button_append -->
 	</fieldset>
 <!-- ENDIF -->
 
--- a/adm/style/acp_main.html
+++ b/adm/style/acp_main.html
@@ -141,19 +141,24 @@
 		<td>{L_GZIP_COMPRESSION}{L_COLON} </td>
 		<td><strong>{GZIP_COMPRESSION}</strong></td>
 	</tr>
+	<!-- IF S_TOTAL_ORPHAN or S_VERSIONCHECK -->
 	<tr>
+	<!-- IF S_VERSIONCHECK -->
 		<td>{L_BOARD_VERSION}{L_COLON} </td>
 		<td>
-			<strong><a href="{U_VERSIONCHECK}" <!-- IF S_VERSION_UP_TO_DATE -->style="color: #228822;"<!-- ELSE -->style="color: #BC2A4D;"<!-- ENDIF --> title="{L_MORE_INFORMATION}">{BOARD_VERSION}</a></strong> [&nbsp;<a href="{U_VERSIONCHECK_FORCE}">{L_VERSIONCHECK_FORCE_UPDATE}</a>&nbsp;]
+			<strong><a href="{U_VERSIONCHECK}" <!-- IF S_VERSION_UP_TO_DATE -->style="color: #228822;" <!-- ELSEIF not S_VERSIONCHECK_FAIL -->style="color: #BC2A4D;" <!-- ENDIF -->title="{L_MORE_INFORMATION}">{BOARD_VERSION}</a></strong> [&nbsp;<a href="{U_VERSIONCHECK_FORCE}">{L_VERSIONCHECK_FORCE_UPDATE}</a>&nbsp;]
 		</td>
+	<!-- ENDIF -->
 	<!-- IF S_TOTAL_ORPHAN -->
 		<td>{L_NUMBER_ORPHAN}{L_COLON} </td>
 		<td><strong>{TOTAL_ORPHAN}</strong></td>
-	<!-- ELSE -->
+	<!-- ENDIF -->
+	<!-- IF not S_TOTAL_ORPHAN or not S_VERSIONCHECK -->
 		<td>&nbsp;</td>
 		<td>&nbsp;</td>
 	<!-- ENDIF -->
 	</tr>
+	<!-- ENDIF -->
 	</tbody>
 	</table>
 
--- a/adm/style/acp_permissions.html
+++ b/adm/style/acp_permissions.html
@@ -30,7 +30,7 @@
 			<legend>{L_LOOK_UP_FORUM}</legend>
 			<!-- IF S_FORUM_MULTIPLE --><p>{L_LOOK_UP_FORUMS_EXPLAIN}</p><!-- ENDIF -->
 		<dl>
-			<dt><label for="forum">{L_LOOK_UP_FORUM}{L_COLON}</label></dt>
+			<dt><!-- EVENT acp_permissions_select_multiple_forum_prepend --><label for="forum">{L_LOOK_UP_FORUM}{L_COLON}</label><!-- EVENT acp_permissions_select_multiple_forum_append --></dt>
 			<dd><select id="forum" name="forum_id[]"<!-- IF S_FORUM_MULTIPLE --> multiple="multiple"<!-- ENDIF --> size="10">{S_FORUM_OPTIONS}</select></dd>
 			<!-- IF S_FORUM_ALL --><dd><label><input type="checkbox" class="radio" name="all_forums" value="1" /> {L_ALL_FORUMS}</label></dd><!-- ENDIF -->
 		</dl>
@@ -52,7 +52,7 @@
 				<legend>{L_LOOK_UP_FORUM}</legend>
 				<p>{L_SELECT_FORUM_SUBFORUM_EXPLAIN}</p>
 			<dl>
-				<dt><label for="sforum">{L_LOOK_UP_FORUM}{L_COLON}</label></dt>
+				<dt><!-- EVENT acp_permissions_select_forum_prepend --><label for="sforum">{L_LOOK_UP_FORUM}{L_COLON}</label><!-- EVENT acp_permissions_select_forum_append --></dt>
 				<dd><select id="sforum" name="subforum_id">{S_SUBFORUM_OPTIONS}</select></dd>
 			</dl>
 
@@ -95,7 +95,7 @@
 		<fieldset>
 			<legend>{L_LOOK_UP_GROUP}</legend>
 		<dl>
-			<dt><label for="group">{L_LOOK_UP_GROUP}{L_COLON}</label></dt>
+			<dt><!-- EVENT acp_permissions_select_group_prepend --><label for="group">{L_LOOK_UP_GROUP}{L_COLON}</label><!-- EVENT acp_permissions_select_group_append --></dt>
 			<dd><select name="group_id[]" id="group">{S_GROUP_OPTIONS}</select></dd>
 		</dl>
 
@@ -140,7 +140,7 @@
 				<p>{L_USERNAMES_EXPLAIN}</p>
 			<dl>
 				<dd class="full"><textarea id="username" name="usernames" rows="5" cols="5" style="width: 100%; height: 60px;"></textarea></dd>
-				<dd class="full" style="text-align: left;"><div style="float: {S_CONTENT_FLOW_END};">[ <a href="{U_FIND_USERNAME}" onclick="find_username(this.href); return false;">{L_FIND_USERNAME}</a> ]</div><label><input type="checkbox" class="radio" id="anonymous" name="user_id[]" value="{ANONYMOUS_USER_ID}" /> {L_SELECT_ANONYMOUS}</label></dd>
+				<dd class="full" style="text-align: left;"><!-- EVENT acp_permissions_find_username_prepend --><div style="float: {S_CONTENT_FLOW_END};">[ <a href="{U_FIND_USERNAME}" onclick="find_username(this.href); return false;">{L_FIND_USERNAME}</a> ]</div><!-- EVENT acp_permissions_find_username_append --><label><input type="checkbox" class="radio" id="anonymous" name="user_id[]" value="{ANONYMOUS_USER_ID}" /> {L_SELECT_ANONYMOUS}</label></dd>
 			</dl>
 			</fieldset>
 
@@ -183,7 +183,7 @@
 			<fieldset>
 				<legend>{L_ADD_GROUPS}</legend>
 			<dl>
-				<dd class="full"><select name="group_id[]" style="width: 100%; height: 107px;" multiple="multiple">{S_ADD_GROUP_OPTIONS}</select></dd>
+				<dd class="full"><!-- EVENT acp_permissions_add_group_options_prepend --><select name="group_id[]" style="width: 100%; height: 107px;" multiple="multiple">{S_ADD_GROUP_OPTIONS}</select><!-- EVENT acp_permissions_add_group_options_append --></dd>
 			</dl>
 			</fieldset>
 
@@ -267,7 +267,9 @@
 				<legend>{L_LOOK_UP_GROUP}</legend>
 			<dl>
 				<dt><label for="group_select">{L_LOOK_UP_GROUP}{L_COLON}</label></dt>
+				<!-- EVENT acp_permissions_select_group_before -->
 				<dd><select name="group_id[]" id="group_select">{S_ADD_GROUP_OPTIONS}</select></dd>
+				<!-- EVENT acp_permissions_select_group_after -->
 				<dd>&nbsp;</dd>
 			</dl>
 			</fieldset>
--- a/adm/style/acp_profile.html
+++ b/adm/style/acp_profile.html
@@ -17,7 +17,7 @@
 		</div>
 	<!-- ENDIF -->
 
-	<form id="add_profile_field" method="post" action="{U_ACTION}">
+	<form id="add_profile_field" method="post" action="{U_ACTION}"{S_FORM_ENCTYPE}>
 
 	<!-- IF S_STEP_ONE -->
 
--- a/adm/style/acp_prune_forums.html
+++ b/adm/style/acp_prune_forums.html
@@ -43,7 +43,7 @@
 		<legend>{L_SELECT_FORUM}</legend>
 		<p>{L_LOOK_UP_FORUMS_EXPLAIN}</p>
 	<dl>
-		<dt><label for="forum">{L_LOOK_UP_FORUM}{L_COLON}</label></dt>
+		<dt><!-- EVENT acp_prune_forums_prepend --><label for="forum">{L_LOOK_UP_FORUM}{L_COLON}</label><!-- EVENT acp_prune_forums_append --></dt>
 		<dd><select id="forum" name="f[]" multiple="multiple" size="10">{S_FORUM_OPTIONS}</select></dd>
 		<dd><label><input type="checkbox" class="radio" name="all_forums" value="1" /> {L_ALL_FORUMS}</label></dd>
 	</dl>
--- a/adm/style/acp_prune_users.html
+++ b/adm/style/acp_prune_users.html
@@ -50,7 +50,7 @@
 <dl>
 	<dt><label for="users">{L_ACP_PRUNE_USERS}{L_COLON}</label><br /><span>{L_SELECT_USERS_EXPLAIN}</span></dt>
 	<dd><textarea id="users" name="users" cols="40" rows="5"></textarea></dd>
-	<dd>[ <a href="{U_FIND_USERNAME}" onclick="find_username(this.href); return false;">{L_FIND_USERNAME}</a> ]</dd>
+	<dd><!-- EVENT acp_prune_users_find_username_prepend -->[ <a href="{U_FIND_USERNAME}" onclick="find_username(this.href); return false;">{L_FIND_USERNAME}</a> ]<!-- EVENT acp_prune_users_find_username_append --></dd>
 </dl>
 </fieldset>
 
--- a/adm/style/acp_styles.html
+++ b/adm/style/acp_styles.html
@@ -87,6 +87,7 @@
 <!-- ENDIF -->
 
 <!-- IF .styles_list -->
+	<!-- EVENT acp_styles_list_before -->
 	<table class="table1 styles">
 	<thead>
 	<tr>
@@ -99,7 +100,7 @@
 	</thead>
 	<!-- BEGIN styles_list -->
 	<tbody id="styles-list-{styles_list.S_ROW_COUNT}">
-	<tr<!-- IF styles_list.STYLE_ID and not styles_list.STYLE_ACTIVE --> class="row-inactive"<!-- ENDIF -->>
+	<tr class="row-highlight<!-- IF styles_list.STYLE_ID and not styles_list.STYLE_ACTIVE --> row-inactive<!-- ENDIF -->">
 		<!-- IF styles_list.LEVEL is odd -->
 			<!-- IF $ROW_CLASS == 'row1a' --><!-- DEFINE $ROW_CLASS = 'row1b' --><!-- ELSE --><!-- DEFINE $ROW_CLASS = 'row1a' --><!-- ENDIF -->
 		<!-- ELSE -->
--- a/adm/style/acp_users.html
+++ b/adm/style/acp_users.html
@@ -146,7 +146,9 @@
 
 	<!-- IF S_GROUP_OPTIONS -->
 		<fieldset class="quick">
+			<!-- EVENT acp_users_select_group_before -->
 			{L_USER_GROUP_ADD}{L_COLON} <select name="g">{S_GROUP_OPTIONS}</select> <input class="button1" type="submit" name="update" value="{L_SUBMIT}" />
+			<!-- EVENT acp_users_select_group_after -->
 			{S_FORM_TOKEN}
 		</fieldset>
 	<!-- ENDIF -->
--- a/adm/style/acp_users_profile.html
+++ b/adm/style/acp_users_profile.html
@@ -1,4 +1,4 @@
-	<form id="user_profile" method="post" action="{U_ACTION}">
+	<form id="user_profile" method="post" action="{U_ACTION}"{S_FORM_ENCTYPE}>
 
 	<fieldset>
 		<legend>{L_USER_PROFILE}</legend>
--- a/adm/style/admin.css
+++ b/adm/style/admin.css
@@ -859,6 +859,8 @@ table.zebra-table tbody tr:nth-child(even) {
 .row2a { background-color: #E7EEF4; }
 .row2b { background-color: #E3EBF2; }
 
+tr.row-highlight:hover td { background-color: #DBDFE2; }
+
 .spacer {
 	background-color: #DBDFE2;
 	height: 1px;
--- a/adm/style/permission_forum_copy.html
+++ b/adm/style/permission_forum_copy.html
@@ -12,7 +12,7 @@
 		<legend>{L_LOOK_UP_FORUM}</legend>
 
 		<dl>
-			<dt><label for="src_forum">{L_COPY_PERMISSIONS_FROM}{L_COLON}</label><br /><span>{L_COPY_PERMISSIONS_FORUM_FROM_EXPLAIN}</span></dt>
+			<dt><!-- EVENT acp_permission_forum_copy_src_forum_prepend --><label for="src_forum">{L_COPY_PERMISSIONS_FROM}{L_COLON}</label><br /><span>{L_COPY_PERMISSIONS_FORUM_FROM_EXPLAIN}</span><!-- EVENT acp_permission_forum_copy_src_forum_append --></dt>
 			<dd><select id="src_forum" name="src_forum_id"><option value="0">{L_SELECT_FORUM}</option><option value="-1">------------------</option>{S_FORUM_OPTIONS}</select></dd>
 		</dl>
 	</fieldset>
@@ -22,7 +22,7 @@
 		<p>{L_LOOK_UP_FORUMS_EXPLAIN}</p>
 
 		<dl>
-			<dt><label for="dest_forums">{L_COPY_PERMISSIONS_TO}{L_COLON}</label><br /><span>{L_COPY_PERMISSIONS_FORUM_TO_EXPLAIN}</span></dt>
+			<dt><!-- EVENT acp_permission_forum_copy_dest_forum_prepend --><label for="dest_forums">{L_COPY_PERMISSIONS_TO}{L_COLON}</label><br /><span>{L_COPY_PERMISSIONS_FORUM_TO_EXPLAIN}</span><!-- EVENT acp_permission_forum_copy_dest_forum_append --></dt>
 			<dd><select id="dest_forums" name="dest_forum_ids[]" multiple="multiple" size="10">{S_FORUM_OPTIONS}</select></dd>
 		</dl>
 	</fieldset>
--- a/assets/javascript/core.js
+++ b/assets/javascript/core.js
@@ -303,6 +303,10 @@ phpbb.ajaxify = function(options) {
 					alert = phpbb.alert(res.MESSAGE_TITLE, res.MESSAGE_TEXT);
 				} else {
 					$dark.fadeOut(phpbb.alertTime);
+
+					if ($loadingIndicator) {
+						$loadingIndicator.fadeOut(phpbb.alertTime);
+					}
 				}
 
 				if (typeof phpbb.ajaxCallbacks[callback] === 'function') {
--- a/composer.json
+++ b/composer.json
@@ -25,7 +25,7 @@
 		"phpbb/phpbb-core": "self.version"
 	},
 	"require": {
-		"php": ">=5.3.3",
+		"php": ">=5.3.3,<7.0",
 		"lusitanian/oauth": "0.2.*",
 		"symfony/config": "2.3.*",
 		"symfony/console": "2.3.*",
--- a/composer.lock
+++ b/composer.lock
@@ -109,17 +109,17 @@
         },
         {
             "name": "symfony/config",
-            "version": "v2.3.21",
+            "version": "v2.3.35",
             "target-dir": "Symfony/Component/Config",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/Config.git",
-                "reference": "f9fac999dbc2c6aabd749c034d938b5f9aa5fb7d"
+                "url": "https://github.com/symfony/config.git",
+                "reference": "665b906c22103bb36eaeff31cc3063b53ed4eae5"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/Config/zipball/f9fac999dbc2c6aabd749c034d938b5f9aa5fb7d",
-                "reference": "f9fac999dbc2c6aabd749c034d938b5f9aa5fb7d",
+                "url": "https://api.github.com/repos/symfony/config/zipball/665b906c22103bb36eaeff31cc3063b53ed4eae5",
+                "reference": "665b906c22103bb36eaeff31cc3063b53ed4eae5",
                 "shasum": ""
             },
             "require": {
@@ -135,7 +135,10 @@
             "autoload": {
                 "psr-0": {
                     "Symfony\\Component\\Config\\": ""
-                }
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -143,31 +146,31 @@
             ],
             "authors": [
                 {
-                    "name": "Symfony Community",
-                    "homepage": "http://symfony.com/contributors"
-                },
-                {
                     "name": "Fabien Potencier",
                     "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
                 }
             ],
             "description": "Symfony Config Component",
-            "homepage": "http://symfony.com",
-            "time": "2014-09-23 05:15:05"
+            "homepage": "https://symfony.com",
+            "time": "2015-11-18 08:19:46"
         },
         {
             "name": "symfony/console",
-            "version": "v2.3.21",
+            "version": "v2.3.35",
             "target-dir": "Symfony/Component/Console",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/Console.git",
-                "reference": "aa12ac573c583a74c2cb26ad9be478e119f04ad1"
+                "url": "https://github.com/symfony/console.git",
+                "reference": "ed9c6cad324afb02672fa8ebf55fe0feb1659067"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/Console/zipball/aa12ac573c583a74c2cb26ad9be478e119f04ad1",
-                "reference": "aa12ac573c583a74c2cb26ad9be478e119f04ad1",
+                "url": "https://api.github.com/repos/symfony/console/zipball/ed9c6cad324afb02672fa8ebf55fe0feb1659067",
+                "reference": "ed9c6cad324afb02672fa8ebf55fe0feb1659067",
                 "shasum": ""
             },
             "require": {
@@ -188,7 +191,10 @@
             "autoload": {
                 "psr-0": {
                     "Symfony\\Component\\Console\\": ""
-                }
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -196,39 +202,42 @@
             ],
             "authors": [
                 {
-                    "name": "Symfony Community",
-                    "homepage": "http://symfony.com/contributors"
-                },
-                {
                     "name": "Fabien Potencier",
                     "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
                 }
             ],
             "description": "Symfony Console Component",
-            "homepage": "http://symfony.com",
-            "time": "2014-10-05 13:45:10"
+            "homepage": "https://symfony.com",
+            "time": "2015-11-18 08:19:46"
         },
         {
             "name": "symfony/debug",
-            "version": "v2.3.21",
+            "version": "v2.3.35",
             "target-dir": "Symfony/Component/Debug",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/Debug.git",
-                "reference": "883f847ad179e92549a8cea372b08e5ef47ffe40"
+                "url": "https://github.com/symfony/debug.git",
+                "reference": "c0f543d3c40f5b885a68bc87ef1f2f8aec8e0424"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/Debug/zipball/883f847ad179e92549a8cea372b08e5ef47ffe40",
-                "reference": "883f847ad179e92549a8cea372b08e5ef47ffe40",
+                "url": "https://api.github.com/repos/symfony/debug/zipball/c0f543d3c40f5b885a68bc87ef1f2f8aec8e0424",
+                "reference": "c0f543d3c40f5b885a68bc87ef1f2f8aec8e0424",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.3"
             },
+            "conflict": {
+                "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
+            },
             "require-dev": {
                 "symfony/http-foundation": "~2.1",
-                "symfony/http-kernel": "~2.1"
+                "symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2"
             },
             "suggest": {
                 "symfony/class-loader": "",
@@ -244,7 +253,10 @@
             "autoload": {
                 "psr-0": {
                     "Symfony\\Component\\Debug\\": ""
-                }
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -252,31 +264,31 @@
             ],
             "authors": [
                 {
-                    "name": "Symfony Community",
-                    "homepage": "http://symfony.com/contributors"
-                },
-                {
                     "name": "Fabien Potencier",
                     "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
                 }
             ],
             "description": "Symfony Debug Component",
-            "homepage": "http://symfony.com",
-            "time": "2014-10-09 16:42:17"
+            "homepage": "https://symfony.com",
+            "time": "2015-11-18 08:19:46"
         },
         {
             "name": "symfony/dependency-injection",
-            "version": "v2.3.21",
+            "version": "v2.3.35",
             "target-dir": "Symfony/Component/DependencyInjection",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/DependencyInjection.git",
-                "reference": "e2324e1c8c39faa5f27e6170b278d7f631574141"
+                "url": "https://github.com/symfony/dependency-injection.git",
+                "reference": "d3c6bcab8f626c32e687f8b77d683f8a9f1f4be3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/DependencyInjection/zipball/e2324e1c8c39faa5f27e6170b278d7f631574141",
-                "reference": "e2324e1c8c39faa5f27e6170b278d7f631574141",
+                "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/d3c6bcab8f626c32e687f8b77d683f8a9f1f4be3",
+                "reference": "d3c6bcab8f626c32e687f8b77d683f8a9f1f4be3",
                 "shasum": ""
             },
             "require": {
@@ -284,7 +296,7 @@
             },
             "require-dev": {
                 "symfony/config": "~2.2",
-                "symfony/yaml": "~2.0"
+                "symfony/yaml": "~2.1"
             },
             "suggest": {
                 "symfony/config": "",
@@ -300,7 +312,10 @@
             "autoload": {
                 "psr-0": {
                     "Symfony\\Component\\DependencyInjection\\": ""
-                }
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -308,38 +323,38 @@
             ],
             "authors": [
                 {
-                    "name": "Symfony Community",
-                    "homepage": "http://symfony.com/contributors"
-                },
-                {
                     "name": "Fabien Potencier",
                     "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
                 }
             ],
             "description": "Symfony DependencyInjection Component",
-            "homepage": "http://symfony.com",
-            "time": "2014-10-01 05:38:33"
+            "homepage": "https://symfony.com",
+            "time": "2015-11-19 14:08:33"
         },
         {
             "name": "symfony/event-dispatcher",
-            "version": "v2.3.21",
+            "version": "v2.3.35",
             "target-dir": "Symfony/Component/EventDispatcher",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/EventDispatcher.git",
-                "reference": "3e0b837811fadd73c833c7c06a92201d953df59d"
+                "url": "https://github.com/symfony/event-dispatcher.git",
+                "reference": "08564581a8444035d0874efc35a6366be8c0af9e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/3e0b837811fadd73c833c7c06a92201d953df59d",
-                "reference": "3e0b837811fadd73c833c7c06a92201d953df59d",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/08564581a8444035d0874efc35a6366be8c0af9e",
+                "reference": "08564581a8444035d0874efc35a6366be8c0af9e",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.3"
             },
             "require-dev": {
-                "symfony/dependency-injection": "~2.0"
+                "symfony/dependency-injection": "~2.0,>=2.0.5"
             },
             "suggest": {
                 "symfony/dependency-injection": "",
@@ -354,7 +369,10 @@
             "autoload": {
                 "psr-0": {
                     "Symfony\\Component\\EventDispatcher\\": ""
-                }
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -362,31 +380,31 @@
             ],
             "authors": [
                 {
-                    "name": "Symfony Community",
-                    "homepage": "http://symfony.com/contributors"
-                },
-                {
                     "name": "Fabien Potencier",
                     "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
                 }
             ],
             "description": "Symfony EventDispatcher Component",
-            "homepage": "http://symfony.com",
-            "time": "2014-10-01 05:39:06"
+            "homepage": "https://symfony.com",
+            "time": "2015-11-18 08:19:46"
         },
         {
             "name": "symfony/filesystem",
-            "version": "v2.3.21",
+            "version": "v2.3.35",
             "target-dir": "Symfony/Component/Filesystem",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/Filesystem.git",
-                "reference": "1c3a5fab445d1d4a5d57f8fbf1379696c9785942"
+                "url": "https://github.com/symfony/filesystem.git",
+                "reference": "d72d4b276921c2388ac09a5a6716e10d57a6e89b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/Filesystem/zipball/1c3a5fab445d1d4a5d57f8fbf1379696c9785942",
-                "reference": "1c3a5fab445d1d4a5d57f8fbf1379696c9785942",
+                "url": "https://api.github.com/repos/symfony/filesystem/zipball/d72d4b276921c2388ac09a5a6716e10d57a6e89b",
+                "reference": "d72d4b276921c2388ac09a5a6716e10d57a6e89b",
                 "shasum": ""
             },
             "require": {
@@ -401,7 +419,10 @@
             "autoload": {
                 "psr-0": {
                     "Symfony\\Component\\Filesystem\\": ""
-                }
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -409,31 +430,31 @@
             ],
             "authors": [
                 {
-                    "name": "Symfony Community",
-                    "homepage": "http://symfony.com/contributors"
-                },
-                {
                     "name": "Fabien Potencier",
                     "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
                 }
             ],
             "description": "Symfony Filesystem Component",
-            "homepage": "http://symfony.com",
-            "time": "2014-09-22 08:32:35"
+            "homepage": "https://symfony.com",
+            "time": "2015-11-18 08:19:46"
         },
         {
             "name": "symfony/http-foundation",
-            "version": "v2.3.21",
+            "version": "v2.3.35",
             "target-dir": "Symfony/Component/HttpFoundation",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/HttpFoundation.git",
-                "reference": "30c90f08f948dd43e7310beae7a85c02ad2b655d"
+                "url": "https://github.com/symfony/http-foundation.git",
+                "reference": "2242d5d7b12ee2291bbaac161d94ea312a9c0d1f"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/30c90f08f948dd43e7310beae7a85c02ad2b655d",
-                "reference": "30c90f08f948dd43e7310beae7a85c02ad2b655d",
+                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/2242d5d7b12ee2291bbaac161d94ea312a9c0d1f",
+                "reference": "2242d5d7b12ee2291bbaac161d94ea312a9c0d1f",
                 "shasum": ""
             },
             "require": {
@@ -451,6 +472,9 @@
                 },
                 "classmap": [
                     "Symfony/Component/HttpFoundation/Resources/stubs"
+                ],
+                "exclude-from-classmap": [
+                    "/Tests/"
                 ]
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -459,50 +483,52 @@
             ],
             "authors": [
                 {
-                    "name": "Symfony Community",
-                    "homepage": "http://symfony.com/contributors"
-                },
-                {
                     "name": "Fabien Potencier",
                     "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
                 }
             ],
             "description": "Symfony HttpFoundation Component",
-            "homepage": "http://symfony.com",
-            "time": "2014-10-23 13:11:04"
+            "homepage": "https://symfony.com",
+            "time": "2015-11-19 16:24:57"
         },
         {
             "name": "symfony/http-kernel",
-            "version": "v2.3.21",
+            "version": "v2.3.35",
             "target-dir": "Symfony/Component/HttpKernel",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/HttpKernel.git",
-                "reference": "0154ff659004d4148e8da0f2bdb672efe55e6ee5"
+                "url": "https://github.com/symfony/http-kernel.git",
+                "reference": "a79bd3b40c73fd504d1e66ab6c40cdede509c600"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/0154ff659004d4148e8da0f2bdb672efe55e6ee5",
-                "reference": "0154ff659004d4148e8da0f2bdb672efe55e6ee5",
+                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/a79bd3b40c73fd504d1e66ab6c40cdede509c600",
+                "reference": "a79bd3b40c73fd504d1e66ab6c40cdede509c600",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.3",
                 "psr/log": "~1.0",
-                "symfony/debug": "~2.3",
+                "symfony/debug": "~2.3.24|~2.5.9|~2.6,>=2.6.2",
                 "symfony/event-dispatcher": "~2.1",
-                "symfony/http-foundation": "~2.2"
+                "symfony/http-foundation": "~2.3,>=2.3.4"
             },
             "require-dev": {
-                "symfony/browser-kit": "~2.2",
+                "symfony/browser-kit": "~2.3",
                 "symfony/class-loader": "~2.1",
-                "symfony/config": "~2.0",
+                "symfony/config": "~2.0,>=2.0.5",
                 "symfony/console": "~2.2",
-                "symfony/dependency-injection": "~2.0",
-                "symfony/finder": "~2.0",
-                "symfony/process": "~2.0",
+                "symfony/css-selector": "~2.0,>=2.0.5",
+                "symfony/dependency-injection": "~2.2",
+                "symfony/dom-crawler": "~2.0,>=2.0.5",
+                "symfony/finder": "~2.0,>=2.0.5",
+                "symfony/process": "~2.0,>=2.0.5",
                 "symfony/routing": "~2.2",
-                "symfony/stopwatch": "~2.2",
+                "symfony/stopwatch": "~2.3",
                 "symfony/templating": "~2.2"
             },
             "suggest": {
@@ -522,7 +548,10 @@
             "autoload": {
                 "psr-0": {
                     "Symfony\\Component\\HttpKernel\\": ""
-                }
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -530,31 +559,31 @@
             ],
             "authors": [
                 {
-                    "name": "Symfony Community",
-                    "homepage": "http://symfony.com/contributors"
-                },
-                {
                     "name": "Fabien Potencier",
                     "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
                 }
             ],
             "description": "Symfony HttpKernel Component",
-            "homepage": "http://symfony.com",
-            "time": "2014-10-24 05:54:08"
+            "homepage": "https://symfony.com",
+            "time": "2015-11-23 10:44:06"
         },
         {
             "name": "symfony/routing",
-            "version": "v2.3.21",
+            "version": "v2.3.35",
             "target-dir": "Symfony/Component/Routing",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/Routing.git",
-                "reference": "f7f8ebf9c99e5ebfdb908c3558a818c2883eab1f"
+                "url": "https://github.com/symfony/routing.git",
+                "reference": "08a4065c47b45a1785101aabb29082fe415cec6c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/Routing/zipball/f7f8ebf9c99e5ebfdb908c3558a818c2883eab1f",
-                "reference": "f7f8ebf9c99e5ebfdb908c3558a818c2883eab1f",
+                "url": "https://api.github.com/repos/symfony/routing/zipball/08a4065c47b45a1785101aabb29082fe415cec6c",
+                "reference": "08a4065c47b45a1785101aabb29082fe415cec6c",
                 "shasum": ""
             },
             "require": {
@@ -565,7 +594,7 @@
                 "psr/log": "~1.0",
                 "symfony/config": "~2.2",
                 "symfony/http-foundation": "~2.3",
-                "symfony/yaml": "~2.0"
+                "symfony/yaml": "~2.0,>=2.0.5"
             },
             "suggest": {
                 "doctrine/common": "",
@@ -581,7 +610,10 @@
             "autoload": {
                 "psr-0": {
                     "Symfony\\Component\\Routing\\": ""
-                }
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -589,31 +621,31 @@
             ],
             "authors": [
                 {
-                    "name": "Symfony Community",
-                    "homepage": "http://symfony.com/contributors"
-                },
-                {
                     "name": "Fabien Potencier",
                     "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
                 }
             ],
             "description": "Symfony Routing Component",
-            "homepage": "http://symfony.com",
-            "time": "2014-10-13 12:38:27"
+            "homepage": "https://symfony.com",
+            "time": "2015-11-18 08:19:46"
         },
         {
             "name": "symfony/yaml",
-            "version": "v2.3.21",
+            "version": "v2.3.35",
             "target-dir": "Symfony/Component/Yaml",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/Yaml.git",
-                "reference": "34687c6236f1dfcebc874fbebd8da74d90f9f64f"
+                "url": "https://github.com/symfony/yaml.git",
+                "reference": "6d7a3b7cfdd5095e5f4318ad4c2ed20c71c74764"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/Yaml/zipball/34687c6236f1dfcebc874fbebd8da74d90f9f64f",
-                "reference": "34687c6236f1dfcebc874fbebd8da74d90f9f64f",
+                "url": "https://api.github.com/repos/symfony/yaml/zipball/6d7a3b7cfdd5095e5f4318ad4c2ed20c71c74764",
+                "reference": "6d7a3b7cfdd5095e5f4318ad4c2ed20c71c74764",
                 "shasum": ""
             },
             "require": {
@@ -628,7 +660,10 @@
             "autoload": {
                 "psr-0": {
                     "Symfony\\Component\\Yaml\\": ""
-                }
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -636,17 +671,17 @@
             ],
             "authors": [
                 {
-                    "name": "Symfony Community",
-                    "homepage": "http://symfony.com/contributors"
-                },
-                {
                     "name": "Fabien Potencier",
                     "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
                 }
             ],
             "description": "Symfony Yaml Component",
-            "homepage": "http://symfony.com",
-            "time": "2014-10-01 05:38:33"
+            "homepage": "https://symfony.com",
+            "time": "2015-11-18 08:19:46"
         },
         {
             "name": "twig/twig",
@@ -805,6 +840,7 @@
                 "event",
                 "exception"
             ],
+            "abandoned": "guzzle/guzzle",
             "time": "2013-09-08 21:09:18"
         },
         {
@@ -862,6 +898,7 @@
                 "http",
                 "http client"
             ],
+            "abandoned": "guzzle/guzzle",
             "time": "2013-09-06 11:34:26"
         },
         {
@@ -906,6 +943,7 @@
                 "message",
                 "url"
             ],
+            "abandoned": "guzzle/guzzle",
             "time": "2013-07-11 22:46:03"
         },
         {
@@ -959,6 +997,7 @@
                 "component",
                 "stream"
             ],
+            "abandoned": "guzzle/guzzle",
             "time": "2013-07-30 22:07:23"
         },
         {
@@ -1868,7 +1907,8 @@
                 },
                 {
                     "name": "Adam Harvey",
-                    "email": "aharvey@php.net"
+                    "email": "aharvey@php.net",
+                    "role": "Lead"
                 },
                 {
                     "name": "Bernhard Schussek",
@@ -1994,26 +2034,26 @@
         },
         {
             "name": "symfony/browser-kit",
-            "version": "v2.3.21",
+            "version": "v2.3.35",
             "target-dir": "Symfony/Component/BrowserKit",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/BrowserKit.git",
-                "reference": "6a403eedacb56d32dc2cc657cfeac09d640ae6bc"
+                "url": "https://github.com/symfony/browser-kit.git",
+                "reference": "65576a393a8372e68ffe57706c1c9eb93e2aac98"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/BrowserKit/zipball/6a403eedacb56d32dc2cc657cfeac09d640ae6bc",
-                "reference": "6a403eedacb56d32dc2cc657cfeac09d640ae6bc",
+                "url": "https://api.github.com/repos/symfony/browser-kit/zipball/65576a393a8372e68ffe57706c1c9eb93e2aac98",
+                "reference": "65576a393a8372e68ffe57706c1c9eb93e2aac98",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.3",
-                "symfony/dom-crawler": "~2.0"
+                "symfony/dom-crawler": "~2.0,>=2.0.5"
             },
             "require-dev": {
-                "symfony/css-selector": "~2.0",
-                "symfony/process": "~2.0"
+                "symfony/css-selector": "~2.0,>=2.0.5",
+                "symfony/process": "~2.3.34|~2.7,>=2.7.6"
             },
             "suggest": {
                 "symfony/process": ""
@@ -2027,7 +2067,10 @@
             "autoload": {
                 "psr-0": {
                     "Symfony\\Component\\BrowserKit\\": ""
-                }
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -2035,31 +2078,31 @@
             ],
             "authors": [
                 {
-                    "name": "Symfony Community",
-                    "homepage": "http://symfony.com/contributors"
-                },
-                {
                     "name": "Fabien Potencier",
                     "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
                 }
             ],
             "description": "Symfony BrowserKit Component",
-            "homepage": "http://symfony.com",
-            "time": "2014-09-22 08:32:35"
+            "homepage": "https://symfony.com",
+            "time": "2015-11-18 08:19:46"
         },
         {
             "name": "symfony/css-selector",
-            "version": "v2.3.21",
+            "version": "v2.3.35",
             "target-dir": "Symfony/Component/CssSelector",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/CssSelector.git",
-                "reference": "d9943386b648d21746bed25cc24f61fab1387943"
+                "url": "https://github.com/symfony/css-selector.git",
+                "reference": "93cccf44bf22103694611dc1802714d2cd36f5fb"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/CssSelector/zipball/d9943386b648d21746bed25cc24f61fab1387943",
-                "reference": "d9943386b648d21746bed25cc24f61fab1387943",
+                "url": "https://api.github.com/repos/symfony/css-selector/zipball/93cccf44bf22103694611dc1802714d2cd36f5fb",
+                "reference": "93cccf44bf22103694611dc1802714d2cd36f5fb",
                 "shasum": ""
             },
             "require": {
@@ -2074,7 +2117,10 @@
             "autoload": {
                 "psr-0": {
                     "Symfony\\Component\\CssSelector\\": ""
-                }
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -2082,42 +2128,42 @@
             ],
             "authors": [
                 {
-                    "name": "Symfony Community",
-                    "homepage": "http://symfony.com/contributors"
-                },
-                {
                     "name": "Jean-François Simon",
                     "email": "jeanfrancois.simon@sensiolabs.com"
                 },
                 {
                     "name": "Fabien Potencier",
                     "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
                 }
             ],
             "description": "Symfony CssSelector Component",
-            "homepage": "http://symfony.com",
-            "time": "2014-10-09 12:30:02"
+            "homepage": "https://symfony.com",
+            "time": "2015-11-18 08:19:46"
         },
         {
             "name": "symfony/dom-crawler",
-            "version": "v2.3.21",
+            "version": "v2.3.35",
             "target-dir": "Symfony/Component/DomCrawler",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/DomCrawler.git",
-                "reference": "64b90870ee3a4e88c9a7a12861683864de029d31"
+                "url": "https://github.com/symfony/dom-crawler.git",
+                "reference": "be39e9bc2a3ae45a876174e8a2c49e263541a754"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/DomCrawler/zipball/64b90870ee3a4e88c9a7a12861683864de029d31",
-                "reference": "64b90870ee3a4e88c9a7a12861683864de029d31",
+                "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/be39e9bc2a3ae45a876174e8a2c49e263541a754",
+                "reference": "be39e9bc2a3ae45a876174e8a2c49e263541a754",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.3"
             },
             "require-dev": {
-                "symfony/css-selector": "~2.0"
+                "symfony/css-selector": "~2.0,>=2.0.5"
             },
             "suggest": {
                 "symfony/css-selector": ""
@@ -2131,7 +2177,10 @@
             "autoload": {
                 "psr-0": {
                     "Symfony\\Component\\DomCrawler\\": ""
-                }
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -2139,31 +2188,31 @@
             ],
             "authors": [
                 {
-                    "name": "Symfony Community",
-                    "homepage": "http://symfony.com/contributors"
-                },
-                {
                     "name": "Fabien Potencier",
                     "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
                 }
             ],
             "description": "Symfony DomCrawler Component",
-            "homepage": "http://symfony.com",
-            "time": "2014-10-01 05:38:33"
+            "homepage": "https://symfony.com",
+            "time": "2015-11-02 18:22:02"
         },
         {
             "name": "symfony/finder",
-            "version": "v2.3.21",
+            "version": "v2.3.35",
             "target-dir": "Symfony/Component/Finder",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/Finder.git",
-                "reference": "fc25dab213d14468c39f12d47e5b79a72b898d4d"
+                "url": "https://github.com/symfony/finder.git",
+                "reference": "5baf7b74657db10c4ad8ca0934be74151268b741"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/Finder/zipball/fc25dab213d14468c39f12d47e5b79a72b898d4d",
-                "reference": "fc25dab213d14468c39f12d47e5b79a72b898d4d",
+                "url": "https://api.github.com/repos/symfony/finder/zipball/5baf7b74657db10c4ad8ca0934be74151268b741",
+                "reference": "5baf7b74657db10c4ad8ca0934be74151268b741",
                 "shasum": ""
             },
             "require": {
@@ -2178,7 +2227,10 @@
             "autoload": {
                 "psr-0": {
                     "Symfony\\Component\\Finder\\": ""
-                }
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -2186,31 +2238,31 @@
             ],
             "authors": [
                 {
-                    "name": "Symfony Community",
-                    "homepage": "http://symfony.com/contributors"
-                },
-                {
                     "name": "Fabien Potencier",
                     "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
                 }
             ],
             "description": "Symfony Finder Component",
-            "homepage": "http://symfony.com",
-            "time": "2014-10-01 05:39:06"
+            "homepage": "https://symfony.com",
+            "time": "2015-11-18 08:19:46"
         },
         {
             "name": "symfony/process",
-            "version": "v2.3.21",
+            "version": "v2.3.35",
             "target-dir": "Symfony/Component/Process",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/Process.git",
-                "reference": "0434822691030547f2439d30ff68758c5576a0ce"
+                "url": "https://github.com/symfony/process.git",
+                "reference": "4d0eaad4b1153174dce6db15e26764de20e7b43d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/Process/zipball/0434822691030547f2439d30ff68758c5576a0ce",
-                "reference": "0434822691030547f2439d30ff68758c5576a0ce",
+                "url": "https://api.github.com/repos/symfony/process/zipball/4d0eaad4b1153174dce6db15e26764de20e7b43d",
+                "reference": "4d0eaad4b1153174dce6db15e26764de20e7b43d",
                 "shasum": ""
             },
             "require": {
@@ -2225,7 +2277,10 @@
             "autoload": {
                 "psr-0": {
                     "Symfony\\Component\\Process\\": ""
-                }
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -2233,17 +2288,17 @@
             ],
             "authors": [
                 {
-                    "name": "Symfony Community",
-                    "homepage": "http://symfony.com/contributors"
-                },
-                {
                     "name": "Fabien Potencier",
                     "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
                 }
             ],
             "description": "Symfony Process Component",
-            "homepage": "http://symfony.com",
-            "time": "2014-10-01 05:38:33"
+            "homepage": "https://symfony.com",
+            "time": "2015-11-19 12:49:26"
         }
     ],
     "aliases": [],
--- a/config/event.yml
+++ b/config/event.yml
@@ -32,3 +32,10 @@ services:
         class: phpbb\event\kernel_terminate_subscriber
         tags:
             - { name: kernel.event_subscriber }
+
+    symfony_response_listener:
+        class: Symfony\Component\HttpKernel\EventListener\ResponseListener
+        arguments:
+            - UTF-8
+        tags:
+            - { name: kernel.event_subscriber }
--- a/docs/CHANGELOG.html
+++ b/docs/CHANGELOG.html
@@ -49,6 +49,8 @@
 <ol>
 	<li><a href="#changelog">Changelog</a>
 	<ul>
+		<li><a href="#v317">Changes since 3.1.7</a></li>
+		<li><a href="#v316">Changes since 3.1.6</a></li>
 		<li><a href="#v315">Changes since 3.1.5</a></li>
 		<li><a href="#v314">Changes since 3.1.4</a></li>
 		<li><a href="#v313">Changes since 3.1.3</a></li>
@@ -113,6 +115,124 @@
 
 		<div class="content">
 
+			<a name="v317"></a><h3>Changes since 3.1.7</h3>
+
+	<h4>Security Issue</h4>
+	<ul>
+		<li>[SECURITY-188] - Check form key in acp_bbcodes</li>
+	</ul>
+	<h4>Bug</h4>
+	<ul>
+		<li>[<a href="https://tracker.phpbb.com/browse/PHPBB3-14343">PHPBB3-14343</a>] - Undefined variable $phpbb_dispatcher when (un-)locking a topic or post</li>
+	</ul>
+
+			<a name="v316"></a><h3>Changes since 3.1.6</h3>
+
+	<h4>Bug</h4>
+	<ul>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-8839">PHPBB3-8839</a>] - Wrong new status of subforumlink on index</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-8920">PHPBB3-8920</a>] - PM-Report for every moderator</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-9153">PHPBB3-9153</a>] - New member can delete pm just in one way</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-9252">PHPBB3-9252</a>] - Conflict when (dis)approving a post by two moderators at the same time</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11468">PHPBB3-11468</a>] - Controllers can not set additional parameters of page_header()</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11971">PHPBB3-11971</a>] - Validating not correctly in Spambot countermeasures</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12616">PHPBB3-12616</a>] - Report notification is not removed when post is disapproved or deleted</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13202">PHPBB3-13202</a>] - dead code in sessions.php</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13423">PHPBB3-13423</a>] - Driver sqlite3 failed periodically</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13636">PHPBB3-13636</a>] - Unexpect return to previous page behaviour</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13656">PHPBB3-13656</a>] - database_upgrade.php fails when database password contains a % character</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13748">PHPBB3-13748</a>] - Wrong tooltip after poll vote change</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13759">PHPBB3-13759</a>] - submit_post doesn't take $data['post_time'] - into account</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13799">PHPBB3-13799</a>] - Avatar gallery subfolders paths are handled incorrectly</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13831">PHPBB3-13831</a>] - Post deletion reason is not appearing on moderation logs</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13835">PHPBB3-13835</a>] - File upload of large files where filename contains umlauts fails</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13846">PHPBB3-13846</a>] - Permissions around soft deleting are inconsistently handled</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13851">PHPBB3-13851</a>] - &quot;Can ignore flood limit&quot; permission not taking effect</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13892">PHPBB3-13892</a>] - &quot;Someone reports a post&quot; notification setting has no effect</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13945">PHPBB3-13945</a>] - Account re-activation does not create a notification</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13950">PHPBB3-13950</a>] - If disabled extension - no hidden permission set</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13960">PHPBB3-13960</a>] - Profile field validation may break</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13976">PHPBB3-13976</a>] - Fix comment typo in salted_md5 driver</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13988">PHPBB3-13988</a>] - Atom feeds use relative links for image attachments</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13992">PHPBB3-13992</a>] - Fix html5 error from output on w3.org its new validator</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14058">PHPBB3-14058</a>] - subsilver2 Contact us form doesn't have an email subject field</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14070">PHPBB3-14070</a>] - Disabled avatar types is still displayed on the forum</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14106">PHPBB3-14106</a>] - Sorting is unworkable while moderating forum (merge topics)</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14114">PHPBB3-14114</a>] - Inconsistency in install.html in 3.1.x Automatic uopdate package</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14127">PHPBB3-14127</a>] - Error in the BBCode FAQ in 'Linking to another site'</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14142">PHPBB3-14142</a>] - Remove unused ignore_configs from avatar drivers</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14143">PHPBB3-14143</a>] - Flush the in-memory mail queue when writing it to the disk</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14153">PHPBB3-14153</a>] - Notifications dropdown header doesn't clear floats</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14159">PHPBB3-14159</a>] - Not accessible link on main ACP page</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14161">PHPBB3-14161</a>] - The core.download_file_send_to_browser_before - $vars - 'extension' it does not exist</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14163">PHPBB3-14163</a>] - Select All in code bug in Edge</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14181">PHPBB3-14181</a>] - Custom report/denial reason not shown in user notifications</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14186">PHPBB3-14186</a>] - Incorrect string concatenation in phpbb_mcp_sorting()</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14200">PHPBB3-14200</a>] - Allow hidden users to see theself on viewonline</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14215">PHPBB3-14215</a>] - [ticket/14212] - Adding event after users have been removed to a group</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14217">PHPBB3-14217</a>] - [ticket/13591] - Change SQL query into array to allow</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14224">PHPBB3-14224</a>] - Fix trailing whitespaces</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14228">PHPBB3-14228</a>] - Vertical align of numbers in polls</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14236">PHPBB3-14236</a>] - Race condition in the functional tests</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14242">PHPBB3-14242</a>] - Fix on memberlist the sort method.</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14249">PHPBB3-14249</a>] - Online list isn't sorted anymore</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14258">PHPBB3-14258</a>] - Add event in auth::Login</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14271">PHPBB3-14271</a>] - Update nginx sample config</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14276">PHPBB3-14276</a>] - Function get_folder_status not setup for use of plurals</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14287">PHPBB3-14287</a>] - Loading indicator not removed after confirming action that does not produce a message</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14297">PHPBB3-14297</a>] - Uppercase and lowercase when sorting topics</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14334">PHPBB3-14334</a>] - Do not use deprecated function get_user_avatar() in user_loader</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14339">PHPBB3-14339</a>] - State support for PHP 7.0 in docs</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14346">PHPBB3-14346</a>] - Improve version check output when phpbb.com is unreachable</li>
+	</ul>
+	<h4>Improvement</h4>
+	<ul>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-7362">PHPBB3-7362</a>] - Title/Post Icons Need Attribute Text</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-8800">PHPBB3-8800</a>] - Add &quot;mark topics read&quot; link to &quot;View unread posts&quot;</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10343">PHPBB3-10343</a>] - ACP: searching for users does not show inactive accounts</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13684">PHPBB3-13684</a>] - Only resize attached file comments vertically</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13934">PHPBB3-13934</a>] - Enctype clause for forms may be needed for profile fields</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14066">PHPBB3-14066</a>] - Add template events to search_body.html</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14073">PHPBB3-14073</a>] - Add core events to the several places in includes/functions_admin.php</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14075">PHPBB3-14075</a>] - Event in posting preview</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14080">PHPBB3-14080</a>] - Add template events to viewforum_body.html before/after/append/prepend the topic row</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14088">PHPBB3-14088</a>] - Add core events to the search.php</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14089">PHPBB3-14089</a>] - [Template] - posting_topic_title_after</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14098">PHPBB3-14098</a>] - Add core events to the search backends (fulltext_*.php)</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14102">PHPBB3-14102</a>] - Add core event to the mcp_topic.php</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14113">PHPBB3-14113</a>] - Add core events to the memberlist.php for customizing members search</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14117">PHPBB3-14117</a>] - Add core events to index.php to allow modifying birthdays list</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14123">PHPBB3-14123</a>] - Add more descriptive help to the CLI commands</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14126">PHPBB3-14126</a>] - Add viewtopic_topic_title_after template event</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14133">PHPBB3-14133</a>] - Comment fix for phpbb_get_user_rank()</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14154">PHPBB3-14154</a>] - Include &quot;Clean Name&quot; for disabled Extensions</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14155">PHPBB3-14155</a>] - Add row highlighting to extensions and style management</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14156">PHPBB3-14156</a>] - Add the Symfony ResponseListener</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14164">PHPBB3-14164</a>] - Helpful instructions for database updates</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14170">PHPBB3-14170</a>] - Fix mcp_change_poster_after event</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14201">PHPBB3-14201</a>] - Add ACP template events</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14213">PHPBB3-14213</a>] - [PHP] - core.group_add_user_after</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14219">PHPBB3-14219</a>] - Add email address into inactive user display in ACP</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14261">PHPBB3-14261</a>] - Pages served from app.php can't disable the update of session_page</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14283">PHPBB3-14283</a>] - Add a &quot;Manage Group&quot; link on a group page</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14313">PHPBB3-14313</a>] - Don't display quote button on unapproved posts</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14343">PHPBB3-14343</a>] - Add event when locking/unlocking posts/topics</li>
+	</ul>
+	<h4>New Feature</h4>
+	<ul>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14144">PHPBB3-14144</a>] - [Template] - quickreply_editor_subject_before</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14146">PHPBB3-14146</a>] - [Template] - viewtopic_body_post_subject_before</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14187">PHPBB3-14187</a>] - [ACP Template] - acp_styles_before_table</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14188">PHPBB3-14188</a>] - [PHP] - core.acp_styles_action_before</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14191">PHPBB3-14191</a>] - [PHP] - core.get_gravatar_url_after</li>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14192">PHPBB3-14192</a>] - [PHP] - core.memberlist_memberrow_before</li>
+	</ul>
+	<h4>Task</h4>
+	<ul>
+		<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14140">PHPBB3-14140</a>] - Update Symfony to benefit from improvement to the console component</li>
+	</ul>
+
+
 			<a name="v315"></a><h3>Changes since 3.1.5</h3>
 
 	<h4>Bug</h4>
--- a/docs/INSTALL.html
+++ b/docs/INSTALL.html
@@ -147,7 +147,7 @@
 			<li>Oracle</li>
 		</ul>
 		</li>
-		<li><strong>PHP 5.3.3+</strong> with support for the database you intend to use.</li>
+		<li><strong>PHP 5.3.3+</strong> and <strong>PHP < 7.0</strong> with support for the database you intend to use.</li>
 		<li>The following PHP modules are required:
 		<ul>
 			<li>json</li>
@@ -265,7 +265,7 @@
 
 <p>If you are currently using a stable release of phpBB, updating to this version is straightforward. You would have downloaded one of four packages and your choice determines what you need to do. <strong>Note</strong>: Before updating, we heavily recommend you do a <em>full backup of your database and existing phpBB files</em>! If you are unsure how to achieve this please ask your hosting provider for advice.</p>
 
-<p><strong>Please make sure you update your phpBB source files too, even if you run the <code>database_update.php</code> file.</strong></p>
+<p><strong>Please make sure you update your phpBB source files too, even if you run the <code>database_update.php</code> file.</strong> If you have shell access to your server, you may wish to update via the command line interface. From your board's root, execute the following command: <code>php bin/phpbbcli.php --safe-mode db:migrate</code>.</p>
 
 <a name="update_full"></a><h3>4.i. Full package</h3>
 
@@ -273,7 +273,7 @@
 
 	<p>First, you should make a copy of your existing <code>config.php</code> file; keep it in a safe place! Next, delete all the existing phpBB files, you may want to leave your <code>files/</code> and <code>images/</code> directories in place. You can leave alternative styles in place too. With this complete, you can upload the new phpBB files (see <a href="#install">New installation</a> for details if necessary). Once complete, copy back your saved <code>config.php</code>, replacing the new one. Another method is to just <strong>replace</strong> the existing files with the files from the full package - though make sure you do <strong>not</strong> overwrite your config.php file.</p>
 
-	<p>You should now run <code>install/database_update.php</code> which, depending on your previous version, will make a number of database changes. You may receive <em>FAILURES</em> during this procedure. They should not be a cause for concern unless you see an actual <em>ERROR</em>, in which case the script will stop (in this case you should seek help via our forums or bug tracker).</p>
+	<p>You should now run <code>install/database_update.php</code> which, depending on your previous version, will make a number of database changes. You may receive <em>FAILURES</em> during this procedure. They should not be a cause for concern unless you see an actual <em>ERROR</em>, in which case the script will stop (in this case you should seek help via our forums or bug tracker). If you have shell access to your server, you may wish to update via the command line interface. From your board's root, execute the following command: <code>php bin/phpbbcli.php --safe-mode db:migrate</code>.</p>
 
 	<p>Once <code>install/database_update.php</code> has completed, you may proceed to the Administration Control Panel and then remove the install directory as advised.</p>
 
@@ -285,7 +285,7 @@
 
 	<p>The directory structure has been preserved, enabling you (if you wish) to simply upload the uncompressed contents of the archive to the appropriate location on your server, i.e. simply overwrite the existing files with the new versions. Do not forget that if you have installed any modifications (MODs) these files will overwrite the originals, possibly destroying them in the process. You will need to re-add MODs to any affected file before uploading.</p>
 
-	<p>As for the other update procedures, you should run <code>install/database_update.php</code> after you have finished updating the files. This will update your database schema and increment the version number.</p>
+	<p>As for the other update procedures, you should run <code>install/database_update.php</code> after you have finished updating the files. This will update your database schema and increment the version number. If you have shell access to your server, you may wish to update via the command line interface. From your board's root, execute the following command: <code>php bin/phpbbcli.php --safe-mode db:migrate</code>.</p>
 
 <a name="update_patch"></a><h3>4.iii. Patch file</h3>
 
@@ -297,13 +297,13 @@
 
 	<p>If you do get failures, you should look at using the <a href="#update_files">Changed Files</a> package to replace the files which failed to patch. Please note that you will need to manually re-add any MODs to these particular files. Alternatively, if you know how, you can examine the .rej files to determine what failed where and make manual adjustments to the relevant source.</p>
 
-	<p>You should, of course, delete the patch file (or files) after use. As for the other update procedures, you should run <code>install/database_update.php</code> after you have finished updating the files. This will update your database schema and data (if appropriate) and increment the version number.</p>
+	<p>You should, of course, delete the patch file (or files) after use. As for the other update procedures, you should run <code>install/database_update.php</code> after you have finished updating the files. This will update your database schema and data (if appropriate) and increment the version number. If you have shell access to your server, you may wish to update via the command line interface. From your board's root, execute the following command: <code>php bin/phpbbcli.php --safe-mode db:migrate</code>.</p>
 
 <a name="update_auto"></a><h3>4.iv. Automatic update package</h3>
 
 	<p>This update method is the recommended method for updating. This package detects changed files automatically and merges in changes if needed.</p>
 
-	<p>The automatic update package will update the board from a given version to the latest version. A number of automatic update files are available, and you should choose the one that corresponds to the version of the board that you are currently running. For example, if your current version is <strong>3.0.13</strong>, you need the <code>phpBB-3.0.13_to_3.0.14.zip/tar.bz2</code> file.</p>
+	<p>The automatic update package will update the board from a given version to the latest version. A number of automatic update files are available, and you should choose the one that corresponds to the version of the board that you are currently running. For example, if your current version is <strong>3.1.5</strong>, you need the <code>phpBB-3.1.5_to_3.1.6.zip/tar.bz2</code> file.</p>
 
 	<p>To perform the update, either follow the instructions from the <strong>Administration Control Panel-&gt;System</strong> Tab - this should point out that you are running an outdated version and will guide you through the update - or follow the instructions listed below.</p>
 
--- a/docs/README.html
+++ b/docs/README.html
@@ -323,7 +323,7 @@
 
 		<div class="content">
 
-	<p>phpBB 3.1.x takes advantage of new features added in PHP 5.3. We recommend that you upgrade to the latest stable release of PHP5 to run phpBB. The minimum version required is PHP 5.3.3.</p>
+	<p>phpBB 3.1.x takes advantage of new features added in PHP 5.3. We recommend that you upgrade to the latest stable release of PHP5 to run phpBB. The minimum version required is PHP 5.3.3 and the maximum supported version is any version prior to PHP 7.0.</p>
 
 	<p>Please remember that running any application on a development (unstable, e.g. a beta release) version of PHP can lead to strange/unexpected results which may appear to be bugs in the application. Therefore, we recommend you upgrade to the newest stable version of PHP before running phpBB. If you are running a development version of PHP please check any bugs you find on a system running a stable release before submitting.</p>
 
--- a/docs/events.md
+++ b/docs/events.md
@@ -1,3 +1,15 @@
+acp_ban_cell_append
+===
+* Location: adm/style/acp_ban.html
+* Since: 3.1.7-RC1
+* Purpose: Add content at the end of the ban cell area
+
+acp_ban_cell_prepend
+===
+* Location: adm/style/acp_ban.html
+* Since: 3.1.7-RC1
+* Purpose: Add content at the start of the ban cell area
+
 acp_bbcodes_actions_append
 ===
 * Location: adm/style/acp_bbcodes.html
@@ -16,6 +28,30 @@ acp_bbcodes_edit_fieldsets_after
 * Since: 3.1.0-a3
 * Purpose: Add settings to BBCode add/edit form
 
+acp_email_group_options_append
+===
+* Location: adm/style/acp_email.html
+* Since: 3.1.7-RC1
+* Purpose: Add content at the end of the group options select box 
+
+acp_email_group_options_prepend
+===
+* Location: adm/style/acp_email.html
+* Since: 3.1.7-RC1
+* Purpose: Add content at the start of the group options select box 
+
+acp_email_find_username_append
+===
+* Location: adm/style/acp_email.html
+* Since: 3.1.7-RC1
+* Purpose: Add content at the end of the fimd username link
+
+acp_email_find_username_prepend
+===
+* Location: adm/style/acp_email.html
+* Since: 3.1.7-RC1
+* Purpose: Add content at the start of the fimd username link
+
 acp_email_options_after
 ===
 * Location: adm/style/acp_email.html
@@ -64,6 +100,18 @@ acp_forums_prune_settings_prepend
 * Since: 3.1.2-RC1
 * Purpose: Add settings to forums before prune settings section
 
+acp_forums_quick_select_button_append
+===
+* Location: adm/style/acp_forums.html
+* Since: 3.1.7-RC1
+* Purpose: Add content after the quick select forum submit button
+
+acp_forums_quick_select_button_prepend
+===
+* Location: adm/style/acp_forums.html
+* Since: 3.1.7-RC1
+* Purpose: Add content before the quick select forum submit button
+
 acp_forums_rules_settings_append
 ===
 * Location: adm/style/acp_forums.html
@@ -88,6 +136,66 @@ acp_group_options_after
 * Since: 3.1.0-b4
 * Purpose: Add addtional options to group settings (after GROUP_RECEIVE_PM)
 
+acp_groups_find_username_append
+===
+* Location: adm/style/acp_groups.html
+* Since: 3.1.7-RC1
+* Purpose: Add content at the end of the find username link
+
+acp_groups_find_username_prepend
+===
+* Location: adm/style/acp_groups.html
+* Since: 3.1.7-RC1
+* Purpose: Add content at the start of the find username link
+
+acp_groups_manage_after
+===
+* Location: adm/style/acp_groups.html
+* Since: 3.1.7-RC1
+* Purpose: Add content after the manage groups table
+
+acp_groups_manage_before
+===
+* Location: adm/style/acp_groups.html
+* Since: 3.1.7-RC1
+* Purpose: Add content before the manage groups table
+
+acp_groups_position_legend_add_button_after
+===
+* Location: adm/style/acp_groups_position.html
+* Since: 3.1.7-RC1
+* Purpose: Add content after adding group to legend submit button
+
+acp_groups_position_legend_add_button_before
+===
+* Location: adm/style/acp_groups_position.html
+* Since: 3.1.7-RC1
+* Purpose: Add content before adding group to legend submit button
+
+acp_groups_position_teampage_add_button_after
+===
+* Location: adm/style/acp_groups_position.html
+* Since: 3.1.7-RC1
+* Purpose: Add content after adding group to teampage submit button
+
+acp_groups_position_teampage_add_button_before
+===
+* Location: adm/style/acp_groups_position.html
+* Since: 3.1.7-RC1
+* Purpose: Add content before adding group to teampage submit button
+
+acp_logs_quick_select_forum_button_append
+===
+* Location: adm/style/acp_logs.html
+* Since: 3.1.7-RC1
+* Purpose: Add content after the quick forum select form submit button
+
+acp_logs_quick_select_forum_button_prepend
+===
+* Location: adm/style/acp_logs.html
+* Since: 3.1.7-RC1
+* Purpose: Add content before the quick forum select form submit button
+
 acp_main_actions_append
 ===
 * Location: adm/style/acp_main.html
@@ -125,6 +233,102 @@ acp_overall_header_stylesheets_after
 * Purpose: Add assets after stylesheets within the `<head>` tags in the ACP.
 Note that INCLUDECSS will not work with this event.
 
+acp_permission_forum_copy_src_forum_append
+===
+* Location: adm/style/permission_forum_copy.html
+* Since: 3.1.7-RC1
+* Purpose: Add content after the sourse forum select form
+
+acp_permission_forum_copy_src_forum_prepend
+===
+* Location: adm/style/permission_forum_copy.html
+* Since: 3.1.7-RC1
+* Purpose: Add content before the sourse forum select form
+
+acp_permission_forum_copy_dest_forum_append
+===
+* Location: adm/style/permission_forum_copy.html
+* Since: 3.1.7-RC1
+* Purpose: Add content after the destiny forum select form
+
+acp_permission_forum_copy_dest_forum_prepend
+===
+* Location: adm/style/permission_forum_copy.html
+* Since: 3.1.7-RC1
+* Purpose: Add content before the destiny forum select form
+
+acp_permissions_add_group_options_append
+===
+* Location: adm/style/acp_permissions.html
+* Since: 3.1.7-RC1
+* Purpose: Add content after the group multiple select form
+
+acp_permissions_add_group_options_prepend
+===
+* Location: adm/style/acp_permissions.html
+* Since: 3.1.7-RC1
+* Purpose: Add content before the group multiple select form
+
+acp_permissions_find_username_append
+===
+* Location: adm/style/acp_permissions.html
+* Since: 3.1.7-RC1
+* Purpose: Add content after the find username link
+
+acp_permissions_find_username_prepend
+===
+* Location: adm/style/acp_permissions.html
+* Since: 3.1.7-RC1
+* Purpose: Add content before the find username link
+
+acp_permissions_select_forum_append
+===
+* Location: adm/style/acp_permissions.html
+* Since: 3.1.7-RC1
+* Purpose: Add content after the forum select form label
+
+acp_permissions_select_forum_prepend
+===
+* Location: adm/style/acp_permissions.html
+* Since: 3.1.7-RC1
+* Purpose: Add content before the forum select form label
+
+acp_permissions_select_group_after
+===
+* Location: adm/style/acp_permissions.html
+* Since: 3.1.7-RC1
+* Purpose: Add content after the group select form in usergroup view
+
+acp_permissions_select_group_append
+===
+* Location: adm/style/acp_permissions.html
+* Since: 3.1.7-RC1
+* Purpose: Add content after the group select form label
+
+acp_permissions_select_group_before
+===
+* Location: adm/style/acp_permissions.html
+* Since: 3.1.7-RC1
+* Purpose: Add content before the group select form in usergroup view
+
+acp_permissions_select_group_prepend
+===
+* Location: adm/style/acp_permissions.html
+* Since: 3.1.7-RC1
+* Purpose: Add content before the group select form label
+
+acp_permissions_select_multiple_forum_append
+===
+* Location: adm/style/acp_permissions.html
+* Since: 3.1.7-RC1
+* Purpose: Add content after the forum multiple select form label
+
+acp_permissions_select_multiple_forum_prepend
+===
+* Location: adm/style/acp_permissions.html
+* Since: 3.1.7-RC1
+* Purpose: Add content before the forum multiple select form label
+
 acp_posting_buttons_after
 ===
 * Locations:
@@ -146,6 +350,34 @@ acp_profile_contact_before
 * Since: 3.1.6-RC1
 * Purpose: Add extra options to custom profile field configuration in the ACP
 
+acp_prune_forums_append
+===
+* Locations:
+    + adm/style/acp_prune_forums.html
+* Since: 3.1.7-RC1
+* Purpose: Add content after the forum select form label
+
+acp_prune_forums_prepend
+===
+* Locations:
+    + adm/style/acp_prune_forums.html
+* Since: 3.1.7-RC1
+* Purpose: Add content before the forum select form label
+
+acp_prune_users_find_username_append
+===
+* Locations:
+    + adm/style/acp_prune_users.html
+* Since: 3.1.7-RC1
+* Purpose: Add content after the find username link
+
+acp_prune_users_find_username_prepend
+===
+* Locations:
+    + adm/style/acp_prune_users.html
+* Since: 3.1.7-RC1
+* Purpose: Add content before the find username link
+
 acp_ranks_edit_after
 ===
 * Locations:
@@ -190,6 +422,13 @@ acp_ranks_list_header_before
 * Purpose: Add content after the last header-column (but before the action column)
 in the ranks list in the ACP
 
+acp_styles_list_before
+===
+* Locations:
+    + adm/style/acp_styles.html
+* Since: 3.1.7-RC1
+* Purpose: Add content before list of styles
+
 acp_users_profile_before
 ===
 * Locations:
@@ -290,6 +529,18 @@ acp_users_prefs_view_prepend
 * Since: 3.1.0-b3
 * Purpose: Add user options fieldset to the top of ACP users view prefs settings
 
+acp_users_select_group_after
+===
+* Location: adm/style/acp_users.html
+* Since: 3.1.7-RC1
+* Purpose: Add content after group select form
+
+acp_users_select_group_before
+===
+* Location: adm/style/acp_users.html
+* Since: 3.1.7-RC1
+* Purpose: Add content before group select form
+
 attachment_file_after
 ===
 * Locations:
@@ -1235,6 +1486,22 @@ posting_poll_body_options_after
 * Since: 3.1.4-RC1
 * Purpose: Add content after the poll options on creating a poll
 
+posting_preview_poll_after
+===
+* Locations:
+    + styles/prosilver/template/posting_preview.html
+    + styles/subsilver2/template/posting_preview.html
+* Since: 3.1.7-RC1
+* Purpose: Add content after the poll preview block
+
+posting_topic_title_after
+===
+* Locations:
+    + styles/prosilver/template/posting_layout.html
+    + styles/subsilver2/template/posting_body.html
+* Since: 3.1.7-RC1
+* Purpose: Allows to add some information after the topic title in the posting form
+
 posting_topic_title_before
 ===
 * Locations:
@@ -1275,6 +1542,22 @@ quickreply_editor_message_before
 * Since: 3.1.0-a4
 * Purpose: Add content before the quick reply textbox
 
+quickreply_editor_subject_before
+===
+* Locations:
+    + styles/prosilver/template/quickreply_editor.html
+    + styles/subsilver2/template/quickreply_editor.html
+* Since: 3.1.7-RC1
+* Purpose: Add content before the quick reply subject textbox
+
+search_body_form_after
+===
+* Locations:
+    + styles/prosilver/template/search_body.html
+    + styles/subsilver2/template/search_body.html
+* Since: 3.1.7-RC1
+* Purpose: Add content after the search form
+
 search_body_form_before
 ===
 * Locations:
@@ -1283,6 +1566,102 @@ search_body_form_before
 * Since: 3.1.5-RC1
 * Purpose: Add content before the search form
 
+search_body_recent_search_after
+===
+* Locations:
+    + styles/prosilver/template/search_body.html
+    + styles/subsilver2/template/search_body.html
+* Since: 3.1.7-RC1
+* Purpose: Add content after the recent search queries list
+
+search_body_recent_search_before
+===
+* Locations:
+    + styles/prosilver/template/search_body.html
+    + styles/subsilver2/template/search_body.html
+* Since: 3.1.7-RC1
+* Purpose: Add content before the recent search queries list
+
+search_body_search_display_options_append
+===
+* Locations:
+    + styles/prosilver/template/search_body.html
+    + styles/subsilver2/template/search_body.html
+* Since: 3.1.7-RC1
+* Purpose: Put content at the bottom of the search query display options fields set
+
+search_body_search_display_options_prepend
+===
+* Locations:
+    + styles/prosilver/template/search_body.html
+    + styles/subsilver2/template/search_body.html
+* Since: 3.1.7-RC1
+* Purpose: Put content at the top of the search query display options fields set
+
+search_body_search_options_after
+===
+* Locations:
+    + styles/prosilver/template/search_body.html
+    + styles/subsilver2/template/search_body.html
+* Since: 3.1.7-RC1
+* Purpose: Add content after the search query options fields set
+
+search_body_search_options_append
+===
+* Locations:
+    + styles/prosilver/template/search_body.html
+    + styles/subsilver2/template/search_body.html
+* Since: 3.1.7-RC1
+* Purpose: Put content at the bottom of the search query options fields set
+
+search_body_search_options_before
+===
+* Locations:
+    + styles/prosilver/template/search_body.html
+    + styles/subsilver2/template/search_body.html
+* Since: 3.1.7-RC1
+* Purpose: Add content before the search query options fields set
+
+search_body_search_options_prepend
+===
+* Locations:
+    + styles/prosilver/template/search_body.html
+    + styles/subsilver2/template/search_body.html
+* Since: 3.1.7-RC1
+* Purpose: Put content at the top of the search query options fields set
+
+search_body_search_query_after
+===
+* Locations:
+    + styles/prosilver/template/search_body.html
+    + styles/subsilver2/template/search_body.html
+* Since: 3.1.7-RC1
+* Purpose: Add content after the search query fields set
+
+search_body_search_query_append
+===
+* Locations:
+    + styles/prosilver/template/search_body.html
+    + styles/subsilver2/template/search_body.html
+* Since: 3.1.7-RC1
+* Purpose: Put content at the bottom of the search query fields set
+
+search_body_search_query_before
+===
+* Locations:
+    + styles/prosilver/template/search_body.html
+    + styles/subsilver2/template/search_body.html
+* Since: 3.1.7-RC1
+* Purpose: Add content before the search query fields set
+
+search_body_search_query_prepend
+===
+* Locations:
+    + styles/prosilver/template/search_body.html
+    + styles/subsilver2/template/search_body.html
+* Since: 3.1.7-RC1
+* Purpose: Put content at the top of the search query fields set
+
 search_results_header_after
 ===
 * Locations:
@@ -1754,6 +2133,38 @@ ucp_friend_list_after
 * Since: 3.1.0-a4
 * Purpose: Add optional elements after list of friends in UCP
 
+viewforum_body_topic_row_after
+===
+* Locations:
+    + styles/prosilver/template/viewforum_body.html
+    + styles/subsilver2/template/viewforum_body.html
+* Since: 3.1.7-RC1
+* Purpose: Add content after the topic list item.
+
+viewforum_body_topic_row_append
+===
+* Locations:
+    + styles/prosilver/template/viewforum_body.html
+    + styles/subsilver2/template/viewforum_body.html
+* Since: 3.1.7-RC1
+* Purpose: Add content at the start of the topic list item.
+
+viewforum_body_topic_row_before
+===
+* Locations:
+    + styles/prosilver/template/viewforum_body.html
+    + styles/subsilver2/template/viewforum_body.html
+* Since: 3.1.7-RC1
+* Purpose: Add content before the topic list item.
+
+viewforum_body_topic_row_prepend
+===
+* Locations:
+    + styles/prosilver/template/viewforum_body.html
+    + styles/subsilver2/template/viewforum_body.html
+* Since: 3.1.7-RC1
+* Purpose: Add content at the end of the topic list item.
+
 viewforum_buttons_bottom_before
 ===
 * Locations:
@@ -2022,6 +2433,14 @@ viewtopic_body_post_buttons_list_before
 * Purpose: Add post button custom list to posts (next to edit, quote etc),
 before the original list.
 
+viewtopic_body_post_subject_before
+===
+* Locations:
+    + styles/prosilver/template/viewtopic_body.html
+    + styles/subsilver2/template/viewtopic_body.html
+* Since: 3.1.7-RC1
+* Purpose: Add data before post icon and subject
+
 viewtopic_body_postrow_custom_fields_after
 ===
 * Locations:
@@ -2122,6 +2541,14 @@ viewtopic_body_topic_actions_before
 * Since: 3.1.0-a4
 * Purpose: Add data before the topic actions buttons (after the posts sorting options)
 
+viewtopic_topic_title_after
+===
+* Locations:
+    + styles/prosilver/template/viewtopic_body.html
+    + styles/subsilver2/template/viewtopic_body.html
+* Since: 3.1.7-RC1
+* Purpose: Add content directly after the topic title link on the View topic screen (outside of the h2 HTML tag)
+
 viewtopic_topic_title_append
 ===
 * Locations:
--- a/docs/nginx.sample.conf
+++ b/docs/nginx.sample.conf
@@ -64,6 +64,11 @@ http {
         location / {
             # phpbb uses index.htm
             index index.php index.html index.htm;
+            try_files $uri $uri/ @rewriteapp;
+        }
+
+        location @rewriteapp {
+            rewrite ^(.*)$ /app.php/$1 last;
         }
 
         # Deny access to internal phpbb files.
@@ -75,12 +80,16 @@ http {
         }
 
         # Pass the php scripts to fastcgi server specified in upstream declaration.
-        location ~ \.php$ {
-            fastcgi_pass php;
-            # Necessary for php.
-            fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
+        location ~ \.php(/|$) {
             # Unmodified fastcgi_params from nginx distribution.
             include fastcgi_params;
+            # Necessary for php.
+            fastcgi_split_path_info ^(.+\.php)(/.*)$;
+            fastcgi_param PATH_INFO $fastcgi_path_info;
+            fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
+            fastcgi_param DOCUMENT_ROOT $realpath_root;
+            try_files $uri $uri/ /app.php$is_args$args;
+            fastcgi_pass php;
         }
 
         # Deny access to version control system directories.
--- a/download/file.php
+++ b/download/file.php
@@ -258,17 +258,18 @@ else
 	* @var	array	attachment			Array with attachment data
 	* @var	int		display_cat			Attachment category
 	* @var	int		download_mode		File extension specific download mode
-	* @var	array	extension			Array with file extensions data
+	* @var	array	extensions			Array with file extensions data
 	* @var	string	mode				Download mode
 	* @var	bool	thumbnail			Flag indicating if the file is a thumbnail
 	* @since 3.1.6-RC1
+	* @change 3.1.7-RC1	Fixing wrong name of a variable (replacing "extension" by "extensions")
 	*/
 	$vars = array(
 		'attach_id',
 		'attachment',
 		'display_cat',
 		'download_mode',
-		'extension',
+		'extensions',
 		'mode',
 		'thumbnail',
 	);
--- a/includes/acp/acp_attachments.php
+++ b/includes/acp/acp_attachments.php
@@ -106,7 +106,10 @@ class acp_attachments
 		{
 			case 'attach':
 
-				include_once($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
+				if (!function_exists('get_supported_image_types'))
+				{
+					include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
+				}
 
 				$sql = 'SELECT group_name, cat_id
 					FROM ' . EXTENSION_GROUPS_TABLE . '
--- a/includes/acp/acp_ban.php
+++ b/includes/acp/acp_ban.php
@@ -28,7 +28,10 @@ class acp_ban
 		global $user, $template, $request, $phpbb_dispatcher;
 		global $phpbb_root_path, $phpEx;
 
-		include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+		if (!function_exists('user_ban'))
+		{
+			include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+		}
 
 		$bansubmit	= $request->is_set_post('bansubmit');
 		$unbansubmit = $request->is_set_post('unbansubmit');
--- a/includes/acp/acp_bbcodes.php
+++ b/includes/acp/acp_bbcodes.php
@@ -33,6 +33,7 @@ class acp_bbcodes
 		// Set up general vars
 		$action	= request_var('action', '');
 		$bbcode_id = request_var('bbcode', 0);
+		$submit = $request->is_set_post('submit');
 
 		$this->tpl_name = 'acp_bbcodes';
 		$this->page_title = 'ACP_BBCODES';
@@ -40,6 +41,11 @@ class acp_bbcodes
 
 		add_form_key($form_key);
 
+		if ($submit && !check_form_key($form_key))
+		{
+			trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
+		}
+
 		// Set up mode-specific vars
 		switch ($action)
 		{
--- a/includes/acp/acp_bots.php
+++ b/includes/acp/acp_bots.php
@@ -141,7 +141,11 @@ class acp_bots
 
 			case 'edit':
 			case 'add':
-				include_once($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+
+				if (!function_exists('user_update_name'))
+				{
+					include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+				}
 
 				$bot_row = array(
 					'bot_name'		=> utf8_normalize_nfc(request_var('bot_name', '', true)),
--- a/includes/acp/acp_captcha.php
+++ b/includes/acp/acp_captcha.php
@@ -25,7 +25,7 @@ class acp_captcha
 
 	function main($id, $mode)
 	{
-		global $db, $user, $auth, $template;
+		global $request, $user, $auth, $template;
 		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx, $phpbb_container;
 
 		$user->add_lang('acp/board');
@@ -52,11 +52,36 @@ class acp_captcha
 		else
 		{
 			$config_vars = array(
-				'enable_confirm'		=> array('tpl' => 'REG_ENABLE', 'default' => false),
-				'enable_post_confirm'	=> array('tpl' => 'POST_ENABLE', 'default' => false),
-				'confirm_refresh'		=> array('tpl' => 'CONFIRM_REFRESH', 'default' => false),
-				'max_reg_attempts'		=> array('tpl' => 'REG_LIMIT', 'default' => 0),
-				'max_login_attempts'		=> array('tpl' => 'MAX_LOGIN_ATTEMPTS', 'default' => 0),
+				'enable_confirm'		=> array(
+					'tpl'		=> 'REG_ENABLE',
+					'default'	=> false,
+					'validate'	=> 'bool',
+					'lang'		=> 'VISUAL_CONFIRM_REG',
+				),
+				'enable_post_confirm'	=> array(
+					'tpl'		=> 'POST_ENABLE',
+					'default'	=> false,
+					'validate'	=> 'bool',
+					'lang'		=> 'VISUAL_CONFIRM_POST',
+				),
+				'confirm_refresh'		=> array(
+					'tpl'		=> 'CONFIRM_REFRESH',
+					'default'	=> false,
+					'validate'	=> 'bool',
+					'lang'		=> 'VISUAL_CONFIRM_REFRESH',
+				),
+				'max_reg_attempts'		=> array(
+					'tpl'		=> 'REG_LIMIT',
+					'default'	=> 0,
+					'validate'	=> 'int:0:99999',
+					'lang'		=> 'REG_LIMIT',
+				),
+				'max_login_attempts'	=> array(
+					'tpl'		=> 'MAX_LOGIN_ATTEMPTS',
+					'default'	=> 0,
+					'validate'	=> 'int:0:99999',
+					'lang'		=> 'MAX_LOGIN_ATTEMPTS',
+				),
 			);
 
 			$this->tpl_name = 'acp_captcha';
@@ -65,12 +90,31 @@ class acp_captcha
 			add_form_key($form_key);
 
 			$submit = request_var('main_submit', false);
+			$error = $cfg_array = array();
 
-			if ($submit && check_form_key($form_key))
+			if ($submit)
 			{
 				foreach ($config_vars as $config_var => $options)
 				{
-					set_config($config_var, request_var($config_var, $options['default']));
+					$cfg_array[$config_var] = $request->variable($config_var, $options['default']);
+				}
+				validate_config_vars($config_vars, $cfg_array, $error);
+
+				if (!check_form_key($form_key))
+				{
+					$error[] = $user->lang['FORM_INVALID'];
+				}
+				if ($error)
+				{
+					$submit = false;
+				}
+			}
+
+			if ($submit)
+			{
+				foreach ($cfg_array as $key => $value)
+				{
+					$config->set($key, $value);
 				}
 
 				if ($selected !== $config['captcha_plugin'])
@@ -94,10 +138,6 @@ class acp_captcha
 				}
 				trigger_error($user->lang['CONFIG_UPDATED'] . adm_back_link($this->u_action));
 			}
-			else if ($submit)
-			{
-				trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
-			}
 			else
 			{
 				$captcha_select = '';
@@ -124,6 +164,7 @@ class acp_captcha
 					'CAPTCHA_PREVIEW_TPL'	=> $demo_captcha->get_demo_template($id),
 					'S_CAPTCHA_HAS_CONFIG'	=> $demo_captcha->has_config(),
 					'CAPTCHA_SELECT'		=> $captcha_select,
+					'ERROR_MSG'				=> implode('<br />', $error),
 
 					'U_ACTION'				=> $this->u_action,
 				));
--- a/includes/acp/acp_disallow.php
+++ b/includes/acp/acp_disallow.php
@@ -26,9 +26,7 @@ class acp_disallow
 	function main($id, $mode)
 	{
 		global $db, $user, $auth, $template, $cache;
-		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
-
-		include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+		global $config, $phpbb_admin_path;
 
 		$user->add_lang('acp/posting');
 
--- a/includes/acp/acp_email.php
+++ b/includes/acp/acp_email.php
@@ -189,8 +189,15 @@ class acp_email
 				$db->sql_freeresult($result);
 
 				// Send the messages
-				include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
-				include_once($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+				if (!class_exists('messenger'))
+				{
+					include($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
+				}
+
+				if (!function_exists('get_group_name'))
+				{
+					include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+				}
 				$messenger = new messenger($use_queue);
 
 				$errored = false;
--- a/includes/acp/acp_extensions.php
+++ b/includes/acp/acp_extensions.php
@@ -121,8 +121,6 @@ class acp_extensions
 					'U_ACTION' 				=> $this->u_action,
 				));
 
-				add_form_key('version_check_settings');
-
 				$this->tpl_name = 'acp_ext_list';
 			break;
 
@@ -369,6 +367,7 @@ class acp_extensions
 
 		foreach ($enabled_extension_meta_data as $name => $block_vars)
 		{
+			$block_vars['NAME'] = $name;
 			$block_vars['U_DETAILS'] = $this->u_action . '&amp;action=details&amp;ext_name=' . urlencode($name);
 
 			$this->template->assign_block_vars('enabled', $block_vars);
@@ -425,6 +424,7 @@ class acp_extensions
 
 		foreach ($disabled_extension_meta_data as $name => $block_vars)
 		{
+			$block_vars['NAME'] = $name;
 			$block_vars['U_DETAILS'] = $this->u_action . '&amp;action=details&amp;ext_name=' . urlencode($name);
 
 			$this->template->assign_block_vars('disabled', $block_vars);
@@ -484,6 +484,7 @@ class acp_extensions
 
 		foreach ($available_extension_meta_data as $name => $block_vars)
 		{
+			$block_vars['NAME'] = $name;
 			$block_vars['U_DETAILS'] = $this->u_action . '&amp;action=details&amp;ext_name=' . urlencode($name);
 
 			$this->template->assign_block_vars('disabled', $block_vars);
--- a/includes/acp/acp_groups.php
+++ b/includes/acp/acp_groups.php
@@ -42,7 +42,10 @@ class acp_groups
 			return;
 		}
 
-		include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+		if (!function_exists('group_user_attributes'))
+		{
+			include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+		}
 
 		// Check and set some common vars
 		$action		= (isset($_POST['add'])) ? 'add' : ((isset($_POST['addusers'])) ? 'addusers' : request_var('action', ''));
@@ -295,7 +298,10 @@ class acp_groups
 			case 'edit':
 			case 'add':
 
-				include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
+				if (!function_exists('display_forums'))
+				{
+					include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
+				}
 
 				$data = $submit_ary = array();
 
--- a/includes/acp/acp_inactive.php
+++ b/includes/acp/acp_inactive.php
@@ -34,7 +34,10 @@ class acp_inactive
 		global $config, $db, $user, $auth, $template, $phpbb_container;
 		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix;
 
-		include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+		if (!function_exists('user_active_flip'))
+		{
+			include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+		}
 
 		$user->add_lang('memberlist');
 
@@ -109,7 +112,10 @@ class acp_inactive
 
 						if ($config['require_activation'] == USER_ACTIVATION_ADMIN && !empty($inactive_users))
 						{
-							include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
+							if (!class_exists('messenger'))
+							{
+								include($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
+							}
 
 							$messenger = new messenger(false);
 
@@ -196,7 +202,10 @@ class acp_inactive
 					if ($row = $db->sql_fetchrow($result))
 					{
 						// Send the messages
-						include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
+						if (!class_exists('messenger'))
+						{
+							include($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
+						}
 
 						$messenger = new messenger();
 						$usernames = $user_ids = array();
@@ -271,9 +280,10 @@ class acp_inactive
 
 				'REMINDED_EXPLAIN'	=> $user->lang('USER_LAST_REMINDED', (int) $row['user_reminded'], $user->format_date($row['user_reminded_time'])),
 
-				'USERNAME_FULL'		=> get_username_string('full', $row['user_id'], $row['username'], $row['user_colour'], false, append_sid("{$phpbb_admin_path}index.$phpEx", 'i=users&amp;mode=overview')),
+				'USERNAME_FULL'		=> get_username_string('full', $row['user_id'], $row['username'], $row['user_colour'], false, append_sid("{$phpbb_admin_path}index.$phpEx", 'i=users&amp;mode=overview&amp;redirect=acp_inactive')),
 				'USERNAME'			=> get_username_string('username', $row['user_id'], $row['username'], $row['user_colour']),
 				'USER_COLOR'		=> get_username_string('colour', $row['user_id'], $row['username'], $row['user_colour']),
+				'USER_EMAIL'		=> $row['user_email'],
 
 				'U_USER_ADMIN'	=> append_sid("{$phpbb_admin_path}index.$phpEx", "i=users&amp;mode=overview&amp;u={$row['user_id']}"),
 				'U_SEARCH_USER'	=> ($auth->acl_get('u_search')) ? append_sid("{$phpbb_root_path}search.$phpEx", "author_id={$row['user_id']}&amp;sr=posts") : '',
--- a/includes/acp/acp_jabber.php
+++ b/includes/acp/acp_jabber.php
@@ -34,7 +34,10 @@ class acp_jabber
 
 		$user->add_lang('acp/board');
 
-		include_once($phpbb_root_path . 'includes/functions_jabber.' . $phpEx);
+		if (!class_exists('jabber'))
+		{
+			include($phpbb_root_path . 'includes/functions_jabber.' . $phpEx);
+		}
 
 		$action	= request_var('action', '');
 		$submit = (isset($_POST['submit'])) ? true : false;
--- a/includes/acp/acp_language.php
+++ b/includes/acp/acp_language.php
@@ -34,7 +34,10 @@ class acp_language
 		global $config, $db, $user, $template;
 		global $phpbb_root_path, $phpEx, $request;
 
-		include_once($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+		if (!function_exists('validate_language_iso_name'))
+		{
+			include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+		}
 
 		// Check and set some common vars
 		$action		= (isset($_POST['update_details'])) ? 'update_details' : '';
--- a/includes/acp/acp_main.php
+++ b/includes/acp/acp_main.php
@@ -429,20 +429,28 @@ class acp_main
 			));
 		}
 
-		$version_helper = $phpbb_container->get('version_helper');
-		try
+		if ($auth->acl_get('a_board'))
 		{
-			$recheck = $request->variable('versioncheck_force', false);
-			$updates_available = $version_helper->get_suggested_updates($recheck);
+			$version_helper = $phpbb_container->get('version_helper');
+			try
+			{
+				$recheck = $request->variable('versioncheck_force', false);
+				$updates_available = $version_helper->get_suggested_updates($recheck);
 
-			$template->assign_var('S_VERSION_UP_TO_DATE', empty($updates_available));
+				$template->assign_var('S_VERSION_UP_TO_DATE', empty($updates_available));
+			}
+			catch (\RuntimeException $e)
+			{
+				$template->assign_vars(array(
+					'S_VERSIONCHECK_FAIL'		=> true,
+					'VERSIONCHECK_FAIL_REASON'	=> ($e->getMessage() !== $user->lang('VERSIONCHECK_FAIL')) ? $e->getMessage() : '',
+				));
+			}
 		}
-		catch (\RuntimeException $e)
+		else
 		{
-			$template->assign_vars(array(
-				'S_VERSIONCHECK_FAIL'		=> true,
-				'VERSIONCHECK_FAIL_REASON'	=> ($e->getMessage() !== $user->lang('VERSIONCHECK_FAIL')) ? $e->getMessage() : '',
-			));
+			// We set this template var to true, to not display an outdated version notice.
+			$template->assign_var('S_VERSION_UP_TO_DATE', true);
 		}
 
 		/**
@@ -553,6 +561,7 @@ class acp_main
 			'U_VERSIONCHECK'	=> append_sid("{$phpbb_admin_path}index.$phpEx", 'i=update&amp;mode=version_check'),
 			'U_VERSIONCHECK_FORCE'	=> append_sid("{$phpbb_admin_path}index.$phpEx", 'versioncheck_force=1'),
 
+			'S_VERSIONCHECK'	=> ($auth->acl_get('a_board')) ? true : false,
 			'S_ACTION_OPTIONS'	=> ($auth->acl_get('a_board')) ? true : false,
 			'S_FOUNDER'			=> ($user->data['user_type'] == USER_FOUNDER) ? true : false,
 			)
--- a/includes/acp/acp_permission_roles.php
+++ b/includes/acp/acp_permission_roles.php
@@ -30,8 +30,15 @@ class acp_permission_roles
 		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
 		global $request;
 
-		include_once($phpbb_root_path . 'includes/functions_user.' . $phpEx);
-		include_once($phpbb_root_path . 'includes/acp/auth.' . $phpEx);
+		if (!function_exists('user_get_id_name'))
+		{
+			include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+		}
+
+		if (!class_exists('auth_admin'))
+		{
+			include($phpbb_root_path . 'includes/acp/auth.' . $phpEx);
+		}
 
 		$this->auth_admin = new auth_admin();
 
--- a/includes/acp/acp_permissions.php
+++ b/includes/acp/acp_permissions.php
@@ -30,8 +30,15 @@ class acp_permissions
 		global $db, $user, $auth, $template, $cache, $phpbb_container;
 		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
 
-		include_once($phpbb_root_path . 'includes/functions_user.' . $phpEx);
-		include_once($phpbb_root_path . 'includes/acp/auth.' . $phpEx);
+		if (!function_exists('user_get_id_name'))
+		{
+			include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+		}
+
+		if (!class_exists('auth_admin'))
+		{
+			include($phpbb_root_path . 'includes/acp/auth.' . $phpEx);
+		}
 
 		$this->permissions = $phpbb_container->get('acl.permissions');
 
--- a/includes/acp/acp_profile.php
+++ b/includes/acp/acp_profile.php
@@ -33,8 +33,15 @@ class acp_profile
 		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix;
 		global $request, $phpbb_container, $phpbb_dispatcher;
 
-		include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
-		include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+		if (!function_exists('generate_smilies'))
+		{
+			include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
+		}
+
+		if (!function_exists('user_get_id_name'))
+		{
+			include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+		}
 
 		$user->add_lang(array('ucp', 'acp/profile'));
 		$this->tpl_name = 'acp_profile';
@@ -537,13 +544,14 @@ class acp_profile
 					}
 				}
 
-				$step = (isset($_REQUEST['next'])) ? $step + 1 : ((isset($_REQUEST['prev'])) ? $step - 1 : $step);
-
 				if (sizeof($error))
 				{
-					$step--;
 					$submit = false;
 				}
+				else
+				{
+					$step = (isset($_REQUEST['next'])) ? $step + 1 : ((isset($_REQUEST['prev'])) ? $step - 1 : $step);
+				}
 
 				// Build up the specific hidden fields
 				foreach ($exclude as $num => $key_ary)
@@ -561,7 +569,7 @@ class acp_profile
 						$var = $profile_field->prepare_hidden_fields($step, $key, $action, $field_data);
 						if ($var !== null)
 						{
-							$_new_key_ary[$key] = $profile_field->prepare_hidden_fields($step, $key, $action, $field_data);
+							$_new_key_ary[$key] = $var;
 						}
 					}
 					$cp->vars = $field_data;
@@ -571,11 +579,7 @@ class acp_profile
 
 				if (!sizeof($error))
 				{
-					if ($step == 3 && (sizeof($this->lang_defs['iso']) == 1 || $save))
-					{
-						$this->save_profile_field($cp, $field_type, $action);
-					}
-					else if ($action == 'edit' && $save)
+					if (($step == 3 && (sizeof($this->lang_defs['iso']) == 1 || $save)) || ($action == 'edit' && $save))
 					{
 						$this->save_profile_field($cp, $field_type, $action);
 					}
--- a/includes/acp/acp_prune.php
+++ b/includes/acp/acp_prune.php
@@ -28,7 +28,11 @@ class acp_prune
 		global $user, $phpEx, $phpbb_admin_path, $phpbb_root_path;
 
 		$user->add_lang('acp/prune');
-		include_once($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+
+		if (!function_exists('user_active_flip'))
+		{
+			include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+		}
 
 		switch ($mode)
 		{
--- a/includes/acp/acp_send_statistics.php
+++ b/includes/acp/acp_send_statistics.php
@@ -27,7 +27,10 @@ class acp_send_statistics
 	{
 		global $config, $template, $phpbb_admin_path, $phpbb_root_path, $phpEx;
 
-		include($phpbb_root_path . 'includes/questionnaire/questionnaire.' . $phpEx);
+		if (!class_exists('phpbb_questionnaire_data_collector'))
+		{
+			include($phpbb_root_path . 'includes/questionnaire/questionnaire.' . $phpEx);
+		}
 
 		$collect_url = "https://www.phpbb.com/stats/receive_stats.php";
 
--- a/includes/acp/acp_styles.php
+++ b/includes/acp/acp_styles.php
@@ -56,9 +56,12 @@ class acp_styles
 	/** @var string */
 	protected $php_ext;
 
+	/** @var \phpbb\event\dispatcher_interface */
+	protected $dispatcher;
+
 	public function main($id, $mode)
 	{
-		global $db, $user, $phpbb_admin_path, $phpbb_root_path, $phpEx, $template, $request, $cache, $auth, $config;
+		global $db, $user, $phpbb_admin_path, $phpbb_root_path, $phpEx, $template, $request, $cache, $auth, $config, $phpbb_dispatcher;
 
 		$this->db = $db;
 		$this->user = $user;
@@ -69,6 +72,7 @@ class acp_styles
 		$this->config = $config;
 		$this->phpbb_root_path = $phpbb_root_path;
 		$this->php_ext = $phpEx;
+		$this->dispatcher = $phpbb_dispatcher;
 
 		$this->default_style = $config['default_style'];
 		$this->styles_path = $this->phpbb_root_path . $this->styles_path_absolute . '/';
@@ -118,6 +122,18 @@ class acp_styles
 			)
 		);
 
+		/**
+		 * Run code before ACP styles action execution
+		 *
+		 * @event core.acp_styles_action_before
+		 * @var	int     id          Module ID
+		 * @var	string  mode        Active module
+		 * @var	string  action      Module that should be run
+		 * @since 3.1.7-RC1
+		 */
+		$vars = array('id', 'mode', 'action');
+		extract($this->dispatcher->trigger_event('core.acp_styles_action_before', compact($vars)));
+
 		// Execute actions
 		switch ($action)
 		{
--- a/includes/acp/acp_users.php
+++ b/includes/acp/acp_users.php
@@ -44,6 +44,11 @@ class acp_users
 		$user_id	= request_var('u', 0);
 		$action		= request_var('action', '');
 
+		// Get referer to redirect user to the appropriate page after delete action
+		$redirect		= request_var('redirect', '');
+		$redirect_tag	= "redirect=$redirect";
+		$redirect_url	= append_sid("{$phpbb_admin_path}index.$phpEx", "i=$redirect");
+
 		$submit		= (isset($_POST['update']) && !isset($_POST['cancel'])) ? true : false;
 
 		$form_name = 'acp_users';
@@ -52,7 +57,10 @@ class acp_users
 		// Whois (special case)
 		if ($action == 'whois')
 		{
-			include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+			if (!function_exists('user_get_id_name'))
+			{
+				include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+			}
 
 			$this->page_title = 'WHOIS';
 			$this->tpl_name = 'simple_body';
@@ -146,9 +154,9 @@ class acp_users
 		}
 
 		$template->assign_vars(array(
-			'U_BACK'			=> $this->u_action,
+			'U_BACK'			=> (empty($redirect)) ? $this->u_action : $redirect_url,
 			'U_MODE_SELECT'		=> append_sid("{$phpbb_admin_path}index.$phpEx", "i=$id&amp;u=$user_id"),
-			'U_ACTION'			=> $this->u_action . '&amp;u=' . $user_id,
+			'U_ACTION'			=> $this->u_action . '&amp;u=' . $user_id . ((empty($redirect)) ? '' : '&amp;' . $redirect_tag),
 			'S_FORM_OPTIONS'	=> $s_form_options,
 			'MANAGED_USERNAME'	=> $user_row['username'])
 		);
@@ -165,7 +173,10 @@ class acp_users
 		{
 			case 'overview':
 
-				include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+				if (!function_exists('user_get_id_name'))
+				{
+					include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+				}
 
 				$user->add_lang('acp/ban');
 
@@ -221,19 +232,30 @@ class acp_users
 								user_delete($delete_type, $user_id, $user_row['username']);
 
 								add_log('admin', 'LOG_USER_DELETED', $user_row['username']);
-								trigger_error($user->lang['USER_DELETED'] . adm_back_link($this->u_action));
+								trigger_error($user->lang['USER_DELETED'] . adm_back_link(
+										(empty($redirect)) ? $this->u_action : $redirect_url
+									)
+								);
 							}
 							else
 							{
-								confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
+								$delete_confirm_hidden_fields = array(
 									'u'				=> $user_id,
 									'i'				=> $id,
 									'mode'			=> $mode,
 									'action'		=> $action,
 									'update'		=> true,
 									'delete'		=> 1,
-									'delete_type'	=> $delete_type))
+									'delete_type'	=> $delete_type,
 								);
+
+								// Checks if the redirection page is specified
+								if (!empty($redirect))
+								{
+									$delete_confirm_hidden_fields['redirect'] = $redirect;
+								}
+
+								confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields($delete_confirm_hidden_fields));
 							}
 						}
 						else
@@ -338,7 +360,10 @@ class acp_users
 
 							if ($config['email_enable'])
 							{
-								include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
+								if (!class_exists('messenger'))
+								{
+									include($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
+								}
 
 								$server_url = generate_board_url();
 
@@ -421,7 +446,10 @@ class acp_users
 									$phpbb_notifications = $phpbb_container->get('notification_manager');
 									$phpbb_notifications->delete_notifications('notification.type.admin_activate_user', $user_row['user_id']);
 
-									include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
+									if (!class_exists('messenger'))
+									{
+										include($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
+									}
 
 									$messenger = new messenger(false);
 
@@ -1345,7 +1373,10 @@ class acp_users
 
 			case 'profile':
 
-				include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+				if (!function_exists('user_get_id_name'))
+				{
+					include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+				}
 
 				$cp = $phpbb_container->get('profilefields.manager');
 
@@ -1504,7 +1535,10 @@ class acp_users
 
 			case 'prefs':
 
-				include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+				if (!function_exists('user_get_id_name'))
+				{
+					include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+				}
 
 				$data = array(
 					'dateformat'		=> utf8_normalize_nfc(request_var('dateformat', $user_row['user_dateformat'], true)),
@@ -1774,8 +1808,6 @@ class acp_users
 
 			case 'avatar':
 
-				include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
-
 				$avatars_enabled = false;
 
 				if ($config['allow_avatar'])
@@ -1930,8 +1962,15 @@ class acp_users
 
 			case 'sig':
 
-				include_once($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
-				include_once($phpbb_root_path . 'includes/functions_display.' . $phpEx);
+				if (!function_exists('generate_smilies'))
+				{
+					include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
+				}
+
+				if (!function_exists('display_custom_bbcodes'))
+				{
+					include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
+				}
 
 				$enable_bbcode	= ($config['allow_sig_bbcode']) ? (bool) $this->optionget($user_row, 'sig_bbcode') : false;
 				$enable_smilies	= ($config['allow_sig_smilies']) ? (bool) $this->optionget($user_row, 'sig_smilies') : false;
@@ -1942,7 +1981,10 @@ class acp_users
 
 				if ($submit || $preview)
 				{
-					include_once($phpbb_root_path . 'includes/message_parser.' . $phpEx);
+					if (!class_exists('messenger'))
+					{
+						include($phpbb_root_path . 'includes/message_parser.' . $phpEx);
+					}
 
 					$enable_bbcode	= ($config['allow_sig_bbcode']) ? ((request_var('disable_bbcode', false)) ? false : true) : false;
 					$enable_smilies	= ($config['allow_sig_smilies']) ? ((request_var('disable_smilies', false)) ? false : true) : false;
@@ -2183,7 +2225,10 @@ class acp_users
 
 			case 'groups':
 
-				include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+				if (!function_exists('group_user_attributes'))
+				{
+					include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
+				}
 
 				$user->add_lang(array('groups', 'acp/groups'));
 				$group_id = request_var('g', 0);
@@ -2399,7 +2444,10 @@ class acp_users
 
 			case 'perm':
 
-				include_once($phpbb_root_path . 'includes/acp/auth.' . $phpEx);
+				if (!class_exists('auth_admin'))
+				{
+					include($phpbb_root_path . 'includes/acp/auth.' . $phpEx);
+				}
 
 				$auth_admin = new auth_admin();
 
--- a/includes/acp/auth.php
+++ b/includes/acp/auth.php
@@ -1113,6 +1113,11 @@ class auth_admin extends \phpbb\auth\auth
 		@reset($category_array);
 		while (list($cat, $cat_array) = each($category_array))
 		{
+			if (!$phpbb_permissions->category_defined($cat))
+			{
+				continue;
+			}
+
 			$template->assign_block_vars($tpl_cat, array(
 				'S_YES'		=> ($cat_array['S_YES'] && !$cat_array['S_NEVER'] && !$cat_array['S_NO']) ? true : false,
 				'S_NEVER'	=> ($cat_array['S_NEVER'] && !$cat_array['S_YES'] && !$cat_array['S_NO']) ? true : false,
@@ -1139,6 +1144,11 @@ class auth_admin extends \phpbb\auth\auth
 			@reset($cat_array['permissions']);
 			while (list($permission, $allowed) = each($cat_array['permissions']))
 			{
+				if (!$phpbb_permissions->permission_defined($permission))
+				{
+					continue;
+				}
+
 				if ($s_view)
 				{
 					$template->assign_block_vars($tpl_cat . '.' . $tpl_mask, array(
--- a/includes/constants.php
+++ b/includes/constants.php
@@ -28,7 +28,7 @@ if (!defined('IN_PHPBB'))
 */
 
 // phpBB Version
-define('PHPBB_VERSION', '3.1.6');
+define('PHPBB_VERSION', '3.1.7-pl1');
 
 // QA-related
 // define('PHPBB_QA', 1);
--- a/includes/functions.php
+++ b/includes/functions.php
@@ -4264,10 +4264,14 @@ function obtain_users_online_string($online_users, $item_id = 0, $item = 'forum'
 
 	if (sizeof($online_users['online_users']))
 	{
-		$sql = 'SELECT username, username_clean, user_id, user_type, user_allow_viewonline, user_colour
-				FROM ' . USERS_TABLE . '
-				WHERE ' . $db->sql_in_set('user_id', $online_users['online_users']) . '
-				ORDER BY username_clean ASC';
+		$sql_ary = array(
+			'SELECT'	=> 'u.username, u.username_clean, u.user_id, u.user_type, u.user_allow_viewonline, u.user_colour',
+			'FROM'		=> array(
+				USERS_TABLE	=> 'u',
+			),
+			'WHERE'		=> $db->sql_in_set('u.user_id', $online_users['online_users']),
+			'ORDER_BY'	=> 'u.username_clean ASC',
+		);
 
 		/**
 		* Modify SQL query to obtain online users data
@@ -4279,13 +4283,14 @@ function obtain_users_online_string($online_users, $item_id = 0, $item = 'forum'
 		* @var	string	item			Restrict online users to a certain
 		*								session item, e.g. forum for
 		*								session_forum_id
-		* @var	string	sql				SQL query to obtain users online data
+		* @var	string	sql_ary			SQL query to obtain users online data
 		* @since 3.1.4-RC1
+		* @changed 3.1.7-RC1			Change sql query into array and adjust var accordingly. Allows extension authors the ability to adjust the sql_ary.
 		*/
-		$vars = array('online_users', 'item_id', 'item', 'sql');
+		$vars = array('online_users', 'item_id', 'item', 'sql_ary');
 		extract($phpbb_dispatcher->trigger_event('core.obtain_users_online_string_sql', compact($vars)));
 
-		$result = $db->sql_query($sql);
+		$result = $db->sql_query($db->sql_build_query('SELECT', $sql_ary));
 		$rowset = $db->sql_fetchrowset($result);
 		$db->sql_freeresult($result);
 
@@ -4299,7 +4304,7 @@ function obtain_users_online_string($online_users, $item_id = 0, $item = 'forum'
 					$row['username'] = '<em>' . $row['username'] . '</em>';
 				}
 
-				if (!isset($online_users['hidden_users'][$row['user_id']]) || $auth->acl_get('u_viewonline'))
+				if (!isset($online_users['hidden_users'][$row['user_id']]) || $auth->acl_get('u_viewonline') || $row['user_id'] === $user->data['user_id'])
 				{
 					$user_online_link[$row['user_id']] = get_username_string(($row['user_type'] <> USER_IGNORE) ? 'full' : 'no_profile', $row['user_id'], $row['username'], $row['user_colour']);
 				}
@@ -4837,7 +4842,7 @@ function phpbb_get_avatar($row, $alt, $ignore_config = false, $lazy = false)
 	);
 
 	$phpbb_avatar_manager = $phpbb_container->get('avatar.manager');
-	$driver = $phpbb_avatar_manager->get_driver($row['avatar_type'], $ignore_config);
+	$driver = $phpbb_avatar_manager->get_driver($row['avatar_type'], !$ignore_config);
 	$html = '';
 
 	if ($driver)
@@ -4848,7 +4853,7 @@ function phpbb_get_avatar($row, $alt, $ignore_config = false, $lazy = false)
 			return $html;
 		}
 
-		$avatar_data = $driver->get_data($row, $ignore_config);
+		$avatar_data = $driver->get_data($row);
 	}
 	else
 	{
@@ -5390,6 +5395,8 @@ function page_footer($run_cron = true, $display_template = true, $exit_handler =
 		return;
 	}
 
+	$user->update_session_infos();
+
 	phpbb_check_and_display_sql_report($request, $auth, $db);
 
 	$template->assign_vars(array(
--- a/includes/functions_acp.php
+++ b/includes/functions_acp.php
@@ -164,6 +164,8 @@ function adm_page_footer($copyright_html = true)
 		return;
 	}
 
+	$user->update_session_infos();
+
 	phpbb_check_and_display_sql_report($request, $auth, $db);
 
 	$template->assign_vars(array(
--- a/includes/functions_admin.php
+++ b/includes/functions_admin.php
@@ -576,7 +576,7 @@ function move_topics($topic_ids, $forum_id, $auto_sync = true)
 */
 function move_posts($post_ids, $topic_id, $auto_sync = true)
 {
-	global $db;
+	global $db, $phpbb_dispatcher;
 
 	if (!is_array($post_ids))
 	{
@@ -610,6 +610,28 @@ function move_posts($post_ids, $topic_id, $auto_sync = true)
 		trigger_error('NO_TOPIC');
 	}
 
+	/**
+	 * Perform additional actions before moving posts
+	 *
+	 * @event core.move_posts_before
+	 * @var	array	post_ids	Array of post ids to move
+	 * @var	string	topic_id	The topic id the posts are moved to
+	 * @var bool	auto_sync	Whether or not to perform auto sync
+	 * @var	array	forum_ids	Array of the forum ids the posts are moved from
+	 * @var	array	topic_ids	Array of the topic ids the posts are moved from
+	 * @var	array	forum_row	Array with the forum id of the topic the posts are moved to
+	 * @since 3.1.7-RC1
+	 */
+	$vars = array(
+			'post_ids',
+			'topic_id',
+			'auto_sync',
+			'forum_ids',
+			'topic_ids',
+			'forum_row',
+	);
+	extract($phpbb_dispatcher->trigger_event('core.move_posts_before', compact($vars)));
+
 	$sql = 'UPDATE ' . POSTS_TABLE . '
 		SET forum_id = ' . (int) $forum_row['forum_id'] . ", topic_id = $topic_id
 		WHERE " . $db->sql_in_set('post_id', $post_ids);
@@ -620,6 +642,28 @@ function move_posts($post_ids, $topic_id, $auto_sync = true)
 		WHERE " . $db->sql_in_set('post_msg_id', $post_ids);
 	$db->sql_query($sql);
 
+	/**
+	 * Perform additional actions after moving posts
+	 *
+	 * @event core.move_posts_after
+	 * @var	array	post_ids	Array of the moved post ids
+	 * @var	string	topic_id	The topic id the posts are moved to
+	 * @var bool	auto_sync	Whether or not to perform auto sync
+	 * @var	array	forum_ids	Array of the forum ids the posts are moved from
+	 * @var	array	topic_ids	Array of the topic ids the posts are moved from
+	 * @var	array	forum_row	Array with the forum id of the topic the posts are moved to
+	 * @since 3.1.7-RC1
+	 */
+	$vars = array(
+			'post_ids',
+			'topic_id',
+			'auto_sync',
+			'forum_ids',
+			'topic_ids',
+			'forum_row',
+	);
+	extract($phpbb_dispatcher->trigger_event('core.move_posts_after', compact($vars)));
+
 	if ($auto_sync)
 	{
 		$forum_ids[] = (int) $forum_row['forum_id'];
@@ -785,6 +829,7 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
 		'notification.type.quote',
 		'notification.type.approve_post',
 		'notification.type.post_in_queue',
+		'notification.type.report_post',
 	);
 
 	/**
@@ -886,6 +931,32 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
 
 	$table_ary = array(POSTS_TABLE, REPORTS_TABLE);
 
+	/**
+	* Perform additional actions during post(s) deletion before running the queries
+	*
+	* @event core.delete_posts_in_transaction_before
+	* @var	array	post_ids					Array with deleted posts' ids
+	* @var	array	poster_ids					Array with deleted posts' author ids
+	* @var	array	topic_ids					Array with deleted posts' topic ids
+	* @var	array	forum_ids					Array with deleted posts' forum ids
+	* @var	string	where_type					Variable containing posts deletion mode
+	* @var	mixed	where_ids					Array or comma separated list of post ids to delete
+	* @var	array	delete_notifications_types	Array with notifications types to delete
+	* @var	array	table_ary					Array with table names to delete data from
+	* @since 3.1.7-RC1
+	*/
+	$vars = array(
+		'post_ids',
+		'poster_ids',
+		'topic_ids',
+		'forum_ids',
+		'where_type',
+		'where_ids',
+		'delete_notifications_types',
+		'table_ary',
+	);
+	extract($phpbb_dispatcher->trigger_event('core.delete_posts_in_transaction_before', compact($vars)));
+
 	foreach ($table_ary as $table)
 	{
 		$sql = "DELETE FROM $table
@@ -1042,7 +1113,7 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
 */
 function delete_attachments($mode, $ids, $resync = true)
 {
-	global $db, $config;
+	global $db, $config, $phpbb_dispatcher;
 
 	// 0 is as bad as an empty array
 	if (empty($ids))
@@ -1087,6 +1158,24 @@ function delete_attachments($mode, $ids, $resync = true)
 
 	$post_ids = $message_ids = $topic_ids = $physical = array();
 
+	/**
+	* Perform additional actions before collecting data for attachment(s) deletion
+	*
+	* @event core.delete_attachments_collect_data_before
+	* @var	string	mode			Variable containing attachments deletion mode, can be: post|message|topic|attach|user
+	* @var	mixed	ids				Array or comma separated list of ids corresponding to the mode
+	* @var	bool	resync			Flag indicating if posts/messages/topics should be synchronized
+	* @var	string	sql_id			The field name to collect/delete data for depending on the mode
+	* @since 3.1.7-RC1
+	*/
+	$vars = array(
+		'mode',
+		'ids',
+		'resync',
+		'sql_id',
+	);
+	extract($phpbb_dispatcher->trigger_event('core.delete_attachments_collect_data_before', compact($vars)));
+
 	// Collect post and topic ids for later use if we need to touch remaining entries (if resync is enabled)
 	$sql = 'SELECT post_msg_id, topic_id, in_message, physical_filename, thumbnail, filesize, is_orphan
 			FROM ' . ATTACHMENTS_TABLE . '
@@ -1116,6 +1205,32 @@ function delete_attachments($mode, $ids, $resync = true)
 	}
 	$db->sql_freeresult($result);
 
+	/**
+	* Perform additional actions before attachment(s) deletion
+	*
+	* @event core.delete_attachments_before
+	* @var	string	mode			Variable containing attachments deletion mode, can be: post|message|topic|attach|user
+	* @var	mixed	ids				Array or comma separated list of ids corresponding to the mode
+	* @var	bool	resync			Flag indicating if posts/messages/topics should be synchronized
+	* @var	string	sql_id			The field name to collect/delete data for depending on the mode
+	* @var	array	post_ids		Array with post ids for deleted attachment(s)
+	* @var	array	topic_ids		Array with topic ids for deleted attachment(s)
+	* @var	array	message_ids		Array with private message ids for deleted attachment(s)
+	* @var	array	physical		Array with deleted attachment(s) physical file(s) data
+	* @since 3.1.7-RC1
+	*/
+	$vars = array(
+		'mode',
+		'ids',
+		'resync',
+		'sql_id',
+		'post_ids',
+		'topic_ids',
+		'message_ids',
+		'physical',
+	);
+	extract($phpbb_dispatcher->trigger_event('core.delete_attachments_before', compact($vars)));
+
 	// Delete attachments
 	$sql = 'DELETE FROM ' . ATTACHMENTS_TABLE . '
 		WHERE ' . $db->sql_in_set($sql_id, $ids);
@@ -1125,6 +1240,34 @@ function delete_attachments($mode, $ids, $resync = true)
 	$db->sql_query($sql);
 	$num_deleted = $db->sql_affectedrows();
 
+	/**
+	* Perform additional actions after attachment(s) deletion from the database
+	*
+	* @event core.delete_attachments_from_database_after
+	* @var	string	mode			Variable containing attachments deletion mode, can be: post|message|topic|attach|user
+	* @var	mixed	ids				Array or comma separated list of ids corresponding to the mode
+	* @var	bool	resync			Flag indicating if posts/messages/topics should be synchronized
+	* @var	string	sql_id			The field name to collect/delete data for depending on the mode
+	* @var	array	post_ids		Array with post ids for deleted attachment(s)
+	* @var	array	topic_ids		Array with topic ids for deleted attachment(s)
+	* @var	array	message_ids		Array with private message ids for deleted attachment(s)
+	* @var	array	physical		Array with deleted attachment(s) physical file(s) data
+	* @var	int		num_deleted		The number of deleted attachment(s) from the database
+	* @since 3.1.7-RC1
+	*/
+	$vars = array(
+		'mode',
+		'ids',
+		'resync',
+		'sql_id',
+		'post_ids',
+		'topic_ids',
+		'message_ids',
+		'physical',
+		'num_deleted',
+	);
+	extract($phpbb_dispatcher->trigger_event('core.delete_attachments_from_database_after', compact($vars)));
+
 	if (!$num_deleted)
 	{
 		return 0;
@@ -1147,6 +1290,38 @@ function delete_attachments($mode, $ids, $resync = true)
 		}
 	}
 
+	/**
+	* Perform additional actions after attachment(s) deletion from the filesystem
+	*
+	* @event core.delete_attachments_from_filesystem_after
+	* @var	string	mode			Variable containing attachments deletion mode, can be: post|message|topic|attach|user
+	* @var	mixed	ids				Array or comma separated list of ids corresponding to the mode
+	* @var	bool	resync			Flag indicating if posts/messages/topics should be synchronized
+	* @var	string	sql_id			The field name to collect/delete data for depending on the mode
+	* @var	array	post_ids		Array with post ids for deleted attachment(s)
+	* @var	array	topic_ids		Array with topic ids for deleted attachment(s)
+	* @var	array	message_ids		Array with private message ids for deleted attachment(s)
+	* @var	array	physical		Array with deleted attachment(s) physical file(s) data
+	* @var	int		num_deleted		The number of deleted attachment(s) from the database
+	* @var	int		space_removed	The size of deleted files(s) from the filesystem
+	* @var	int		files_removed	The number of deleted file(s) from the filesystem
+	* @since 3.1.7-RC1
+	*/
+	$vars = array(
+		'mode',
+		'ids',
+		'resync',
+		'sql_id',
+		'post_ids',
+		'topic_ids',
+		'message_ids',
+		'physical',
+		'num_deleted',
+		'space_removed',
+		'files_removed',
+	);
+	extract($phpbb_dispatcher->trigger_event('core.delete_attachments_from_filesystem_after', compact($vars)));
+
 	if ($space_removed || $files_removed)
 	{
 		set_config_count('upload_dir_size', $space_removed * (-1), true);
--- a/includes/functions_display.php
+++ b/includes/functions_display.php
@@ -1496,7 +1496,7 @@ function watch_topic_forum($mode, &$s_watching, $user_id, $forum_id, $topic_id,
 * @param array $user_data the current stored users data
 * @param int $user_posts the users number of posts
 *
-* @return array An associative array containing the rank title (title), the rank image source (img) and the rank image as full img tag (img)
+* @return array An associative array containing the rank title (title), the rank image as full img tag (img) and the rank image source (img_src)
 *
 * Note: since we do not want to break backwards-compatibility, this function will only properly assign ranks to guests if you call it for them with user_posts == false
 */
--- a/includes/functions_mcp.php
+++ b/includes/functions_mcp.php
@@ -388,7 +388,7 @@ function phpbb_mcp_sorting($mode, &$sort_days, &$sort_key, &$sort_dir, &$sort_by
 
 			if (!$auth->acl_get('m_approve', $forum_id))
 			{
-				$sql .= 'AND topic_visibility = ' . ITEM_APPROVED;
+				$sql .= ' AND topic_visibility = ' . ITEM_APPROVED;
 			}
 			break;
 
@@ -404,7 +404,7 @@ function phpbb_mcp_sorting($mode, &$sort_days, &$sort_key, &$sort_dir, &$sort_by
 
 			if (!$auth->acl_get('m_approve', $forum_id))
 			{
-				$sql .= 'AND post_visibility = ' . ITEM_APPROVED;
+				$sql .= ' AND post_visibility = ' . ITEM_APPROVED;
 			}
 			break;
 
--- a/includes/functions_messenger.php
+++ b/includes/functions_messenger.php
@@ -902,6 +902,8 @@ class queue
 			fclose($fp);
 
 			phpbb_chmod($this->cache_file, CHMOD_READ | CHMOD_WRITE);
+
+			$this->data = array();
 		}
 
 		$lock->release();
--- a/includes/functions_posting.php
+++ b/includes/functions_posting.php
@@ -310,6 +310,7 @@ function posting_gen_topic_icons($mode, $icon_id)
 			{
 				$template->assign_block_vars('topic_icon', array(
 					'ICON_ID'		=> $id,
+					'ICON_NAME'		=> $data['img'],
 					'ICON_IMG'		=> $root_path . $config['icons_path'] . '/' . $data['img'],
 					'ICON_WIDTH'	=> $data['width'],
 					'ICON_HEIGHT'	=> $data['height'],
--- a/includes/functions_privmsgs.php
+++ b/includes/functions_privmsgs.php
@@ -1594,7 +1594,7 @@ function get_folder_status($folder_id, $folder)
 		'percent'		=> ($user->data['message_limit']) ? (($user->data['message_limit'] > 0) ? floor(($folder['num_messages'] / $user->data['message_limit']) * 100) : 100) : 0,
 	);
 
-	$return['message']	= $user->lang('FOLDER_STATUS_MSG', $user->lang('MESSAGES_COUNT', (int) $return['max']), $return['cur'], $return['percent']);
+	$return['message']	= $user->lang('FOLDER_STATUS_MSG', $user->lang('MESSAGES_COUNT', (int) $return['max']), (int) $return['cur'], $return['percent']);
 
 	return $return;
 }
--- a/includes/functions_user.php
+++ b/includes/functions_user.php
@@ -2698,7 +2698,7 @@ function group_delete($group_id, $group_name = false)
 */
 function group_user_add($group_id, $user_id_ary = false, $username_ary = false, $group_name = false, $default = false, $leader = 0, $pending = 0, $group_attributes = false)
 {
-	global $db, $auth, $phpbb_container;
+	global $db, $auth, $phpbb_container, $phpbb_dispatcher;
 
 	// We need both username and user_id info
 	$result = user_get_id_name($user_id_ary, $username_ary);
@@ -2775,6 +2775,26 @@ function group_user_add($group_id, $user_id_ary = false, $username_ary = false,
 	// Clear permissions cache of relevant users
 	$auth->acl_clear_prefetch($user_id_ary);
 
+	/**
+	* Event after users are added to a group
+	*
+	* @event core.group_add_user_after
+	* @var	int	group_id		ID of the group to which users are added
+	* @var	string group_name		Name of the group
+	* @var	array	user_id_ary		IDs of the users which are added
+	* @var	array	username_ary	names of the users which are added
+	* @var	int		pending			Pending setting, 1 if user(s) added are pending
+	* @since 3.1.7-RC1
+	*/
+	$vars = array(
+		'group_id',
+		'group_name',
+		'user_id_ary',
+		'username_ary',
+		'pending',
+	);
+	extract($phpbb_dispatcher->trigger_event('core.group_add_user_after', compact($vars)));
+
 	if (!$group_name)
 	{
 		$group_name = get_group_name($group_id);
@@ -2933,6 +2953,19 @@ function group_user_del($group_id, $user_id_ary = false, $username_ary = false,
 	// Clear permissions cache of relevant users
 	$auth->acl_clear_prefetch($user_id_ary);
 
+	/**
+	* Event after users are removed from a group
+	*
+	* @event core.group_delete_user_after
+	* @var	int		group_id		ID of the group from which users are deleted
+	* @var	string	group_name		Name of the group
+	* @var	array	user_id_ary		IDs of the users which are removed
+	* @var	array	username_ary	names of the users which are removed
+	* @since 3.1.7-RC1
+	*/
+	$vars = array('group_id', 'group_name', 'user_id_ary', 'username_ary');
+	extract($phpbb_dispatcher->trigger_event('core.group_delete_user_after', compact($vars)));
+
 	if (!$group_name)
 	{
 		$group_name = get_group_name($group_id);
--- a/includes/mcp/info/mcp_pm_reports.php
+++ b/includes/mcp/info/mcp_pm_reports.php
@@ -20,9 +20,9 @@ class mcp_pm_reports_info
 			'title'		=> 'MCP_PM_REPORTS',
 			'version'	=> '1.0.0',
 			'modes'		=> array(
-				'pm_reports'		=> array('title' => 'MCP_PM_REPORTS_OPEN', 'auth' => 'aclf_m_report', 'cat' => array('MCP_REPORTS')),
-				'pm_reports_closed'	=> array('title' => 'MCP_PM_REPORTS_CLOSED', 'auth' => 'aclf_m_report', 'cat' => array('MCP_REPORTS')),
-				'pm_report_details'	=> array('title' => 'MCP_PM_REPORT_DETAILS', 'auth' => 'aclf_m_report', 'cat' => array('MCP_REPORTS')),
+				'pm_reports'		=> array('title' => 'MCP_PM_REPORTS_OPEN', 'auth' => 'acl_m_pm_report', 'cat' => array('MCP_REPORTS')),
+				'pm_reports_closed'	=> array('title' => 'MCP_PM_REPORTS_CLOSED', 'auth' => 'acl_m_pm_report', 'cat' => array('MCP_REPORTS')),
+				'pm_report_details'	=> array('title' => 'MCP_PM_REPORT_DETAILS', 'auth' => 'acl_m_pm_report', 'cat' => array('MCP_REPORTS')),
 			),
 		);
 	}
--- a/includes/mcp/mcp_forum.php
+++ b/includes/mcp/mcp_forum.php
@@ -35,15 +35,6 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
 	// merge_topic is the quickmod action, merge_topics is the mcp_forum action, and merge_select is the mcp_topic action
 	$merge_select = ($action == 'merge_select' || $action == 'merge_topic' || $action == 'merge_topics') ? true : false;
 
-	if ($merge_select)
-	{
-		// Fixes a "bug" that makes forum_view use the same ordering as topic_view
-		$request->overwrite('sk', null);
-		$request->overwrite('sd', null);
-		$request->overwrite('sk', null, \phpbb\request\request_interface::POST);
-		$request->overwrite('sd', null, \phpbb\request\request_interface::POST);
-	}
-
 	$forum_id			= $forum_info['forum_id'];
 	$start				= request_var('start', 0);
 	$topic_id_list		= request_var('topic_id_list', array(0));
--- a/includes/mcp/mcp_front.php
+++ b/includes/mcp/mcp_front.php
@@ -274,7 +274,7 @@ function mcp_front_view($id, $mode, $action)
 	}
 
 	// Latest 5 reported PMs
-	if ($module->loaded('pm_reports') && $auth->acl_getf_global('m_report'))
+	if ($module->loaded('pm_reports') && $auth->acl_get('m_pm_report'))
 	{
 		$template->assign_var('S_SHOW_PM_REPORTS', true);
 		$user->add_lang(array('ucp'));
--- a/includes/mcp/mcp_main.php
+++ b/includes/mcp/mcp_main.php
@@ -262,7 +262,7 @@ class mcp_main
 */
 function lock_unlock($action, $ids)
 {
-	global $auth, $user, $db, $phpEx, $phpbb_root_path, $request;
+	global $auth, $user, $db, $phpEx, $phpbb_root_path, $request, $phpbb_dispatcher;
 
 	if ($action == 'lock' || $action == 'unlock')
 	{
@@ -322,6 +322,22 @@ function lock_unlock($action, $ids)
 			add_log('mod', $row['forum_id'], $row['topic_id'], 'LOG_' . strtoupper($action), $row['topic_title']);
 		}
 
+		/**
+		 * Perform additional actions after locking/unlocking posts/topics
+		 *
+		 * @event core.mcp_lock_unlock_after
+		 * @var	string	action				Variable containing the action we perform on the posts/topics ('lock', 'unlock', 'lock_post' or 'unlock_post')
+		 * @var	array	ids					Array containing the post/topic IDs that have been locked/unlocked
+		 * @var	array	data				Array containing posts/topics data
+		 * @since 3.1.7-RC1
+		 */
+		$vars = array(
+			'action',
+			'ids',
+			'data',
+		);
+		extract($phpbb_dispatcher->trigger_event('core.mcp_lock_unlock_after', compact($vars)));
+
 		$success_msg = $l_prefix . ((sizeof($ids) == 1) ? '' : 'S') . '_' . (($action == 'lock' || $action == 'lock_post') ? 'LOCKED' : 'UNLOCKED') . '_SUCCESS';
 
 		meta_refresh(2, $redirect);
--- a/includes/mcp/mcp_post.php
+++ b/includes/mcp/mcp_post.php
@@ -549,16 +549,6 @@ function change_poster(&$post_info, $userdata)
 	$from_username = $post_info['username'];
 	$to_username = $userdata['username'];
 
-	// Renew post info
-	$post_info = phpbb_get_post_data(array($post_id), false, true);
-
-	if (!sizeof($post_info))
-	{
-		trigger_error('POST_NOT_EXIST');
-	}
-
-	$post_info = $post_info[$post_id];
-
 	/**
 	* This event allows you to perform additional tasks after changing a post's poster
 	*
@@ -566,10 +556,21 @@ function change_poster(&$post_info, $userdata)
 	* @var	array	userdata	Information on a post's new poster
 	* @var	array	post_info	Information on the affected post
 	* @since 3.1.6-RC1
+	* @changed 3.1.7-RC1		Change location to prevent post_info from being set to the new post information
 	*/
 	$vars = array('userdata', 'post_info');
 	extract($phpbb_dispatcher->trigger_event('core.mcp_change_poster_after', compact($vars)));
 
+	// Renew post info
+	$post_info = phpbb_get_post_data(array($post_id), false, true);
+
+	if (!sizeof($post_info))
+	{
+		trigger_error('POST_NOT_EXIST');
+	}
+
+	$post_info = $post_info[$post_id];
+
 	// Now add log entry
 	add_log('mod', $post_info['forum_id'], $post_info['topic_id'], 'LOG_MCP_CHANGE_POSTER', $post_info['topic_title'], $from_username, $to_username);
 }
--- a/includes/mcp/mcp_queue.php
+++ b/includes/mcp/mcp_queue.php
@@ -72,6 +72,7 @@ class mcp_queue
 			case 'delete':
 				$post_id_list = $request->variable('post_id_list', array(0));
 				$topic_id_list = $request->variable('topic_id_list', array(0));
+				$delete_reason = $request->variable('delete_reason', '', true);
 
 				if (!empty($post_id_list))
 				{
@@ -80,7 +81,7 @@ class mcp_queue
 						global $phpbb_root_path, $phpEx;
 						include($phpbb_root_path . 'includes/mcp/mcp_main.' . $phpEx);
 					}
-					mcp_delete_post($post_id_list, false, '', $action);
+					mcp_delete_post($post_id_list, false, $delete_reason, $action);
 				}
 				else if (!empty($topic_id_list))
 				{
@@ -89,7 +90,7 @@ class mcp_queue
 						global $phpbb_root_path, $phpEx;
 						include($phpbb_root_path . 'includes/mcp/mcp_main.' . $phpEx);
 					}
-					mcp_delete_topic($topic_id_list, false, '', $action);
+					mcp_delete_topic($topic_id_list, false, $delete_reason, $action);
 				}
 				else
 				{
@@ -283,6 +284,7 @@ class mcp_queue
 				$template->assign_vars(array(
 					'S_MCP_QUEUE'			=> true,
 					'U_APPROVE_ACTION'		=> append_sid("{$phpbb_root_path}mcp.$phpEx", "i=queue&amp;p=$post_id&amp;f=$forum_id"),
+					'S_CAN_DELETE_POST'		=> $auth->acl_get('m_delete', $post_info['forum_id']),
 					'S_CAN_VIEWIP'			=> $auth->acl_get('m_info', $post_info['forum_id']),
 					'S_POST_REPORTED'		=> $post_info['post_reported'],
 					'S_POST_UNAPPROVED'		=> $post_info['post_visibility'] == ITEM_UNAPPROVED || $post_info['post_visibility'] == ITEM_REAPPROVE,
@@ -1130,6 +1132,11 @@ class mcp_queue
 			// Build a list of posts to be disapproved and get the related topics real replies count
 			foreach ($post_info as $post_id => $post_data)
 			{
+				if ($mode === 'unapproved_topics' && $post_data['post_visibility'] == ITEM_APPROVED)
+				{
+					continue;
+				}
+
 				$post_disapprove_list[$post_id] = $post_data['topic_id'];
 				if (!isset($topic_posts_unapproved[$post_data['topic_id']]))
 				{
@@ -1139,6 +1146,12 @@ class mcp_queue
 				$topic_posts_unapproved[$post_data['topic_id']]++;
 			}
 
+			// Do not try to disapprove if no posts are selected
+			if (empty($post_disapprove_list))
+			{
+				trigger_error('NO_POST_SELECTED');
+			}
+
 			// Now we build the log array
 			foreach ($post_disapprove_list as $post_id => $topic_id)
 			{
@@ -1240,7 +1253,7 @@ class mcp_queue
 						continue;
 					}
 
-					$post_data['disapprove_reason'] = '';
+					$post_data['disapprove_reason'] = $disapprove_reason;
 					if (isset($disapprove_reason_lang))
 					{
 						// Okay we need to get the reason from the posters language
--- a/includes/mcp/mcp_topic.php
+++ b/includes/mcp/mcp_topic.php
@@ -194,6 +194,30 @@ function mcp_topic_view($id, $mode, $action)
 		}
 	}
 
+	/**
+	* Event to modify the post data for the MCP topic review before assigning the posts
+	*
+	* @event core.mcp_topic_modify_post_data
+	* @var	array	attachments		List of attachments post_id => array of attachments
+	* @var	int		forum_id		The forum ID we are currently in
+	* @var	int		id				ID of the tab we are displaying
+	* @var	string	mode			Mode of the MCP page we are displaying
+	* @var	array	post_id_list	Array with post ids we are going to display
+	* @var	array	rowset			Array with the posts data
+	* @var	int		topic_id		The topic ID we are currently reviewing
+	* @since 3.1.7-RC1
+	*/
+	$vars = array(
+		'attachments',
+		'forum_id',
+		'id',
+		'mode',
+		'post_id_list',
+		'rowset',
+		'topic_id',
+	);
+	extract($phpbb_dispatcher->trigger_event('core.mcp_topic_modify_post_data', compact($vars)));
+
 	foreach ($rowset as $i => $row)
 	{
 		$message = $row['post_text'];
--- a/includes/ucp/ucp_pm.php
+++ b/includes/ucp/ucp_pm.php
@@ -92,7 +92,7 @@ class ucp_pm
 
 				$user_folders = get_folder($user->data['user_id']);
 
-				if (!$auth->acl_get('u_sendpm'))
+				if ($action != 'delete' && !$auth->acl_get('u_sendpm'))
 				{
 					// trigger_error('NO_AUTH_SEND_MESSAGE');
 					$template->assign_vars(array(
--- a/includes/ucp/ucp_profile.php
+++ b/includes/ucp/ucp_profile.php
@@ -183,37 +183,12 @@ class ucp_profile
 
 							if ($config['require_activation'] == USER_ACTIVATION_ADMIN)
 							{
-								// Grab an array of user_id's with a_user permissions ... these users can activate a user
-								$admin_ary = $auth->acl_get_list(false, 'a_user', false);
-								$admin_ary = (!empty($admin_ary[0]['a_user'])) ? $admin_ary[0]['a_user'] : array();
-
-								// Also include founders
-								$where_sql = ' WHERE user_type = ' . USER_FOUNDER;
-
-								if (sizeof($admin_ary))
-								{
-									$where_sql .= ' OR ' . $db->sql_in_set('user_id', $admin_ary);
-								}
-
-								$sql = 'SELECT user_id, username, user_email, user_lang, user_jabber, user_notify_type
-									FROM ' . USERS_TABLE . ' ' .
-									$where_sql;
-								$result = $db->sql_query($sql);
-
-								while ($row = $db->sql_fetchrow($result))
-								{
-									$messenger->template('admin_activate', $row['user_lang']);
-									$messenger->set_addresses($row);
-
-									$messenger->assign_vars(array(
-										'USERNAME'			=> htmlspecialchars_decode($data['username']),
-										'U_USER_DETAILS'	=> "$server_url/memberlist.$phpEx?mode=viewprofile&u={$user->data['user_id']}",
-										'U_ACTIVATE'		=> "$server_url/ucp.$phpEx?mode=activate&u={$user->data['user_id']}&k=$user_actkey")
-									);
-
-									$messenger->send($row['user_notify_type']);
-								}
-								$db->sql_freeresult($result);
+								$notifications_manager = $phpbb_container->get('notification_manager');
+								$notifications_manager->add_notifications('notification.type.admin_activate_user', array(
+									'user_id'		=> $user->data['user_id'],
+									'user_actkey'	=> $user_actkey,
+									'user_regdate'	=> time(), // Notification time
+								));
 							}
 
 							user_active_flip('deactivate', $user->data['user_id'], INACTIVE_PROFILE);
--- a/index.php
+++ b/index.php
@@ -119,7 +119,7 @@ $db->sql_freeresult($result);
 $legend = implode($user->lang['COMMA_SEPARATOR'], $legend);
 
 // Generate birthday list if required ...
-$birthday_list = array();
+$birthdays = $birthday_list = array();
 if ($config['load_birthdays'] && $config['allow_birthdays'] && $auth->acl_gets('u_viewprofile', 'a_user', 'a_useradd', 'a_userdel'))
 {
 	$time = $user->create_datetime();
@@ -132,33 +132,66 @@ if ($config['load_birthdays'] && $config['allow_birthdays'] && $auth->acl_gets('
 		$leap_year_birthdays = " OR u.user_birthday LIKE '" . $db->sql_escape(sprintf('%2d-%2d-', 29, 2)) . "%'";
 	}
 
-	$sql = 'SELECT u.user_id, u.username, u.user_colour, u.user_birthday
-		FROM ' . USERS_TABLE . ' u
-		LEFT JOIN ' . BANLIST_TABLE . " b ON (u.user_id = b.ban_userid)
-		WHERE (b.ban_id IS NULL
-			OR b.ban_exclude = 1)
+	$sql_ary = array(
+		'SELECT' => 'u.user_id, u.username, u.user_colour, u.user_birthday',
+		'FROM' => array(
+			USERS_TABLE => 'u',
+		),
+		'LEFT_JOIN' => array(
+			array(
+				'FROM' => array(BANLIST_TABLE => 'b'),
+				'ON' => 'u.user_id = b.ban_userid',
+			),
+		),
+		'WHERE' => "(b.ban_id IS NULL OR b.ban_exclude = 1)
 			AND (u.user_birthday LIKE '" . $db->sql_escape(sprintf('%2d-%2d-', $now['mday'], $now['mon'])) . "%' $leap_year_birthdays)
-			AND u.user_type IN (" . USER_NORMAL . ', ' . USER_FOUNDER . ')';
+			AND u.user_type IN (" . USER_NORMAL . ', ' . USER_FOUNDER . ')',
+	);
+
+	/**
+	* Event to modify the SQL query to get birthdays data
+	*
+	* @event core.index_modify_birthdays_sql
+	* @var	array	now			The assoc array with the 'now' local timestamp data
+	* @var	array	sql_ary		The SQL array to get the birthdays data
+	* @var	object	time		The user related Datetime object
+	* @since 3.1.7-RC1
+	*/
+	$vars = array('now', 'sql_ary', 'time');
+	extract($phpbb_dispatcher->trigger_event('core.index_modify_birthdays_sql', compact($vars)));
+
+	$sql = $db->sql_build_query('SELECT', $sql_ary);
 	$result = $db->sql_query($sql);
+	$rows = $db->sql_fetchrowset($result);
+	$db->sql_freeresult($result);
 
-	while ($row = $db->sql_fetchrow($result))
+	foreach ($rows as $row)
 	{
 		$birthday_username	= get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']);
 		$birthday_year		= (int) substr($row['user_birthday'], -4);
 		$birthday_age		= ($birthday_year) ? max(0, $now['year'] - $birthday_year) : '';
 
-		$template->assign_block_vars('birthdays', array(
+		$birthdays[] = array(
 			'USERNAME'	=> $birthday_username,
 			'AGE'		=> $birthday_age,
-		));
+		);
 
 		// For 3.0 compatibility
-		if ($age = (int) substr($row['user_birthday'], -4))
-		{
-			$birthday_list[] = $birthday_username . (($birthday_year) ? ' (' . $birthday_age . ')' : '');
-		}
+		$birthday_list[] = $birthday_username . (($birthday_age) ? " ({$birthday_age})" : '');
 	}
-	$db->sql_freeresult($result);
+
+	/**
+	* Event to modify the birthdays list
+	*
+	* @event core.index_modify_birthdays_list
+	* @var	array	birthdays		Array with the users birhtdays data
+	* @var	array	rows			Array with the birhtdays SQL query result
+	* @since 3.1.7-RC1
+	*/
+	$vars = array('birthdays', 'rows');
+	extract($phpbb_dispatcher->trigger_event('core.index_modify_birthdays_list', compact($vars)));
+
+	$template->assign_block_vars_array('birthdays', $birthdays);
 }
 
 // Assign index specific vars
--- a/language/en/acp/permissions_phpbb.php
+++ b/language/en/acp/permissions_phpbb.php
@@ -155,9 +155,10 @@ $lang = array_merge($lang, array(
 	'ACL_M_SPLIT'	=> 'Can split topics',
 	'ACL_M_MERGE'	=> 'Can merge topics',
 
-	'ACL_M_INFO'	=> 'Can view post details',
-	'ACL_M_WARN'	=> 'Can issue warnings<br /><em>This setting is only assigned globally. It is not forum based.</em>', // This moderator setting is only global (and not local)
-	'ACL_M_BAN'		=> 'Can manage bans<br /><em>This setting is only assigned globally. It is not forum based.</em>', // This moderator setting is only global (and not local)
+	'ACL_M_INFO'		=> 'Can view post details',
+	'ACL_M_WARN'		=> 'Can issue warnings<br /><em>This setting is only assigned globally. It is not forum based.</em>', // This moderator setting is only global (and not local)
+	'ACL_M_PM_REPORT'	=> 'Can close and delete reports of private messages<br /><em>This setting is only assigned globally. It is not forum based.</em>', // This moderator setting is only global (and not local)
+	'ACL_M_BAN'			=> 'Can manage bans<br /><em>This setting is only assigned globally. It is not forum based.</em>', // This moderator setting is only global (and not local)
 ));
 
 // Admin Permissions
--- a/language/en/cli.php
+++ b/language/en/cli.php
@@ -54,9 +54,9 @@ $lang = array_merge($lang, array(
 	'CLI_DESCRIPTION_DELETE_CONFIG'				=> 'Deletes a configuration option',
 	'CLI_DESCRIPTION_DISABLE_EXTENSION'			=> 'Disables the specified extension.',
 	'CLI_DESCRIPTION_ENABLE_EXTENSION'			=> 'Enables the specified extension.',
-	'CLI_DESCRIPTION_FIND_MIGRATIONS'			=> 'Finds migrations that are not depended on.',
+	'CLI_DESCRIPTION_FIND_MIGRATIONS'			=> 'Finds migrations that are not depended upon.',
 	'CLI_DESCRIPTION_GET_CONFIG'				=> 'Gets a configuration option’s value',
-	'CLI_DESCRIPTION_INCREMENT_CONFIG'			=> 'Increments a configuration option’s value',
+	'CLI_DESCRIPTION_INCREMENT_CONFIG'			=> 'Increments a configuration option’s integer value',
 	'CLI_DESCRIPTION_LIST_EXTENSIONS'			=> 'Lists all extensions in the database and on the filesystem.',
 	'CLI_DESCRIPTION_OPTION_SAFE_MODE'			=> 'Run in Safe Mode (without extensions).',
 	'CLI_DESCRIPTION_OPTION_SHELL'				=> 'Launch the shell.',
@@ -79,3 +79,8 @@ $lang = array_merge($lang, array(
 
 	'CLI_FIXUP_RECALCULATE_EMAIL_HASH_SUCCESS'	=> 'Successfully recalculated all email hashes.',
 ));
+
+// Additional help for commands.
+$lang = array_merge($lang, array(
+	'CLI_HELP_CRON_RUN'			=> $lang['CLI_DESCRIPTION_CRON_RUN'] . ' Optionally you can specify a cron task name to run only the specified cron task.',
+));
--- a/language/en/common.php
+++ b/language/en/common.php
@@ -329,6 +329,7 @@ $lang = array_merge($lang, array(
 	'IMAGE_FILETYPE_INVALID'	=> 'Image file type %d for mimetype %s not supported.',
 	'IMAGE_FILETYPE_MISMATCH'	=> 'Image file type mismatch: expected extension %1$s but extension %2$s given.',
 	'IN'						=> 'in',
+	'INACTIVE'					=> 'Inactive',
 	'INDEX'						=> 'Index page',
 	'INFORMATION'				=> 'Information',
 	'INSECURE_REDIRECT'			=> 'Tried to redirect to potentially insecure url.',
@@ -467,7 +468,7 @@ $lang = array_merge($lang, array(
 	'NOTIFICATION_TOPIC_DISAPPROVED'	=> '<strong>Topic disapproved</strong>:',
 	'NOTIFICATION_TOPIC_IN_QUEUE'		=> '<strong>Topic approval</strong> request by %1$s:',
 	'NOTIFICATION_TYPE_NOT_EXIST'		=> 'The notification type "%s" is missing from the file system.',
-	'NOTIFICATION_ADMIN_ACTIVATE_USER'	=> '<strong>Activation required</strong> for newly registered user: “%1$s”',
+	'NOTIFICATION_ADMIN_ACTIVATE_USER'	=> '<strong>Activation required</strong> for deactivated or newly registered user: “%1$s”',
 	// Used in conjuction with NOTIFICATION_BOOKMARK and NOTIFICATION_POST.
 	'NOTIFICATION_MANY_OTHERS'			=> 'others',
 	'NOTIFICATION_X_OTHERS'				=> array(
--- a/language/en/help_bbcode.php
+++ b/language/en/help_bbcode.php
@@ -90,7 +90,7 @@ $help = array(
 	),
 	array(
 		0 => 'Linking to another site',
-		1 => 'phpBB BBCode supports a number of ways of creating URIs (Uniform Resource Indicators) better known as URLs.<ul><li>The first of these uses the <strong>[url=][/url]</strong> tag, whatever you type after the = sign will cause the contents of that tag to act as a URL. For example to link to phpBB.com you could use:<br /><br /><strong>[url=https://www.phpbb.com/]</strong>Visit phpBB!<strong>[/url]</strong><br /><br />This would generate the following link, <a href="https://www.phpbb.com/">Visit phpBB!</a> Please notice that the link opens in the same window or a new window depending on the users browser preferences.</li><li>If you want the URL itself displayed as the link you can do this by simply using:<br /><br /><strong>[url]</strong>https://www.phpbb.com/<strong>[/url]</strong><br /><br />This would generate the following link, <a href="https://www.phpbb.com/">https://www.phpbb.com/</a></li><li>Additionally, phpBB features something called <i>Magic Links</i>, this will turn any syntactically correct URL into a link without you needing to specify any tags or even the leading https://. For example typing www.phpbb.com into your message will automatically lead to <a href="https://www.phpbb.com/">www.phpbb.com</a> being output when you view the message.</li><li>The same thing applies equally to email addresses, you can either specify an address explicitly for example:<br /><br /><strong>[email]</strong>no.one@domain.adr<strong>[/email]</strong><br /><br />which will output <a href="mailto:no.one@domain.adr">no.one@domain.adr</a> or you can just type no.one@domain.adr into your message and it will be automatically converted when you view.</li></ul>As with all the BBCode tags you can wrap URLs around any of the other tags such as <strong>[img][/img]</strong> (see next entry), <strong>[b][/b]</strong>, etc. As with the formatting tags it is up to you to ensure the correct open and close order is following, for example:<br /><br /><strong>[url=https://www.phpbb.com/][img]</strong>https://www.phpbb.com/theme/images/logos/blue/160x52.png<strong>[/url][/img]</strong><br /><br />is <span style="text-decoration: underline">not</span> correct which may lead to your post being deleted so take care.'
+		1 => 'phpBB BBCode supports a number of ways of creating URIs (Uniform Resource Indicators) better known as URLs.<ul><li>The first of these uses the <strong>[url=][/url]</strong> tag, whatever you type after the = sign will cause the contents of that tag to act as a URL. For example to link to phpBB.com you could use:<br /><br /><strong>[url=https://www.phpbb.com/]</strong>Visit phpBB!<strong>[/url]</strong><br /><br />This would generate the following link, <a href="https://www.phpbb.com/">Visit phpBB!</a> Please notice that the link opens in the same window or a new window depending on the users browser preferences.</li><li>If you want the URL itself displayed as the link you can do this by simply using:<br /><br /><strong>[url]</strong>https://www.phpbb.com/<strong>[/url]</strong><br /><br />This would generate the following link, <a href="https://www.phpbb.com/">https://www.phpbb.com/</a></li><li>Additionally, phpBB features something called <i>Magic Links</i>, this will turn any syntactically correct URL into a link without you needing to specify any tags or even the leading http://. For example typing www.phpbb.com into your message will automatically lead to <a href="http://www.phpbb.com/">www.phpbb.com</a> being output when you view the message.</li><li>The same thing applies equally to email addresses, you can either specify an address explicitly for example:<br /><br /><strong>[email]</strong>no.one@domain.adr<strong>[/email]</strong><br /><br />which will output <a href="mailto:no.one@domain.adr">no.one@domain.adr</a> or you can just type no.one@domain.adr into your message and it will be automatically converted when you view.</li></ul>As with all the BBCode tags you can wrap URLs around any of the other tags such as <strong>[img][/img]</strong> (see next entry), <strong>[b][/b]</strong>, etc. As with the formatting tags it is up to you to ensure the correct open and close order is following, for example:<br /><br /><strong>[url=https://www.phpbb.com/][img]</strong>https://www.phpbb.com/theme/images/logos/blue/160x52.png<strong>[/url][/img]</strong><br /><br />is <span style="text-decoration: underline">not</span> correct which may lead to your post being deleted so take care.'
 	),
 	array(
 		0 => '--',
--- a/language/en/memberlist.php
+++ b/language/en/memberlist.php
@@ -101,6 +101,7 @@ $lang = array_merge($lang, array(
 	'LOGIN_EXPLAIN_SEARCHUSER'	=> 'The board requires you to be registered and logged in to search users.',
 	'LOGIN_EXPLAIN_VIEWPROFILE'	=> 'The board requires you to be registered and logged in to view profiles.',
 
+	'MANAGE_GROUP'			=> 'Manage Group',
 	'MORE_THAN'				=> 'More than',
 
 	'NO_CONTACT_FORM'		=> 'The board administrator contact form has been disabled.',
--- a/language/en/ucp.php
+++ b/language/en/ucp.php
@@ -339,7 +339,7 @@ $lang = array_merge($lang, array(
 	'NOTIFICATION_TYPE_QUOTE'							=> 'Someone quotes you in a post',
 	'NOTIFICATION_TYPE_REPORT'							=> 'Someone reports a post',
 	'NOTIFICATION_TYPE_TOPIC'							=> 'Someone creates a topic in a forum to which you are subscribed',
-	'NOTIFICATION_TYPE_ADMIN_ACTIVATE_USER'				=> 'Newly registered user requiring activation',
+	'NOTIFICATION_TYPE_ADMIN_ACTIVATE_USER'				=> 'User requiring activation',
 
 	'NOTIFY_METHOD'					=> 'Notification method',
 	'NOTIFY_METHOD_BOTH'			=> 'Both',
--- a/memberlist.php
+++ b/memberlist.php
@@ -151,7 +151,7 @@ switch ($mode)
 		$db->sql_freeresult($result);
 
 		$sql_ary = array(
-			'SELECT'	=> 'u.user_id, u.group_id as default_group, u.username, u.username_clean, u.user_colour, u.user_rank, u.user_posts, u.user_allow_pm, g.group_id',
+			'SELECT'	=> 'u.user_id, u.group_id as default_group, u.username, u.username_clean, u.user_colour, u.user_type, u.user_rank, u.user_posts, u.user_allow_pm, g.group_id',
 
 			'FROM'		=> array(
 				USER_GROUP_TABLE => 'ug',
@@ -314,6 +314,8 @@ switch ($mode)
 							'RANK_IMG'		=> $user_rank_data['img'],
 							'RANK_IMG_SRC'	=> $user_rank_data['img_src'],
 
+							'S_INACTIVE'	=> $row['user_type'] == USER_INACTIVE,
+
 							'U_PM'			=> ($config['allow_privmsg'] && $auth->acl_get('u_sendpm') && ($row['user_allow_pm'] || $auth->acl_gets('a_', 'm_') || $auth->acl_getf_global('m_'))) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;mode=compose&amp;u=' . $row['user_id']) : '',
 
 							'USERNAME_FULL'		=> get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']),
@@ -1025,6 +1027,23 @@ switch ($mode)
 						FROM ' . POSTS_TABLE . '
 						WHERE poster_ip ' . ((strpos($ips, '%') !== false) ? 'LIKE' : 'IN') . " ($ips)
 							AND " . $db->sql_in_set('forum_id', $ip_forums);
+
+					/**
+					* Modify sql query for members search by ip address / hostname
+					*
+					* @event core.memberlist_modify_ip_search_sql_query
+					* @var	string	ipdomain	The host name
+					* @var	string	ips			IP address list for the given host name
+					* @var	string	sql			The SQL query for searching members by IP address
+					* @since 3.1.7-RC1
+					*/
+					$vars = array(
+						'ipdomain',
+						'ips',
+						'sql',
+					);
+					extract($phpbb_dispatcher->trigger_event('core.memberlist_modify_ip_search_sql_query', compact($vars)));
+
 					$result = $db->sql_query($sql);
 
 					if ($row = $db->sql_fetchrow($result))
@@ -1069,7 +1088,7 @@ switch ($mode)
 		if ($mode == 'group')
 		{
 			// We JOIN here to save a query for determining membership for hidden groups. ;)
-			$sql = 'SELECT g.*, ug.user_id
+			$sql = 'SELECT g.*, ug.user_id, ug.group_leader
 				FROM ' . GROUPS_TABLE . ' g
 				LEFT JOIN ' . USER_GROUP_TABLE . ' ug ON (ug.user_pending = 0 AND ug.user_id = ' . $user->data['user_id'] . " AND ug.group_id = $group_id)
 				WHERE g.group_id = $group_id";
@@ -1128,6 +1147,24 @@ switch ($mode)
 					$user_rank_data['img'] .= '<br />';
 				}
 			}
+			// include modules for manage groups link display or not
+			// need to ensure the module is active
+			$can_manage_group = false;
+			if ($user->data['is_registered'] && $group_row['group_leader'])
+			{
+				if (!class_exists('p_master'))
+				{
+					include($phpbb_root_path . 'includes/functions_module.' . $phpEx);
+				}
+				$module = new p_master;
+				$module->list_modules('ucp');
+
+				if ($module->is_active('ucp_groups', 'manage'))
+				{
+					$can_manage_group = true;
+				}
+				unset($module);
+			}
 
 			$template->assign_vars(array(
 				'GROUP_DESC'	=> generate_text_for_display($group_row['group_desc'], $group_row['group_desc_uid'], $group_row['group_desc_bitfield'], $group_row['group_desc_options']),
@@ -1140,7 +1177,8 @@ switch ($mode)
 				'RANK_IMG'		=> $user_rank_data['img'],
 				'RANK_IMG_SRC'	=> $user_rank_data['img_src'],
 
-				'U_PM'			=> ($auth->acl_get('u_sendpm') && $auth->acl_get('u_masspm_group') && $group_row['group_receive_pm'] && $config['allow_privmsg'] && $config['allow_mass_pm']) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;mode=compose&amp;g=' . $group_id) : '',)
+				'U_PM'			=> ($auth->acl_get('u_sendpm') && $auth->acl_get('u_masspm_group') && $group_row['group_receive_pm'] && $config['allow_privmsg'] && $config['allow_mass_pm']) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;mode=compose&amp;g=' . $group_id) : '',
+				'U_MANAGE'		=> ($can_manage_group) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=ucp_groups&amp;mode=manage') : false,)
 			);
 
 			$sql_select = ', ug.group_leader';
@@ -1165,6 +1203,32 @@ switch ($mode)
 			$order_by .= ', u.user_posts DESC';
 		}
 
+		/**
+		* Modify sql query data for members search
+		*
+		* @event core.memberlist_modify_sql_query_data
+		* @var	string	order_by		SQL ORDER BY clause condition
+		* @var	string	sort_dir		The sorting direction
+		* @var	string	sort_key		The sorting key
+		* @var	array	sort_key_sql	Arraty with the sorting conditions data
+		* @var	string	sql_from		SQL FROM clause condition
+		* @var	string	sql_select		SQL SELECT fields list
+		* @var	string	sql_where		SQL WHERE clause condition
+		* @var	string	sql_where_data	SQL WHERE clause additional conditions data
+		* @since 3.1.7-RC1
+		*/
+		$vars = array(
+			'order_by',
+			'sort_dir',
+			'sort_key',
+			'sort_key_sql',
+			'sql_from',
+			'sql_select',
+			'sql_where',
+			'sql_where_data',
+		);
+		extract($phpbb_dispatcher->trigger_event('core.memberlist_modify_sql_query_data', compact($vars)));
+
 		// Count the users ...
 		if ($sql_where)
 		{
@@ -1345,13 +1409,19 @@ switch ($mode)
 			);
 		}
 
+		$user_types = array(USER_NORMAL, USER_FOUNDER);
+		if ($auth->acl_get('a_user'))
+		{
+			$user_types[] = USER_INACTIVE;
+		}
+
 		$start = $pagination->validate_start($start, $config['topics_per_page'], $config['num_users']);
 
 		// Get us some users :D
 		$sql = "SELECT u.user_id
 			FROM " . USERS_TABLE . " u
 				$sql_from
-			WHERE u.user_type IN (" . USER_NORMAL . ', ' . USER_FOUNDER . ")
+			WHERE " . $db->sql_in_set('u.user_type', $user_types) . "
 				$sql_where
 			ORDER BY $order_by";
 		$result = $db->sql_query_limit($sql, $config['topics_per_page'], $start);
@@ -1448,6 +1518,20 @@ switch ($mode)
 				usort($user_list,  'phpbb_sort_last_active');
 			}
 
+			// do we need to display contact fields as such
+			$use_contact_fields = false;
+
+			/**
+			 * Modify list of users before member row is created
+			 *
+			 * @event core.memberlist_memberrow_before
+			 * @var array	user_list			Array containing list of users
+			 * @var bool	use_contact_fields	Should we display contact fields as such?
+			 * @since 3.1.7-RC1
+			 */
+			$vars = array('user_list', 'use_contact_fields');
+			extract($phpbb_dispatcher->trigger_event('core.memberlist_memberrow_before', compact($vars)));
+
 			for ($i = 0, $end = sizeof($user_list); $i < $end; ++$i)
 			{
 				$user_id = $user_list[$i];
@@ -1458,7 +1542,7 @@ switch ($mode)
 				$cp_row = array();
 				if ($config['load_cpf_memberlist'])
 				{
-					$cp_row = (isset($profile_fields_cache[$user_id])) ? $cp->generate_profile_fields_template_data($profile_fields_cache[$user_id], false) : array();
+					$cp_row = (isset($profile_fields_cache[$user_id])) ? $cp->generate_profile_fields_template_data($profile_fields_cache[$user_id], $use_contact_fields) : array();
 				}
 
 				$memberrow = array_merge(phpbb_show_profile($row, false, false, false), array(
@@ -1466,6 +1550,7 @@ switch ($mode)
 
 					'S_CUSTOM_PROFILE'	=> (isset($cp_row['row']) && sizeof($cp_row['row'])) ? true : false,
 					'S_GROUP_LEADER'	=> $is_leader,
+					'S_INACTIVE'		=> $row['user_type'] == USER_INACTIVE,
 
 					'U_VIEW_PROFILE'	=> get_username_string('profile', $user_id, $row['username']),
 				));
@@ -1505,12 +1590,12 @@ switch ($mode)
 			'U_HIDE_FIND_MEMBER'	=> ($mode == 'searchuser' || ($mode == '' && $submit)) ? $u_hide_find_member : '',
 			'U_LIVE_SEARCH'			=> ($config['allow_live_searches']) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=livesearch') : false,
 			'U_SORT_USERNAME'		=> $sort_url . '&amp;sk=a&amp;sd=' . (($sort_key == 'a' && $sort_dir == 'a') ? 'd' : 'a'),
-			'U_SORT_JOINED'			=> $sort_url . '&amp;sk=c&amp;sd=' . (($sort_key == 'c' && $sort_dir == 'a') ? 'd' : 'a'),
-			'U_SORT_POSTS'			=> $sort_url . '&amp;sk=d&amp;sd=' . (($sort_key == 'd' && $sort_dir == 'a') ? 'd' : 'a'),
-			'U_SORT_EMAIL'			=> $sort_url . '&amp;sk=e&amp;sd=' . (($sort_key == 'e' && $sort_dir == 'a') ? 'd' : 'a'),
-			'U_SORT_ACTIVE'			=> ($auth->acl_get('u_viewonline')) ? $sort_url . '&amp;sk=l&amp;sd=' . (($sort_key == 'l' && $sort_dir == 'a') ? 'd' : 'a') : '',
-			'U_SORT_RANK'			=> $sort_url . '&amp;sk=m&amp;sd=' . (($sort_key == 'm' && $sort_dir == 'a') ? 'd' : 'a'),
-			'U_LIST_CHAR'			=> $sort_url . '&amp;sk=a&amp;sd=' . (($sort_key == 'l' && $sort_dir == 'a') ? 'd' : 'a'),
+			'U_SORT_JOINED'			=> $sort_url . '&amp;sk=c&amp;sd=' . (($sort_key == 'c' && $sort_dir == 'd') ? 'a' : 'd'),
+			'U_SORT_POSTS'			=> $sort_url . '&amp;sk=d&amp;sd=' . (($sort_key == 'd' && $sort_dir == 'd') ? 'a' : 'd'),
+			'U_SORT_EMAIL'			=> $sort_url . '&amp;sk=e&amp;sd=' . (($sort_key == 'e' && $sort_dir == 'd') ? 'a' : 'd'),
+			'U_SORT_ACTIVE'			=> ($auth->acl_get('u_viewonline')) ? $sort_url . '&amp;sk=l&amp;sd=' . (($sort_key == 'l' && $sort_dir == 'd') ? 'a' : 'd') : '',
+			'U_SORT_RANK'			=> $sort_url . '&amp;sk=m&amp;sd=' . (($sort_key == 'm' && $sort_dir == 'd') ? 'a' : 'd'),
+			'U_LIST_CHAR'			=> $sort_url . '&amp;sk=a&amp;sd=' . (($sort_key == 'l' && $sort_dir == 'd') ? 'a' : 'd'),
 
 			'S_SHOW_GROUP'		=> ($mode == 'group') ? true : false,
 			'S_VIEWONLINE'		=> $auth->acl_get('u_viewonline'),
--- a/phpbb/auth/auth.php
+++ b/phpbb/auth/auth.php
@@ -928,6 +928,7 @@ class auth
 	function login($username, $password, $autologin = false, $viewonline = 1, $admin = 0)
 	{
 		global $db, $user, $phpbb_root_path, $phpEx, $phpbb_container;
+		global $phpbb_dispatcher;
 
 		$provider_collection = $phpbb_container->get('auth.provider_collection');
 
@@ -982,6 +983,24 @@ class auth
 				redirect($url);
 			}
 
+			/**
+			 * Event is triggered after checking for valid username and password, and before the actual session creation.
+			 *
+			 * @event core.auth_login_session_create_before
+			 * @var	array	login				Variable containing login array
+			 * @var	bool	admin				Boolean variable whether user is logging into the ACP
+			 * @var	string	username			Username of user to log in
+			 * @var	bool	autologin			Boolean variable signaling whether login is triggered via auto login
+			 * @since 3.1.7-RC1
+			 */
+			$vars = array(
+				'login',
+				'admin',
+				'username',
+				'autologin',
+			);
+			extract($phpbb_dispatcher->trigger_event('core.auth_login_session_create_before', compact($vars)));
+
 			// If login succeeded, we will log the user in... else we pass the login array through...
 			if ($login['status'] == LOGIN_SUCCESS)
 			{
--- a/phpbb/avatar/driver/gravatar.php
+++ b/phpbb/avatar/driver/gravatar.php
@@ -172,6 +172,8 @@ class gravatar extends \phpbb\avatar\driver\driver
 	*/
 	protected function get_gravatar_url($row)
 	{
+		global $phpbb_dispatcher;
+
 		$url = self::GRAVATAR_URL;
 		$url .=  md5(strtolower(trim($row['avatar'])));
 
@@ -180,6 +182,17 @@ class gravatar extends \phpbb\avatar\driver\driver
 			$url .= '?s=' . max($row['avatar_width'], $row['avatar_height']);
 		}
 
+		/**
+		* Modify gravatar url
+		*
+		* @event core.get_gravatar_url_after
+		* @var	string	row	User data or group data
+		* @var	string	url	Gravatar URL
+		* @since 3.1.7-RC1
+		*/
+		$vars = array('row', 'url');
+		extract($phpbb_dispatcher->trigger_event('core.get_gravatar_url_after', compact($vars)));
+
 		return $url;
 	}
 }
--- a/phpbb/avatar/driver/local.php
+++ b/phpbb/avatar/driver/local.php
@@ -84,11 +84,13 @@ class local extends \phpbb\avatar\driver\driver
 					'AVATAR_IMAGE'  => $this->phpbb_root_path . $this->config['avatar_gallery_path'] . '/' . $img['file'],
 					'AVATAR_NAME' 	=> $img['name'],
 					'AVATAR_FILE' 	=> $img['filename'],
+					'CHECKED'			=> $img['file'] === $row['avatar'],
 				));
 
 				$template->assign_block_vars('avatar_local_row.avatar_local_option', array(
 					'AVATAR_FILE' 		=> $img['filename'],
-					'S_OPTIONS_AVATAR'	=> $img['filename']
+					'S_OPTIONS_AVATAR'	=> $img['filename'],
+					'CHECKED'			=> $img['file'] === $row['avatar'],
 				));
 
 				$col_count = ($col_count + 1) % $table_cols;
@@ -182,7 +184,7 @@ class local extends \phpbb\avatar\driver\driver
 					}
 					$cat = ($path == $file_path) ? $user->lang['NO_AVATAR_CATEGORY'] : str_replace("$path/", '', $file_path);
 					$avatar_list[$cat][$image] = array(
-						'file'      => ($cat != $user->lang['NO_AVATAR_CATEGORY']) ? rawurlencode($cat) . '/' . rawurlencode($image) : rawurlencode($image),
+						'file'      => ($cat != $user->lang['NO_AVATAR_CATEGORY']) ? str_replace('%2F', '/', rawurlencode($cat)) . '/' . rawurlencode($image) : rawurlencode($image),
 						'filename'  => rawurlencode($image),
 						'name'      => ucfirst(str_replace('_', ' ', preg_replace('#^(.*)\..*$#', '\1', $image))),
 						'width'     => $dims[0],
--- a/phpbb/avatar/driver/upload.php
+++ b/phpbb/avatar/driver/upload.php
@@ -53,7 +53,7 @@ class upload extends \phpbb\avatar\driver\driver
 	/**
 	* {@inheritdoc}
 	*/
-	public function get_data($row, $ignore_config = false)
+	public function get_data($row)
 	{
 		$root_path = (defined('PHPBB_USE_BOARD_URL_PATH') && PHPBB_USE_BOARD_URL_PATH) ? generate_board_url() . '/' : $this->path_helper->get_web_root_path();
 
--- a/phpbb/console/command/cron/run.php
+++ b/phpbb/console/command/cron/run.php
@@ -50,6 +50,7 @@ class run extends \phpbb\console\command\command
 		$this
 			->setName('cron:run')
 			->setDescription($this->user->lang('CLI_DESCRIPTION_CRON_RUN'))
+			->setHelp($this->user->lang('CLI_HELP_CRON_RUN'))
 			->addArgument('name', InputArgument::OPTIONAL, $this->user->lang('CLI_DESCRIPTION_CRON_RUN_ARGUMENT_1'))
 		;
 	}
--- a/phpbb/controller/helper.php
+++ b/phpbb/controller/helper.php
@@ -100,12 +100,14 @@ class helper
 	* @param string $page_title The title of the page to output
 	* @param int $status_code The status code to be sent to the page header
 	* @param bool $display_online_list Do we display online users list
+	* @param int $item_id Restrict online users to item id
+	* @param string $item Restrict online users to a certain session item, e.g. forum for session_forum_id
 	*
 	* @return Response object containing rendered page
 	*/
-	public function render($template_file, $page_title = '', $status_code = 200, $display_online_list = false)
+	public function render($template_file, $page_title = '', $status_code = 200, $display_online_list = false, $item_id = 0, $item = 'forum')
 	{
-		page_header($page_title, $display_online_list);
+		page_header($page_title, $display_online_list, $item_id, $item);
 
 		$this->template->set_filenames(array(
 			'body'	=> $template_file,
--- a/phpbb/db/driver/sqlite3.php
+++ b/phpbb/db/driver/sqlite3.php
@@ -48,6 +48,7 @@ class sqlite3 extends \phpbb\db\driver\driver
 		try
 		{
 			$this->dbo = new \SQLite3($this->server, SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE);
+			$this->dbo->busyTimeout(60000);
 			$this->db_connect_id = true;
 		}
 		catch (\Exception $e)
--- /dev/null
+++ b/phpbb/db/migration/data/v31x/m_pm_report.php
@@ -0,0 +1,64 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v31x;
+
+class m_pm_report extends \phpbb\db\migration\migration
+{
+	static public function depends_on()
+	{
+		return array('\phpbb\db\migration\data\v31x\v316rc1');
+	}
+
+	public function update_data()
+	{
+		return array(
+			array('permission.add', array('m_pm_report', true, 'm_report')),
+			array('custom', array(
+					array($this, 'update_module_auth'),
+				),
+			),
+		);
+	}
+
+	public function revert_data()
+	{
+		return array(
+			array('permission.remove', array('m_pm_report')),
+			array('custom', array(
+					array($this, 'revert_module_auth'),
+				),
+			),
+		);
+	}
+
+	public function update_module_auth()
+	{
+		$sql = 'UPDATE ' . MODULES_TABLE . "
+			SET module_auth = 'acl_m_pm_report'
+			WHERE module_class = 'mcp'
+				AND module_basename = 'mcp_pm_reports'
+				AND module_auth = 'aclf_m_report'";
+		$this->db->sql_query($sql);
+	}
+
+	public function revert_module_auth()
+	{
+		$sql = 'UPDATE ' . MODULES_TABLE . "
+			SET module_auth = 'aclf_m_report'
+			WHERE module_class = 'mcp'
+				AND module_basename = 'mcp_pm_reports'
+				AND module_auth = 'acl_m_pm_report'";
+		$this->db->sql_query($sql);
+	}
+}
--- /dev/null
+++ b/phpbb/db/migration/data/v31x/v317.php
@@ -0,0 +1,31 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v31x;
+
+class v317 extends \phpbb\db\migration\migration
+{
+	static public function depends_on()
+	{
+		return array(
+			'\phpbb\db\migration\data\v31x\v317rc1',
+		);
+	}
+
+	public function update_data()
+	{
+		return array(
+			array('config.update', array('version', '3.1.7')),
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/db/migration/data/v31x/v317pl1.php
@@ -0,0 +1,31 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v31x;
+
+class v317pl1 extends \phpbb\db\migration\migration
+{
+	static public function depends_on()
+	{
+		return array(
+			'\phpbb\db\migration\data\v31x\v317',
+		);
+	}
+
+	public function update_data()
+	{
+		return array(
+			array('config.update', array('version', '3.1.7-pl1')),
+		);
+	}
+}
--- /dev/null
+++ b/phpbb/db/migration/data/v31x/v317rc1.php
@@ -0,0 +1,32 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v31x;
+
+class v317rc1 extends \phpbb\db\migration\migration
+{
+	static public function depends_on()
+	{
+		return array(
+			'\phpbb\db\migration\data\v31x\m_pm_report',
+			'\phpbb\db\migration\data\v31x\v316',
+		);
+	}
+
+	public function update_data()
+	{
+		return array(
+			array('config.update', array('version', '3.1.7-RC1')),
+		);
+	}
+}
--- a/phpbb/feed/helper.php
+++ b/phpbb/feed/helper.php
@@ -149,12 +149,10 @@ class helper
 		{
 			$update_count = array();
 			parse_attachments($forum_id, $content, $post_attachments, $update_count);
-			$post_attachments = implode('<br />', $post_attachments);
+			$content .= implode('<br />', $post_attachments);
 
 			// Convert attachments' relative path to absolute path
-			$post_attachments = str_replace($this->phpbb_root_path . 'download/file.' . $this->phpEx, $this->get_board_url() . '/download/file.' . $this->phpEx, $post_attachments);
-
-			$content .= $post_attachments;
+			$content = str_replace($this->phpbb_root_path . 'download/file.' . $this->phpEx, $this->get_board_url() . '/download/file.' . $this->phpEx, $content);
 		}
 
 		// Remove Comments from inline attachments [ia]
--- a/phpbb/notification/type/approve_post.php
+++ b/phpbb/notification/type/approve_post.php
@@ -82,7 +82,7 @@ class approve_post extends \phpbb\notification\type\post
 		$users[$post['poster_id']] = array('');
 
 		return $this->get_authorised_recipients(array_keys($users), $post['forum_id'], array_merge($options, array(
-			'item_type'		=> self::$notification_option['id'],
+			'item_type'		=> static::$notification_option['id'],
 		)));
 	}
 
--- a/phpbb/notification/type/approve_topic.php
+++ b/phpbb/notification/type/approve_topic.php
@@ -82,7 +82,7 @@ class approve_topic extends \phpbb\notification\type\topic
 		$users[$post['poster_id']] = array('');
 
 		return $this->get_authorised_recipients(array_keys($users), $post['forum_id'], array_merge($options, array(
-			'item_type'		=> self::$notification_option['id'],
+			'item_type'		=> static::$notification_option['id'],
 		)));
 	}
 
--- a/phpbb/notification/type/bookmark.php
+++ b/phpbb/notification/type/bookmark.php
@@ -95,7 +95,7 @@ class bookmark extends \phpbb\notification\type\post
 		$sql = 'SELECT n.*
 			FROM ' . $this->notifications_table . ' n, ' . $this->notification_types_table . ' nt
 			WHERE n.notification_type_id = ' . (int) $this->notification_type_id . '
-				AND n.item_parent_id = ' . (int) self::get_item_parent_id($post) . '
+				AND n.item_parent_id = ' . (int) static::get_item_parent_id($post) . '
 				AND n.notification_read = 0
 				AND nt.notification_type_id = n.notification_type_id
 				AND nt.notification_type_enabled = 1';
--- a/phpbb/notification/type/post.php
+++ b/phpbb/notification/type/post.php
@@ -135,7 +135,7 @@ class post extends \phpbb\notification\type\base
 		$sql = 'SELECT n.*
 			FROM ' . $this->notifications_table . ' n, ' . $this->notification_types_table . ' nt
 			WHERE n.notification_type_id = ' . (int) $this->notification_type_id . '
-				AND n.item_parent_id = ' . (int) self::get_item_parent_id($post) . '
+				AND n.item_parent_id = ' . (int) static::get_item_parent_id($post) . '
 				AND n.notification_read = 0
 				AND nt.notification_type_id = n.notification_type_id
 				AND nt.notification_type_enabled = 1';
--- a/phpbb/notification/type/post_in_queue.php
+++ b/phpbb/notification/type/post_in_queue.php
@@ -108,7 +108,7 @@ class post_in_queue extends \phpbb\notification\type\post
 		}
 
 		return $this->check_user_notification_options($auth_read[$post['forum_id']]['f_read'], array_merge($options, array(
-			'item_type'		=> self::$notification_option['id'],
+			'item_type'		=> static::$notification_option['id'],
 		)));
 	}
 
--- a/phpbb/notification/type/quote.php
+++ b/phpbb/notification/type/quote.php
@@ -78,7 +78,7 @@ class quote extends \phpbb\notification\type\post
 		), $options);
 
 		$usernames = false;
-		preg_match_all(self::$regular_expression_match, $post['post_text'], $usernames);
+		preg_match_all(static::$regular_expression_match, $post['post_text'], $usernames);
 
 		if (empty($usernames[1]))
 		{
@@ -116,7 +116,7 @@ class quote extends \phpbb\notification\type\post
 		$sql = 'SELECT n.user_id
 			FROM ' . $this->notifications_table . ' n, ' . $this->notification_types_table . ' nt
 			WHERE n.notification_type_id = ' . (int) $this->notification_type_id . '
-				AND n.item_id = ' . self::get_item_id($post) . '
+				AND n.item_id = ' . static::get_item_id($post) . '
 				AND nt.notification_type_id = n.notification_type_id
 				AND nt.notification_type_enabled = 1';
 		$result = $this->db->sql_query($sql);
@@ -147,7 +147,7 @@ class quote extends \phpbb\notification\type\post
 		{
 			$sql = 'DELETE FROM ' . $this->notifications_table . '
 				WHERE notification_type_id = ' . (int) $this->notification_type_id . '
-					AND item_id = ' . self::get_item_id($post) . '
+					AND item_id = ' . static::get_item_id($post) . '
 					AND ' . $this->db->sql_in_set('user_id', $remove_notifications);
 			$this->db->sql_query($sql);
 		}
--- a/phpbb/notification/type/report_pm.php
+++ b/phpbb/notification/type/report_pm.php
@@ -120,7 +120,7 @@ class report_pm extends \phpbb\notification\type\pm
 		}
 
 		return $this->check_user_notification_options($auth_approve[$post['forum_id']][$this->permission], array_merge($options, array(
-			'item_type'		=> self::$notification_option['id'],
+			'item_type'		=> static::$notification_option['id'],
 		)));
 	}
 
--- a/phpbb/notification/type/topic_in_queue.php
+++ b/phpbb/notification/type/topic_in_queue.php
@@ -108,7 +108,7 @@ class topic_in_queue extends \phpbb\notification\type\topic
 		}
 
 		return $this->check_user_notification_options($auth_read[$topic['forum_id']]['f_read'], array_merge($options, array(
-			'item_type'		=> self::$notification_option['id'],
+			'item_type'		=> static::$notification_option['id'],
 		)));
 	}
 
--- a/phpbb/passwords/driver/salted_md5.php
+++ b/phpbb/passwords/driver/salted_md5.php
@@ -75,7 +75,7 @@ class salted_md5 extends base
 				// happen if pre-determined settings are
 				// directly passed to the driver. The manager
 				// will not do this. Same as the old hashing
-				// implementatio in phpBB 3.0
+				// implementation in phpBB 3.0
 				return md5($password);
 			}
 		}
--- a/phpbb/permissions.php
+++ b/phpbb/permissions.php
@@ -160,6 +160,28 @@ class permissions
 	}
 
 	/**
+	* Checks if a category has been defined
+	*
+	* @param	string	$category	Identifier of the category
+	* @return	bool	True if the category is defined, false otherwise
+	*/
+	public function category_defined($category)
+	{
+		return isset($this->categories[$category]);
+	}
+
+	/**
+	* Checks if a permission has been defined
+	*
+	* @param	string	$permission	Identifier of the permission
+	* @return	bool	True if the permission is defined, false otherwise
+	*/
+	public function permission_defined($permission)
+	{
+		return isset($this->permissions[$permission]);
+	}
+
+	/**
 	* Returns the language string of a permission
 	*
 	* @param	string	$permission	Identifier of the permission
@@ -285,8 +307,9 @@ class permissions
 		'm_split'	=> array('lang' => 'ACL_M_SPLIT', 'cat' => 'topic_actions'),
 		'm_merge'	=> array('lang' => 'ACL_M_MERGE', 'cat' => 'topic_actions'),
 
-		'm_warn'	=> array('lang' => 'ACL_M_WARN', 'cat' => 'misc'),
-		'm_ban'		=> array('lang' => 'ACL_M_BAN', 'cat' => 'misc'),
+		'm_warn'		=> array('lang' => 'ACL_M_WARN', 'cat' => 'misc'),
+		'm_pm_report'	=> array('lang' => 'ACL_M_PM_REPORT', 'cat' => 'misc'),
+		'm_ban'			=> array('lang' => 'ACL_M_BAN', 'cat' => 'misc'),
 
 		// Admin Permissions
 		'a_board'		=> array('lang' => 'ACL_A_BOARD', 'cat' => 'settings'),
--- a/phpbb/plupload/plupload.php
+++ b/phpbb/plupload/plupload.php
@@ -125,7 +125,7 @@ class plupload
 			// Need to modify some of the $_FILES values to reflect the new file
 			return array(
 				'tmp_name' => $file_path,
-				'name' => $this->request->variable('real_filename', ''),
+				'name' => $this->request->variable('real_filename', '', true),
 				'size' => filesize($file_path),
 				'type' => $this->mimetype_guesser->guess($file_path, $file_name),
 			);
--- a/phpbb/search/fulltext_mysql.php
+++ b/phpbb/search/fulltext_mysql.php
@@ -379,7 +379,7 @@ class fulltext_mysql extends \phpbb\search\base
 		}
 
 		// generate a search_key from all the options to identify the results
-		$search_key = md5(implode('#', array(
+		$search_key_array = array(
 			implode(', ', $this->split_words),
 			$type,
 			$fields,
@@ -390,7 +390,39 @@ class fulltext_mysql extends \phpbb\search\base
 			implode(',', $ex_fid_ary),
 			$post_visibility,
 			implode(',', $author_ary)
-		)));
+		);
+
+		/**
+		* Allow changing the search_key for cached results
+		*
+		* @event core.search_mysql_by_keyword_modify_search_key
+		* @var	array	search_key_array	Array with search parameters to generate the search_key
+		* @var	string	type				Searching type ('posts', 'topics')
+		* @var	string	fields				Searching fields ('titleonly', 'msgonly', 'firstpost', 'all')
+		* @var	string	terms				Searching terms ('all', 'any')
+		* @var	int		sort_days			Time, in days, of the oldest possible post to list
+		* @var	string	sort_key			The sort type used from the possible sort types
+		* @var	int		topic_id			Limit the search to this topic_id only
+		* @var	array	ex_fid_ary			Which forums not to search on
+		* @var	string	post_visibility		Post visibility data
+		* @var	array	author_ary			Array of user_id containing the users to filter the results to
+		* @since 3.1.7-RC1
+		*/
+		$vars = array(
+			'search_key_array',
+			'type',
+			'fields',
+			'terms',
+			'sort_days',
+			'sort_key',
+			'topic_id',
+			'ex_fid_ary',
+			'post_visibility',
+			'author_ary',
+		);
+		extract($this->phpbb_dispatcher->trigger_event('core.search_mysql_by_keyword_modify_search_key', compact($vars)));
+
+		$search_key = md5(implode('#', $search_key_array));
 
 		if ($start < 0)
 		{
@@ -610,7 +642,7 @@ class fulltext_mysql extends \phpbb\search\base
 		}
 
 		// generate a search_key from all the options to identify the results
-		$search_key = md5(implode('#', array(
+		$search_key_array = array(
 			'',
 			$type,
 			($firstpost_only) ? 'firstpost' : '',
@@ -623,7 +655,39 @@ class fulltext_mysql extends \phpbb\search\base
 			$post_visibility,
 			implode(',', $author_ary),
 			$author_name,
-		)));
+		);
+
+		/**
+		* Allow changing the search_key for cached results
+		*
+		* @event core.search_mysql_by_author_modify_search_key
+		* @var	array	search_key_array	Array with search parameters to generate the search_key
+		* @var	string	type				Searching type ('posts', 'topics')
+		* @var	boolean	firstpost_only		Flag indicating if only topic starting posts are considered
+		* @var	int		sort_days			Time, in days, of the oldest possible post to list
+		* @var	string	sort_key			The sort type used from the possible sort types
+		* @var	int		topic_id			Limit the search to this topic_id only
+		* @var	array	ex_fid_ary			Which forums not to search on
+		* @var	string	post_visibility		Post visibility data
+		* @var	array	author_ary			Array of user_id containing the users to filter the results to
+		* @var	string	author_name			The username to search on
+		* @since 3.1.7-RC1
+		*/
+		$vars = array(
+			'search_key_array',
+			'type',
+			'firstpost_only',
+			'sort_days',
+			'sort_key',
+			'topic_id',
+			'ex_fid_ary',
+			'post_visibility',
+			'author_ary',
+			'author_name',
+		);
+		extract($this->phpbb_dispatcher->trigger_event('core.search_mysql_by_author_modify_search_key', compact($vars)));
+
+		$search_key = md5(implode('#', $search_key_array));
 
 		if ($start < 0)
 		{
--- a/phpbb/search/fulltext_native.php
+++ b/phpbb/search/fulltext_native.php
@@ -57,7 +57,7 @@ class fulltext_native extends \phpbb\search\base
 	protected $must_not_contain_ids = array();
 
 	/**
-	 * Post ids of posts containing atleast one word that needs to be excluded
+	 * Post ids of posts containing at least one word that needs to be excluded
 	 * @var array
 	 */
 	protected $must_exclude_one_ids = array();
@@ -530,7 +530,7 @@ class fulltext_native extends \phpbb\search\base
 		sort($must_exclude_one_ids);
 
 		// generate a search_key from all the options to identify the results
-		$search_key = md5(implode('#', array(
+		$search_key_array = array(
 			serialize($must_contain_ids),
 			serialize($must_not_contain_ids),
 			serialize($must_exclude_one_ids),
@@ -544,7 +544,45 @@ class fulltext_native extends \phpbb\search\base
 			$post_visibility,
 			implode(',', $author_ary),
 			$author_name,
-		)));
+		);
+
+		/**
+		* Allow changing the search_key for cached results
+		*
+		* @event core.search_native_by_keyword_modify_search_key
+		* @var	array	search_key_array	Array with search parameters to generate the search_key
+		* @var	array	must_contain_ids	Array with post ids of posts containing words that are to be included
+		* @var	array	must_not_contain_ids	Array with post ids of posts containing words that should not be included
+		* @var	array	must_exclude_one_ids	Array with post ids of posts containing at least one word that needs to be excluded
+		* @var	string	type				Searching type ('posts', 'topics')
+		* @var	string	fields				Searching fields ('titleonly', 'msgonly', 'firstpost', 'all')
+		* @var	string	terms				Searching terms ('all', 'any')
+		* @var	int		sort_days			Time, in days, of the oldest possible post to list
+		* @var	string	sort_key			The sort type used from the possible sort types
+		* @var	int		topic_id			Limit the search to this topic_id only
+		* @var	array	ex_fid_ary			Which forums not to search on
+		* @var	string	post_visibility		Post visibility data
+		* @var	array	author_ary			Array of user_id containing the users to filter the results to
+		* @since 3.1.7-RC1
+		*/
+		$vars = array(
+			'search_key_array',
+			'must_contain_ids',
+			'must_not_contain_ids',
+			'must_exclude_one_ids',
+			'type',
+			'fields',
+			'terms',
+			'sort_days',
+			'sort_key',
+			'topic_id',
+			'ex_fid_ary',
+			'post_visibility',
+			'author_ary',
+		);
+		extract($this->phpbb_dispatcher->trigger_event('core.search_native_by_keyword_modify_search_key', compact($vars)));
+
+		$search_key = md5(implode('#', $search_key_array));
 
 		// try reading the results from cache
 		$total_results = 0;
@@ -980,7 +1018,7 @@ class fulltext_native extends \phpbb\search\base
 		}
 
 		// generate a search_key from all the options to identify the results
-		$search_key = md5(implode('#', array(
+		$search_key_array = array(
 			'',
 			$type,
 			($firstpost_only) ? 'firstpost' : '',
@@ -993,7 +1031,39 @@ class fulltext_native extends \phpbb\search\base
 			$post_visibility,
 			implode(',', $author_ary),
 			$author_name,
-		)));
+		);
+
+		/**
+		* Allow changing the search_key for cached results
+		*
+		* @event core.search_native_by_author_modify_search_key
+		* @var	array	search_key_array	Array with search parameters to generate the search_key
+		* @var	string	type				Searching type ('posts', 'topics')
+		* @var	boolean	firstpost_only		Flag indicating if only topic starting posts are considered
+		* @var	int		sort_days			Time, in days, of the oldest possible post to list
+		* @var	string	sort_key			The sort type used from the possible sort types
+		* @var	int		topic_id			Limit the search to this topic_id only
+		* @var	array	ex_fid_ary			Which forums not to search on
+		* @var	string	post_visibility		Post visibility data
+		* @var	array	author_ary			Array of user_id containing the users to filter the results to
+		* @var	string	author_name			The username to search on
+		* @since 3.1.7-RC1
+		*/
+		$vars = array(
+			'search_key_array',
+			'type',
+			'firstpost_only',
+			'sort_days',
+			'sort_key',
+			'topic_id',
+			'ex_fid_ary',
+			'post_visibility',
+			'author_ary',
+			'author_name',
+		);
+		extract($this->phpbb_dispatcher->trigger_event('core.search_native_by_author_modify_search_key', compact($vars)));
+
+		$search_key = md5(implode('#', $search_key_array));
 
 		// try reading the results from cache
 		$total_results = 0;
--- a/phpbb/search/fulltext_postgres.php
+++ b/phpbb/search/fulltext_postgres.php
@@ -341,7 +341,7 @@ class fulltext_postgres extends \phpbb\search\base
 		}
 
 		// generate a search_key from all the options to identify the results
-		$search_key = md5(implode('#', array(
+		$search_key_array = array(
 			implode(', ', $this->split_words),
 			$type,
 			$fields,
@@ -352,7 +352,39 @@ class fulltext_postgres extends \phpbb\search\base
 			implode(',', $ex_fid_ary),
 			$post_visibility,
 			implode(',', $author_ary)
-		)));
+		);
+
+		/**
+		* Allow changing the search_key for cached results
+		*
+		* @event core.search_postgres_by_keyword_modify_search_key
+		* @var	array	search_key_array	Array with search parameters to generate the search_key
+		* @var	string	type				Searching type ('posts', 'topics')
+		* @var	string	fields				Searching fields ('titleonly', 'msgonly', 'firstpost', 'all')
+		* @var	string	terms				Searching terms ('all', 'any')
+		* @var	int		sort_days			Time, in days, of the oldest possible post to list
+		* @var	string	sort_key			The sort type used from the possible sort types
+		* @var	int		topic_id			Limit the search to this topic_id only
+		* @var	array	ex_fid_ary			Which forums not to search on
+		* @var	string	post_visibility		Post visibility data
+		* @var	array	author_ary			Array of user_id containing the users to filter the results to
+		* @since 3.1.7-RC1
+		*/
+		$vars = array(
+			'search_key_array',
+			'type',
+			'fields',
+			'terms',
+			'sort_days',
+			'sort_key',
+			'topic_id',
+			'ex_fid_ary',
+			'post_visibility',
+			'author_ary',
+		);
+		extract($this->phpbb_dispatcher->trigger_event('core.search_postgres_by_keyword_modify_search_key', compact($vars)));
+
+		$search_key = md5(implode('#', $search_key_array));
 
 		if ($start < 0)
 		{
@@ -585,7 +617,7 @@ class fulltext_postgres extends \phpbb\search\base
 		}
 
 		// generate a search_key from all the options to identify the results
-		$search_key = md5(implode('#', array(
+		$search_key_array = array(
 			'',
 			$type,
 			($firstpost_only) ? 'firstpost' : '',
@@ -598,7 +630,39 @@ class fulltext_postgres extends \phpbb\search\base
 			$post_visibility,
 			implode(',', $author_ary),
 			$author_name,
-		)));
+		);
+
+		/**
+		* Allow changing the search_key for cached results
+		*
+		* @event core.search_postgres_by_author_modify_search_key
+		* @var	array	search_key_array	Array with search parameters to generate the search_key
+		* @var	string	type				Searching type ('posts', 'topics')
+		* @var	boolean	firstpost_only		Flag indicating if only topic starting posts are considered
+		* @var	int		sort_days			Time, in days, of the oldest possible post to list
+		* @var	string	sort_key			The sort type used from the possible sort types
+		* @var	int		topic_id			Limit the search to this topic_id only
+		* @var	array	ex_fid_ary			Which forums not to search on
+		* @var	string	post_visibility		Post visibility data
+		* @var	array	author_ary			Array of user_id containing the users to filter the results to
+		* @var	string	author_name			The username to search on
+		* @since 3.1.7-RC1
+		*/
+		$vars = array(
+			'search_key_array',
+			'type',
+			'firstpost_only',
+			'sort_days',
+			'sort_key',
+			'topic_id',
+			'ex_fid_ary',
+			'post_visibility',
+			'author_ary',
+			'author_name',
+		);
+		extract($this->phpbb_dispatcher->trigger_event('core.search_postgres_by_author_modify_search_key', compact($vars)));
+
+		$search_key = md5(implode('#', $search_key_array));
 
 		if ($start < 0)
 		{
--- a/phpbb/search/fulltext_sphinx.php
+++ b/phpbb/search/fulltext_sphinx.php
@@ -358,6 +358,23 @@ class fulltext_sphinx
 
 		$non_unique = array('sql_query_pre' => true, 'sql_attr_uint' => true, 'sql_attr_timestamp' => true, 'sql_attr_str2ordinal' => true, 'sql_attr_bool' => true);
 		$delete = array('sql_group_column' => true, 'sql_date_column' => true, 'sql_str2ordinal_column' => true);
+
+		/**
+		* Allow adding/changing the Sphinx configuration data
+		*
+		* @event core.search_sphinx_modify_config_data
+		* @var	array	config_data	Array with the Sphinx configuration data
+		* @var	array	non_unique	Array with the Sphinx non-unique variables to delete
+		* @var	array	delete		Array with the Sphinx variables to delete
+		* @since 3.1.7-RC1
+		*/
+		$vars = array(
+			'config_data',
+			'non_unique',
+			'delete',
+		);
+		extract($this->phpbb_dispatcher->trigger_event('core.search_sphinx_modify_config_data', compact($vars)));
+
 		foreach ($config_data as $section_name => $section_data)
 		{
 			$section = $config_object->get_section_by_name($section_name);
@@ -531,6 +548,41 @@ class fulltext_sphinx
 			$this->sphinx->SetFilter('topic_id', array($topic_id));
 		}
 
+		/**
+		* Allow modifying the Sphinx search options
+		*
+		* @event core.search_sphinx_keywords_modify_options
+		* @var	string	type				Searching type ('posts', 'topics')
+		* @var	string	fields				Searching fields ('titleonly', 'msgonly', 'firstpost', 'all')
+		* @var	string	terms				Searching terms ('all', 'any')
+		* @var	int		sort_days			Time, in days, of the oldest possible post to list
+		* @var	string	sort_key			The sort type used from the possible sort types
+		* @var	int		topic_id			Limit the search to this topic_id only
+		* @var	array	ex_fid_ary			Which forums not to search on
+		* @var	string	post_visibility		Post visibility data
+		* @var	array	author_ary			Array of user_id containing the users to filter the results to
+		* @var	string	author_name			The username to search on
+		* @var	object	sphinx				The Sphinx searchd client object
+		* @since 3.1.7-RC1
+		*/
+		$sphinx = $this->sphinx;
+		$vars = array(
+			'type',
+			'fields',
+			'terms',
+			'sort_days',
+			'sort_key',
+			'topic_id',
+			'ex_fid_ary',
+			'post_visibility',
+			'author_ary',
+			'author_name',
+			'sphinx',
+		);
+		extract($this->phpbb_dispatcher->trigger_event('core.search_sphinx_keywords_modify_options', compact($vars)));
+		$this->sphinx = $sphinx;
+		unset($sphinx);
+
 		$search_query_prefix = '';
 
 		switch ($fields)
--- a/phpbb/session.php
+++ b/phpbb/session.php
@@ -446,39 +446,6 @@ class session
 
 					if (!$session_expired)
 					{
-						// Only update session DB a minute or so after last update or if page changes
-						if ($this->time_now - $this->data['session_time'] > 60 || ($this->update_session_page && $this->data['session_page'] != $this->page['page']))
-						{
-							$sql_ary = array('session_time' => $this->time_now);
-
-							// Do not update the session page for ajax requests, so the view online still works as intended
-							if ($this->update_session_page && !$request->is_ajax())
-							{
-								$sql_ary['session_page'] = substr($this->page['page'], 0, 199);
-								$sql_ary['session_forum_id'] = $this->page['forum'];
-							}
-
-							$db->sql_return_on_error(true);
-
-							$this->update_session($sql_ary);
-
-							$db->sql_return_on_error(false);
-
-							// If the database is not yet updated, there will be an error due to the session_forum_id
-							// @todo REMOVE for 3.0.2
-							if ($result === false)
-							{
-								unset($sql_ary['session_forum_id']);
-
-								$this->update_session($sql_ary);
-							}
-
-							if ($this->data['user_id'] != ANONYMOUS && !empty($config['new_member_post_limit']) && $this->data['user_new'] && $config['new_member_post_limit'] <= $this->data['user_posts'])
-							{
-								$this->leave_newly_registered();
-							}
-						}
-
 						$this->data['is_registered'] = ($this->data['user_id'] != ANONYMOUS && ($this->data['user_type'] == USER_NORMAL || $this->data['user_type'] == USER_FOUNDER)) ? true : false;
 						$this->data['is_bot'] = (!$this->data['is_registered'] && $this->data['user_id'] != ANONYMOUS) ? true : false;
 						$this->data['user_lang'] = basename($this->data['user_lang']);
@@ -734,18 +701,6 @@ class session
 				// Only update session DB a minute or so after last update or if page changes
 				if ($this->time_now - $this->data['session_time'] > 60 || ($this->update_session_page && $this->data['session_page'] != $this->page['page']))
 				{
-					$this->data['session_time'] = $this->data['session_last_visit'] = $this->time_now;
-
-					$sql_ary = array('session_time' => $this->time_now, 'session_last_visit' => $this->time_now, 'session_admin' => 0);
-
-					if ($this->update_session_page)
-					{
-						$sql_ary['session_page'] = substr($this->page['page'], 0, 199);
-						$sql_ary['session_forum_id'] = $this->page['forum'];
-					}
-
-					$this->update_session($sql_ary);
-
 					// Update the last visit time
 					$sql = 'UPDATE ' . USERS_TABLE . '
 						SET user_lastvisit = ' . (int) $this->data['session_time'] . '
@@ -1599,4 +1554,39 @@ class session
 		$vars = array('session_data', 'session_id');
 		extract($phpbb_dispatcher->trigger_event('core.update_session_after', compact($vars)));
 	}
+
+	public function update_session_infos()
+	{
+		global $db, $request;
+
+		// No need to update if it's a new session. Informations are already inserted by session_create()
+		if (isset($this->data['session_created']) && $this->data['session_created'])
+		{
+			return;
+		}
+
+		// Only update session DB a minute or so after last update or if page changes
+		if ($this->time_now - $this->data['session_time'] > 60 || ($this->update_session_page && $this->data['session_page'] != $this->page['page']))
+		{
+			$sql_ary = array('session_time' => $this->time_now);
+
+			// Do not update the session page for ajax requests, so the view online still works as intended
+			if ($this->update_session_page && !$request->is_ajax())
+			{
+				$sql_ary['session_page'] = substr($this->page['page'], 0, 199);
+				$sql_ary['session_forum_id'] = $this->page['forum'];
+			}
+
+			$db->sql_return_on_error(true);
+
+			$this->update_session($sql_ary);
+
+			$db->sql_return_on_error(false);
+
+			if ($this->data['user_id'] != ANONYMOUS && !empty($config['new_member_post_limit']) && $this->data['user_new'] && $config['new_member_post_limit'] <= $this->data['user_posts'])
+			{
+				$this->leave_newly_registered();
+			}
+		}
+	}
 }
--- a/phpbb/user_loader.php
+++ b/phpbb/user_loader.php
@@ -189,12 +189,7 @@ class user_loader
 			return '';
 		}
 
-		if (!function_exists('get_user_avatar'))
-		{
-			include($this->phpbb_root_path . 'includes/functions_display.' . $this->php_ext);
-		}
-
-		return get_user_avatar($user['user_avatar'], $user['user_avatar_type'], $user['user_avatar_width'], $user['user_avatar_height'], 'USER_AVATAR', false, $lazy);
+		return phpbb_get_avatar(\phpbb\avatar\manager::clean_row($user, 'user'), 'USER_AVATAR', false, $lazy);
 	}
 
 	/**
--- a/posting.php
+++ b/posting.php
@@ -1027,7 +1027,8 @@ if ($submit || $preview || $refresh)
 		$message_parser->bbcode_bitfield = $post_data['bbcode_bitfield'];
 	}
 
-	if ($mode != 'edit' && !$preview && !$refresh && $config['flood_interval'] && !$auth->acl_get('f_ignoreflood', $forum_id))
+	$ignore_flood = $auth->acl_get('u_ignoreflood') ? true : $auth->acl_get('f_ignoreflood', $forum_id);
+	if ($mode != 'edit' && !$preview && !$refresh && $config['flood_interval'] && !$ignore_flood)
 	{
 		// Flood check
 		$last_post_time = 0;
--- a/search.php
+++ b/search.php
@@ -427,6 +427,8 @@ if ($keywords || $author || $author_id || $search_id || $submit)
 
 				gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param);
 				$s_sort_key = $s_sort_dir = $u_sort_param = $s_limit_days = '';
+
+				$template->assign_var('U_MARK_ALL_READ', ($user->data['is_registered'] || $config['load_anon_lastread']) ? append_sid("{$phpbb_root_path}index.$phpEx", 'hash=' . generate_link_hash('global') . '&amp;mark=forums&amp;mark_time=' . time()) : '');
 			break;
 
 			case 'newposts':
@@ -483,6 +485,24 @@ if ($keywords || $author || $author_id || $search_id || $submit)
 		}
 	}
 
+	/**
+	* Event to modify data after pre-made searches
+	*
+	* @event core.search_modify_param_after
+	* @var	string	l_search_title	The title of the search page
+	* @var	string	search_id		Predefined search type name
+	* @var	string	show_results	Display topics or posts
+	* @var	string	sql				SQL query corresponding to the pre-made search id
+	* @since 3.1.7-RC1
+	*/
+	$vars = array(
+		'l_search_title',
+		'search_id',
+		'show_results',
+		'sql',
+	);
+	extract($phpbb_dispatcher->trigger_event('core.search_modify_param_after', compact($vars)));
+
 	// show_results should not change after this
 	$per_page = ($show_results == 'posts') ? $config['posts_per_page'] : $config['topics_per_page'];
 	$total_match_count = 0;
@@ -594,6 +614,20 @@ if ($keywords || $author || $author_id || $search_id || $submit)
 	$u_search .= ($search_fields != 'all') ? '&amp;sf=' . $search_fields : '';
 	$u_search .= ($return_chars != 300) ? '&amp;ch=' . $return_chars : '';
 
+	/**
+	* Event to add or modify search URL parameters
+	*
+	* @event core.search_modify_url_parameters
+	* @var	string	u_search		Search URL parameters string
+	* @var	string	search_id		Predefined search type name
+	* @since 3.1.7-RC1
+	*/
+	$vars = array(
+		'u_search',
+		'search_id',
+	);
+	extract($phpbb_dispatcher->trigger_event('core.search_modify_url_parameters', compact($vars)));
+
 	if ($sql_where)
 	{
 		if ($show_results == 'posts')
@@ -704,6 +738,8 @@ if ($keywords || $author || $author_id || $search_id || $submit)
 				$tracking_topics = ($tracking_topics) ? tracking_unserialize($tracking_topics) : array();
 			}
 
+			$sql_order_by = $sort_by_sql[$sort_key] . ' ' . (($sort_dir == 'd') ? 'DESC' : 'ASC');
+
 			/**
 			* Event to modify the SQL query before the topic data is retrieved
 			*
@@ -712,16 +748,30 @@ if ($keywords || $author || $author_id || $search_id || $submit)
 			* @var	string	sql_from		The SQL FROM string used by search to get topic data
 			* @var	string	sql_where		The SQL WHERE string used by search to get topic data
 			* @var	int		total_match_count	The total number of search matches
+			* @var	array	sort_by_sql		Array of SQL sorting instructions
+			* @var	string	sort_dir		The sorting direction
+			* @var	string	sort_key		The sorting key
+			* @var	string	sql_order_by	The SQL ORDER BY string used by search to get topic data
 			* @since 3.1.0-a1
 			* @changed 3.1.0-RC5 Added total_match_count
+			* @changed 3.1.7-RC1 Added sort_by_sql, sort_dir, sort_key, sql_order_by
 			*/
-			$vars = array('sql_select', 'sql_from', 'sql_where', 'total_match_count');
+			$vars = array(
+				'sql_select',
+				'sql_from',
+				'sql_where',
+				'total_match_count',
+				'sort_by_sql',
+				'sort_dir',
+				'sort_key',
+				'sql_order_by',
+			);
 			extract($phpbb_dispatcher->trigger_event('core.search_get_topic_data', compact($vars)));
 
 			$sql = "SELECT $sql_select
 				FROM $sql_from
-				WHERE $sql_where";
-			$sql .= ' ORDER BY ' . $sort_by_sql[$sort_key] . ' ' . (($sort_dir == 'd') ? 'DESC' : 'ASC');
+				WHERE $sql_where
+				ORDER BY $sql_order_by";
 		}
 		$result = $db->sql_query($sql);
 		$result_topic_id = 0;
--- a/styles/prosilver/style.cfg
+++ b/styles/prosilver/style.cfg
@@ -21,8 +21,8 @@
 # General Information about this style
 name = prosilver
 copyright = © phpBB Limited, 2007
-style_version = 3.1.6
-phpbb_version = 3.1.6
+style_version = 3.1.7
+phpbb_version = 3.1.7
 
 # Defining a different template bitfield
 # template_bitfield = lNg=
--- a/styles/prosilver/template/ajax.js
+++ b/styles/prosilver/template/ajax.js
@@ -242,7 +242,14 @@ phpbb.addAjaxCallback('vote_poll', function(res) {
 			var mostVoted = (res.vote_counts[optionId] === mostVotes);
 			var percent = (!res.total_votes) ? 0 : Math.round((res.vote_counts[optionId] / res.total_votes) * 100);
 			var percentRel = (mostVotes === 0) ? 0 : Math.round((res.vote_counts[optionId] / mostVotes) * 100);
-
+			var altText;
+
+			altText = $this.attr('data-alt-text');
+			if (voted) {
+				$this.attr('title', $.trim(altText));
+			} else {
+				$this.attr('title', '');
+			};
 			$this.toggleClass('voted', voted);
 			$this.toggleClass('most-votes', mostVoted);
 
--- a/styles/prosilver/template/forum_fn.js
+++ b/styles/prosilver/template/forum_fn.js
@@ -159,7 +159,10 @@ function selectCode(a) {
 			try {
 				s.setBaseAndExtent(e, 0, e, l);
 			} catch (error) {
-				s.setBaseAndExtent(e, 0, e, 1);
+				r = document.createRange();
+				r.selectNodeContents(e);
+				s.removeAllRanges();
+				s.addRange(r);
 			}
 		}
 		// Firefox and Opera
--- a/styles/prosilver/template/mcp_post.html
+++ b/styles/prosilver/template/mcp_post.html
@@ -91,9 +91,9 @@
 			<form method="post" id="mcp_approve" action="{U_APPROVE_ACTION}">
 
 			<p class="post-notice deleted">
-				<input class="button2" type="submit" value="{L_DELETE}" name="action[disapprove]" /> &nbsp;
+				<!-- IF S_CAN_DELETE_POST --><input class="button2" type="submit" value="{L_DELETE}" name="action[delete]" /> &nbsp;<!-- ENDIF -->
 				<input class="button1" type="submit" value="{L_RESTORE}" name="action[restore]" />
-				<!-- IF not S_FIRST_POST --><input type="hidden" name="mode" value="unapproved_posts" /><!-- ENDIF -->
+				<!-- IF not S_FIRST_POST --><input type="hidden" name="mode" value="deleted_posts" /><!-- ENDIF -->
 				<input type="hidden" name="post_id_list[]" value="{POST_ID}" />
 				{S_FORM_TOKEN}
 			</p>
--- a/styles/prosilver/template/memberlist_body.html
+++ b/styles/prosilver/template/memberlist_body.html
@@ -14,7 +14,11 @@
 
 	<!-- IF S_SHOW_GROUP -->
 		<h2 class="group-title"<!-- IF GROUP_COLOR --> style="color:#{GROUP_COLOR};"<!-- ENDIF -->>{GROUP_NAME}</h2>
+		<!-- IF U_MANAGE -->
+			<p class="right responsive-center manage rightside"><a href="{U_MANAGE}">{L_MANAGE_GROUP}</a></p>
+		<!-- ENDIF -->
 		<p>{GROUP_DESC} {GROUP_TYPE}</p>
+
 		<p>
 			<!-- IF AVATAR_IMG -->{AVATAR_IMG}<!-- ENDIF -->
 			<!-- IF RANK_IMG -->{RANK_IMG}<!-- ENDIF -->
@@ -101,8 +105,8 @@
 				<!-- ENDIF -->
 			<!-- ENDIF -->
 
-	<tr class="<!-- IF memberrow.S_ROW_COUNT is even -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
-		<td><span class="rank-img"><!-- EVENT memberlist_body_rank_prepend --><!-- IF memberrow.RANK_IMG -->{memberrow.RANK_IMG}<!-- ELSE -->{memberrow.RANK_TITLE}<!-- ENDIF --><!-- EVENT memberlist_body_rank_append --></span><!-- IF S_IN_SEARCH_POPUP and not S_SELECT_SINGLE --><input type="checkbox" name="user" value="{memberrow.USERNAME}" /> <!-- ENDIF --><!-- EVENT memberlist_body_username_prepend -->{memberrow.USERNAME_FULL}<!-- EVENT memberlist_body_username_append --><!-- IF S_IN_SEARCH_POPUP --><br />[&nbsp;<a href="#" onclick="insert_single_user('#results', '{memberrow.A_USERNAME}'); return false;">{L_SELECT}</a>&nbsp;]<!-- ENDIF --></td>
+	<tr class="<!-- IF memberrow.S_ROW_COUNT is even -->bg1<!-- ELSE -->bg2<!-- ENDIF --><!-- IF memberrow.S_INACTIVE --> inactive<!-- ENDIF -->">
+		<td><span class="rank-img"><!-- EVENT memberlist_body_rank_prepend --><!-- IF memberrow.RANK_IMG -->{memberrow.RANK_IMG}<!-- ELSE -->{memberrow.RANK_TITLE}<!-- ENDIF --><!-- EVENT memberlist_body_rank_append --></span><!-- IF S_IN_SEARCH_POPUP and not S_SELECT_SINGLE --><input type="checkbox" name="user" value="{memberrow.USERNAME}" /> <!-- ENDIF --><!-- EVENT memberlist_body_username_prepend -->{memberrow.USERNAME_FULL}<!-- IF memberrow.S_INACTIVE --> ({L_INACTIVE})<!-- ENDIF --><!-- EVENT memberlist_body_username_append --><!-- IF S_IN_SEARCH_POPUP --><br />[&nbsp;<a href="#" onclick="insert_single_user('#results', '{memberrow.A_USERNAME}'); return false;">{L_SELECT}</a>&nbsp;]<!-- ENDIF --></td>
 		<td class="posts"><!-- IF memberrow.POSTS and S_DISPLAY_SEARCH --><a href="{memberrow.U_SEARCH_USER}" title="{L_SEARCH_USER_POSTS}">{memberrow.POSTS}</a><!-- ELSE -->{memberrow.POSTS}<!-- ENDIF --></td>
 		<td class="info"><!-- BEGIN custom_fields --><div>{memberrow.custom_fields.PROFILE_FIELD_VALUE}</div><!-- BEGINELSE -->&nbsp;<!-- END custom_fields --></td>
 		<td>{memberrow.JOINED}</td>
--- a/styles/prosilver/template/memberlist_team.html
+++ b/styles/prosilver/template/memberlist_team.html
@@ -8,7 +8,7 @@
 <div class="forumbg forumbg-table">
 	<div class="inner">
 
-	<table class="table1">
+	<table class="table1" id="team">
 	<thead>
 	<tr>
 		<th class="name" data-dfn="{L_RANK}{L_COMMA_SEPARATOR}{L_USERNAME}"><span class="rank-img">{L_RANK}&nbsp;</span><!-- IF group.U_GROUP --><a href="{group.U_GROUP}">{group.GROUP_NAME}</a><!-- ELSE -->{group.GROUP_NAME}<!-- ENDIF --></th>
@@ -18,8 +18,8 @@
 	</thead>
 	<tbody>
 <!-- BEGIN user -->
-	<tr class="<!-- IF group.user.S_ROW_COUNT is even -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
-		<td><!-- IF group.user.RANK_IMG --><span class="rank-img">{group.user.RANK_IMG}</span><!-- ELSE --><span class="rank-img">{group.user.RANK_TITLE}</span><!-- ENDIF -->{group.user.USERNAME_FULL}</td>
+	<tr class="<!-- IF group.user.S_ROW_COUNT is even -->bg1<!-- ELSE -->bg2<!-- ENDIF --><!-- IF group.user.S_INACTIVE --> inactive<!-- ENDIF -->">
+		<td><!-- IF group.user.RANK_IMG --><span class="rank-img">{group.user.RANK_IMG}</span><!-- ELSE --><span class="rank-img">{group.user.RANK_TITLE}</span><!-- ENDIF -->{group.user.USERNAME_FULL}<!-- IF group.user.S_INACTIVE --> ({L_INACTIVE})<!-- ENDIF --></td>
 		<td class="info"><!-- IF group.user.U_GROUP -->
 			<a<!-- IF group.user.GROUP_COLOR --> style="font-weight: bold; color: #{group.user.GROUP_COLOR}"<!-- ENDIF --> href="{group.user.U_GROUP}">{group.user.GROUP_NAME}</a>
 			<!-- ELSE -->
--- a/styles/prosilver/template/overall_header.html
+++ b/styles/prosilver/template/overall_header.html
@@ -46,7 +46,7 @@
 <!-- ENDIF -->
 <link href="{T_STYLESHEET_LINK}" rel="stylesheet">
 <link href="{T_STYLESHEET_LANG_LINK}" rel="stylesheet">
-<link href="{T_THEME_PATH}/responsive.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet" media="all and (max-width: 700px), all and (max-device-width: 700px)">
+<link href="{T_THEME_PATH}/responsive.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet" media="all and (max-width: 700px)">
 
 <!-- IF S_CONTENT_DIRECTION eq 'rtl' -->
 	<link href="{T_THEME_PATH}/bidi.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet">
--- a/styles/prosilver/template/posting_editor.html
+++ b/styles/prosilver/template/posting_editor.html
@@ -6,7 +6,7 @@
 		<dt><label for="icon">{L_ICON}{L_COLON}</label></dt>
 		<dd>
 			<label for="icon"><input type="radio" name="icon" id="icon" value="0" checked="checked" tabindex="1" /> <!-- IF S_SHOW_TOPIC_ICONS -->{L_NO_TOPIC_ICON}<!-- ELSE -->{L_NO_PM_ICON}<!-- ENDIF --></label>
-			<!-- BEGIN topic_icon --><label for="icon-{topic_icon.ICON_ID}"><input type="radio" name="icon" id="icon-{topic_icon.ICON_ID}" value="{topic_icon.ICON_ID}" {topic_icon.S_ICON_CHECKED} tabindex="1" /><img src="{topic_icon.ICON_IMG}" width="{topic_icon.ICON_WIDTH}" height="{topic_icon.ICON_HEIGHT}" alt="" title="" /></label> <!-- END topic_icon -->
+			<!-- BEGIN topic_icon --><label for="icon-{topic_icon.ICON_ID}"><input type="radio" name="icon" id="icon-{topic_icon.ICON_ID}" value="{topic_icon.ICON_ID}" {topic_icon.S_ICON_CHECKED} tabindex="1" /><img src="{topic_icon.ICON_IMG}" width="{topic_icon.ICON_WIDTH}" height="{topic_icon.ICON_HEIGHT}" alt="{topic_icon.ICON_NAME}" title="" /></label> <!-- END topic_icon -->
 		</dd>
 	</dl>
 	<!-- ENDIF -->
--- a/styles/prosilver/template/posting_layout.html
+++ b/styles/prosilver/template/posting_layout.html
@@ -1,7 +1,7 @@
 <!-- INCLUDE overall_header.html -->
 
 <!-- IF TOPIC_TITLE -->
-	<h2 class="posting-title"><!-- EVENT posting_topic_title_before --><a href="{U_VIEW_TOPIC}">{TOPIC_TITLE}</a></h2>
+	<h2 class="posting-title"><!-- EVENT posting_topic_title_before --><a href="{U_VIEW_TOPIC}">{TOPIC_TITLE}</a><!-- EVENT posting_topic_title_after --></h2>
 <!-- ELSE -->
 	<h2 class="posting-title"><a href="{U_VIEW_FORUM}">{FORUM_NAME}</a></h2>
  <!-- ENDIF -->
--- a/styles/prosilver/template/posting_preview.html
+++ b/styles/prosilver/template/posting_preview.html
@@ -24,6 +24,8 @@
 
 <!-- ENDIF -->
 
+<!-- EVENT posting_preview_poll_after -->
+
 	<div class="postbody">
 		<h3>{L_PREVIEW}{L_COLON} {PREVIEW_SUBJECT}</h3>
 
--- a/styles/prosilver/template/quickreply_editor.html
+++ b/styles/prosilver/template/quickreply_editor.html
@@ -4,6 +4,7 @@
 		<div class="inner">
 				<h2 class="quickreply-title">{L_QUICKREPLY}</h2>
 				<fieldset class="fields1">
+				<!-- EVENT quickreply_editor_subject_before -->
 					<dl style="clear: left;">
 						<dt><label for="subject">{L_SUBJECT}{L_COLON}</label></dt>
 						<dd><input type="text" name="subject" id="subject" size="45" maxlength="124" tabindex="2" value="{SUBJECT}" class="inputbox autowidth" /></dd>
--- a/styles/prosilver/template/search_body.html
+++ b/styles/prosilver/template/search_body.html
@@ -9,7 +9,9 @@
 	<div class="inner">
 	<h3>{L_SEARCH_QUERY}</h3>
 
+	<!-- EVENT search_body_search_query_before -->
 	<fieldset>
+	<!-- EVENT search_body_search_query_prepend -->
 	<dl>
 		<dt><label for="keywords">{L_SEARCH_KEYWORDS}{L_COLON}</label><br /><span>{L_SEARCH_KEYWORDS_EXPLAIN}</span></dt>
 		<dd><input type="search" class="inputbox" name="keywords" id="keywords" size="40" title="{L_SEARCH_KEYWORDS}" /></dd>
@@ -20,7 +22,9 @@
 		<dt><label for="author">{L_SEARCH_AUTHOR}{L_COLON}</label><br /><span>{L_SEARCH_AUTHOR_EXPLAIN}</span></dt>
 		<dd><input type="search" class="inputbox" name="author" id="author" size="40" title="{L_SEARCH_AUTHOR}" /></dd>
 	</dl>
+	<!-- EVENT search_body_search_query_append -->
 	</fieldset>
+	<!-- EVENT search_body_search_query_after -->
 
 	</div>
 </div>
@@ -30,7 +34,9 @@
 
 	<h3>{L_SEARCH_OPTIONS}</h3>
 
+	<!-- EVENT search_body_search_options_before -->
 	<fieldset>
+	<!-- EVENT search_body_search_options_prepend -->
 	<dl>
 		<dt><label for="search_forum">{L_SEARCH_FORUMS}{L_COLON}</label><br /><span>{L_SEARCH_FORUMS_EXPLAIN}</span></dt>
 		<dd><select name="fid[]" id="search_forum" multiple="multiple" size="8" title="{L_SEARCH_FORUMS}">{S_FORUM_OPTIONS}</select></dd>
@@ -49,9 +55,11 @@
 		<dd><label for="sf3"><input type="radio" name="sf" id="sf3" value="titleonly" /> {L_SEARCH_TITLE_ONLY}</label></dd>
 		<dd><label for="sf4"><input type="radio" name="sf" id="sf4" value="firstpost" /> {L_SEARCH_FIRST_POST}</label></dd>
 	</dl>
+	<!-- EVENT search_body_search_options_append -->
 
 	<hr class="dashed" />
 
+	<!-- EVENT search_body_search_display_options_prepend -->
 	<dl>
 		<dt><label for="show_results1">{L_DISPLAY_RESULTS}{L_COLON}</label></dt>
 		<dd>
@@ -74,7 +82,9 @@
 		<dt><label>{L_RETURN_FIRST}{L_COLON}</label></dt>
 		<dd><select name="ch" title="{L_RETURN_FIRST}">{S_CHARACTER_OPTIONS}</select> {L_POST_CHARACTERS}</dd>
 	</dl>
+	<!-- EVENT search_body_search_display_options_append -->
 	</fieldset>
+	<!-- EVENT search_body_search_options_after -->
 
 	</div>
 </div>
@@ -91,7 +101,9 @@
 </div>
 
 </form>
+<!-- EVENT search_body_form_after -->
 
+<!-- EVENT search_body_recent_search_before -->
 <!-- IF .recentsearch -->
 <div class="forumbg forumbg-table">
 	<div class="inner">
@@ -119,5 +131,6 @@
 	</div>
 </div>
 <!-- ENDIF -->
+<!-- EVENT search_body_recent_search_after -->
 
 <!-- INCLUDE overall_footer.html -->
--- a/styles/prosilver/template/search_results.html
+++ b/styles/prosilver/template/search_results.html
@@ -33,6 +33,7 @@
 		<!-- EVENT search_results_searchbox_after -->
 
 		<div class="pagination">
+			<!-- IF U_MARK_ALL_READ --><a href="{U_MARK_ALL_READ}" class="mark-read" accesskey="m">{L_MARK_ALL_READ}</a> &bull;<!-- ENDIF -->
 			{SEARCH_MATCHES}
 			<!-- IF .pagination -->
 				<!-- INCLUDE pagination.html -->
--- a/styles/prosilver/template/simple_header.html
+++ b/styles/prosilver/template/simple_header.html
@@ -24,7 +24,7 @@
 <!-- ENDIF -->
 <link href="{T_STYLESHEET_LINK}" rel="stylesheet">
 <link href="{T_STYLESHEET_LANG_LINK}" rel="stylesheet">
-<link href="{T_THEME_PATH}/responsive.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet" media="only screen and (max-width: 700px), only screen and (max-device-width: 700px)">
+<link href="{T_THEME_PATH}/responsive.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet" media="all and (max-width: 700px)">
 
 <!-- IF S_CONTENT_DIRECTION eq 'rtl' -->
 	<link href="{T_THEME_PATH}/bidi.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet">
--- a/styles/prosilver/template/ucp_avatar_options_local.html
+++ b/styles/prosilver/template/ucp_avatar_options_local.html
@@ -10,7 +10,8 @@
 <!-- BEGIN avatar_local_row -->
 <!-- BEGIN avatar_local_col -->
 	<label for="av-{avatar_local_row.S_ROW_COUNT}-{avatar_local_row.avatar_local_col.S_ROW_COUNT}"><img src="{avatar_local_row.avatar_local_col.AVATAR_IMAGE}" alt="" /><br />
-	<input type="radio" name="avatar_local_file" id="av-{avatar_local_row.S_ROW_COUNT}-{avatar_local_row.avatar_local_col.S_ROW_COUNT}" value="{avatar_local_row.avatar_local_col.AVATAR_FILE}" /></label>
+	<input type="radio" name="avatar_local_file" id="av-{avatar_local_row.S_ROW_COUNT}-{avatar_local_row.avatar_local_col.S_ROW_COUNT}"
+		   value="{avatar_local_row.avatar_local_col.AVATAR_FILE}"<!-- IF avatar_local_row.avatar_local_col.CHECKED --> checked="checked"<!-- ENDIF --> /></label>
 <!-- END avatar_local_col -->
 <!-- END avatar_local_row -->
 </div>
--- a/styles/prosilver/template/ucp_register.html
+++ b/styles/prosilver/template/ucp_register.html
@@ -14,7 +14,7 @@
 // ]]>
 </script>
 
-<form method="post" action="{S_UCP_ACTION}" id="register">
+<form id="register" method="post" action="{S_UCP_ACTION}"{S_FORM_ENCTYPE}>
 
 <div class="panel">
 	<div class="inner">
--- a/styles/prosilver/template/viewforum_body.html
+++ b/styles/prosilver/template/viewforum_body.html
@@ -145,7 +145,9 @@
 		<ul class="topiclist topics">
 	<!-- ENDIF -->
 
+		<!-- EVENT viewforum_body_topic_row_before -->
 		<li class="row<!-- IF topicrow.S_ROW_COUNT is even --> bg1<!-- ELSE --> bg2<!-- ENDIF --><!-- IF topicrow.S_POST_GLOBAL --> global-announce<!-- ENDIF --><!-- IF topicrow.S_POST_ANNOUNCE --> announce<!-- ENDIF --><!-- IF topicrow.S_POST_STICKY --> sticky<!-- ENDIF --><!-- IF topicrow.S_TOPIC_REPORTED --> reported<!-- ENDIF -->">
+			<!-- EVENT viewforum_body_topic_row_prepend -->
 			<dl class="icon {topicrow.TOPIC_IMG_STYLE}">
 				<dt<!-- IF topicrow.TOPIC_ICON_IMG and S_TOPIC_ICONS --> style="background-image: url({T_ICONS_PATH}{topicrow.TOPIC_ICON_IMG}); background-repeat: no-repeat;"<!-- ENDIF --> title="{topicrow.TOPIC_FOLDER_IMG_ALT}">
 					<!-- IF topicrow.S_UNREAD_TOPIC and not S_IS_BOT --><a href="{topicrow.U_NEWEST_POST}" class="icon-link"></a><!-- ENDIF -->
@@ -195,7 +197,9 @@
 					<!-- IF not S_IS_BOT --><a href="{topicrow.U_LAST_POST}" title="{L_GOTO_LAST_POST}">{LAST_POST_IMG}</a> <!-- ENDIF --><br />{topicrow.LAST_POST_TIME}</span>
 				</dd>
 			</dl>
+			<!-- EVENT viewforum_body_topic_row_append -->
 		</li>
+		<!-- EVENT viewforum_body_topic_row_after -->
 
 	<!-- IF topicrow.S_LAST_ROW -->
 			</ul>
--- a/styles/prosilver/template/viewtopic_body.html
+++ b/styles/prosilver/template/viewtopic_body.html
@@ -1,6 +1,7 @@
 <!-- INCLUDE overall_header.html -->
 
 <h2 class="topic-title"><!-- EVENT viewtopic_topic_title_prepend --><a href="{U_VIEW_TOPIC}">{TOPIC_TITLE}</a><!-- EVENT viewtopic_topic_title_append --></h2>
+<!-- EVENT viewtopic_topic_title_after -->
 <!-- NOTE: remove the style="display: none" when you want to have the forum description on the topic body -->
 <!-- IF FORUM_DESC --><div style="display: none !important;">{FORUM_DESC}<br /></div><!-- ENDIF -->
 
@@ -83,7 +84,7 @@
 			<fieldset class="polls">
 			<!-- BEGIN poll_option -->
 				<!-- EVENT viewtopic_body_poll_option_before -->
-				<dl class="<!-- IF poll_option.POLL_OPTION_VOTED -->voted<!-- ENDIF --><!-- IF poll_option.POLL_OPTION_MOST_VOTES --> most-votes<!-- ENDIF -->"<!-- IF poll_option.POLL_OPTION_VOTED --> title="{L_POLL_VOTED_OPTION}"<!-- ENDIF --> data-poll-option-id="{poll_option.POLL_OPTION_ID}">
+				<dl class="<!-- IF poll_option.POLL_OPTION_VOTED -->voted<!-- ENDIF --><!-- IF poll_option.POLL_OPTION_MOST_VOTES --> most-votes<!-- ENDIF -->"<!-- IF poll_option.POLL_OPTION_VOTED --> title="{L_POLL_VOTED_OPTION}"<!-- ENDIF --> data-alt-text="{L_POLL_VOTED_OPTION}" data-poll-option-id="{poll_option.POLL_OPTION_ID}">
 					<dt><!-- IF S_CAN_VOTE --><label for="vote_{poll_option.POLL_OPTION_ID}">{poll_option.POLL_OPTION_CAPTION}</label><!-- ELSE -->{poll_option.POLL_OPTION_CAPTION}<!-- ENDIF --></dt>
 					<!-- IF S_CAN_VOTE --><dd style="width: auto;" class="poll_option_select"><!-- IF S_IS_MULTI_CHOICE --><input type="checkbox" name="vote_id[]" id="vote_{poll_option.POLL_OPTION_ID}" value="{poll_option.POLL_OPTION_ID}"<!-- IF poll_option.POLL_OPTION_VOTED --> checked="checked"<!-- ENDIF --> /><!-- ELSE --><input type="radio" name="vote_id[]" id="vote_{poll_option.POLL_OPTION_ID}" value="{poll_option.POLL_OPTION_ID}"<!-- IF poll_option.POLL_OPTION_VOTED --> checked="checked"<!-- ENDIF --> /><!-- ENDIF --></dd><!-- ENDIF -->
 					<dd class="resultbar<!-- IF not S_DISPLAY_RESULTS --> hidden<!-- ENDIF -->"><div class="<!-- IF poll_option.POLL_OPTION_PCT < 20 -->pollbar1<!-- ELSEIF poll_option.POLL_OPTION_PCT < 40 -->pollbar2<!-- ELSEIF poll_option.POLL_OPTION_PCT < 60 -->pollbar3<!-- ELSEIF poll_option.POLL_OPTION_PCT < 80 -->pollbar4<!-- ELSE -->pollbar5<!-- ENDIF -->" style="width:{poll_option.POLL_OPTION_PERCENT_REL};">{poll_option.POLL_OPTION_RESULT}</div></dd>
@@ -215,6 +216,7 @@
 			<!-- ENDIF -->
 			<div id="post_content{postrow.POST_ID}"<!-- IF postrow.S_POST_HIDDEN --> style="display: none;"<!-- ENDIF -->>
 
+			<!-- EVENT viewtopic_body_post_subject_before -->
 			<h3 <!-- IF postrow.S_FIRST_ROW -->class="first"<!-- ENDIF -->><!-- IF postrow.POST_ICON_IMG --><img src="{T_ICONS_PATH}{postrow.POST_ICON_IMG}" width="{postrow.POST_ICON_IMG_WIDTH}" height="{postrow.POST_ICON_IMG_HEIGHT}" alt="" /> <!-- ENDIF --><a href="#p{postrow.POST_ID}">{postrow.POST_SUBJECT}</a></h3>
 
 		<!-- DEFINE $SHOW_POST_BUTTONS = (postrow.U_EDIT or postrow.U_DELETE or postrow.U_REPORT or postrow.U_WARN or postrow.U_INFO or postrow.U_QUOTE) -->
@@ -277,7 +279,9 @@
 			<form method="post" class="mcp_approve" action="{postrow.U_APPROVE_ACTION}">
 				<p class="post-notice deleted">
 					<strong>{L_POST_DELETED_ACTION}</strong>
-					<input class="button2" type="submit" value="{L_DELETE}" name="action[disapprove]" />
+					<!-- IF postrow.S_DELETE_PERMANENT -->
+						<input class="button2" type="submit" value="{L_DELETE}" name="action[delete]" />
+					<!-- ENDIF -->
 					<input class="button1" type="submit" value="{L_RESTORE}" name="action[restore]" />
 					<input type="hidden" name="post_id_list[]" value="{postrow.POST_ID}" />
 					{S_FORM_TOKEN}
--- a/styles/prosilver/theme/common.css
+++ b/styles/prosilver/theme/common.css
@@ -1173,6 +1173,12 @@ ul.linklist:after,
 	text-transform: none;
 }
 
+.dropdown-extended .header:after {
+	content: '';
+	display: table;
+	clear: both;
+}
+
 .dropdown-extended .footer {
 	text-align: center;
 	font-size: 1.1em;
--- a/styles/prosilver/theme/content.css
+++ b/styles/prosilver/theme/content.css
@@ -672,7 +672,7 @@ fieldset.polls dd div {
 	text-align: right;
 	font-family: Arial, Helvetica, sans-serif;
 	font-weight: bold;
-	padding: 0 2px;
+	padding: 2px 2px 0 2px;
 	overflow: visible;
 	min-width: 8px;
 }
@@ -842,3 +842,7 @@ table.fixed-width-table {
 	background: rgba(0, 0, 0, .3);
 	border-radius: 3px;
 }
+
+#memberlist tr.inactive, #team tr.inactive {
+	font-style: italic;
+}
--- a/styles/prosilver/theme/plupload.css
+++ b/styles/prosilver/theme/plupload.css
@@ -15,6 +15,11 @@
 	width: 30%;
 }
 
+.attach-comment .inputbox {
+	resize: vertical;
+	width: 100%;
+}
+
 .attach-filesize {
 	width: 15%;
 }
--- a/vendor/autoload.php
+++ b/vendor/autoload.php
@@ -4,4 +4,4 @@
 
 require_once __DIR__ . '/composer' . '/autoload_real.php';
 
-return ComposerAutoloaderInit814f006b1edecd862adaa89c194918bc::getLoader();
+return ComposerAutoloaderInitf856c46a38122313790aa31708d122a3::getLoader();
--- a/vendor/composer/autoload_classmap.php
+++ b/vendor/composer/autoload_classmap.php
@@ -344,6 +344,7 @@ return array(
     'Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmerInterface' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerInterface.php',
     'Symfony\\Component\\HttpKernel\\CacheWarmer\\WarmableInterface' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/CacheWarmer/WarmableInterface.php',
     'Symfony\\Component\\HttpKernel\\Client' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Client.php',
+    'Symfony\\Component\\HttpKernel\\Config\\EnvParametersResource' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Config/EnvParametersResource.php',
     'Symfony\\Component\\HttpKernel\\Config\\FileLocator' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Config/FileLocator.php',
     'Symfony\\Component\\HttpKernel\\Controller\\ControllerReference' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Controller/ControllerReference.php',
     'Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Controller/ControllerResolver.php',
@@ -376,6 +377,7 @@ return array(
     'Symfony\\Component\\HttpKernel\\EventListener\\ProfilerListener' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/ProfilerListener.php',
     'Symfony\\Component\\HttpKernel\\EventListener\\ResponseListener' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/ResponseListener.php',
     'Symfony\\Component\\HttpKernel\\EventListener\\RouterListener' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/RouterListener.php',
+    'Symfony\\Component\\HttpKernel\\EventListener\\SaveSessionListener' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/SaveSessionListener.php',
     'Symfony\\Component\\HttpKernel\\EventListener\\StreamedResponseListener' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/StreamedResponseListener.php',
     'Symfony\\Component\\HttpKernel\\Event\\FilterControllerEvent' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Event/FilterControllerEvent.php',
     'Symfony\\Component\\HttpKernel\\Event\\FilterResponseEvent' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Event/FilterResponseEvent.php',
@@ -387,8 +389,6 @@ return array(
     'Symfony\\Component\\HttpKernel\\Exception\\AccessDeniedHttpException' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/AccessDeniedHttpException.php',
     'Symfony\\Component\\HttpKernel\\Exception\\BadRequestHttpException' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/BadRequestHttpException.php',
     'Symfony\\Component\\HttpKernel\\Exception\\ConflictHttpException' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/ConflictHttpException.php',
-    'Symfony\\Component\\HttpKernel\\Exception\\FatalErrorException' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/FatalErrorException.php',
-    'Symfony\\Component\\HttpKernel\\Exception\\FlattenException' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/FlattenException.php',
     'Symfony\\Component\\HttpKernel\\Exception\\GoneHttpException' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/GoneHttpException.php',
     'Symfony\\Component\\HttpKernel\\Exception\\HttpException' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/HttpException.php',
     'Symfony\\Component\\HttpKernel\\Exception\\HttpExceptionInterface' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/HttpExceptionInterface.php',
@@ -438,6 +438,8 @@ return array(
     'Symfony\\Component\\HttpKernel\\Tests\\Fixtures\\ExtensionAbsentBundle\\ExtensionAbsentBundle' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionAbsentBundle/ExtensionAbsentBundle.php',
     'Symfony\\Component\\HttpKernel\\Tests\\Fixtures\\ExtensionLoadedBundle\\DependencyInjection\\ExtensionLoadedExtension' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionLoadedBundle/DependencyInjection/ExtensionLoadedExtension.php',
     'Symfony\\Component\\HttpKernel\\Tests\\Fixtures\\ExtensionLoadedBundle\\ExtensionLoadedBundle' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionLoadedBundle/ExtensionLoadedBundle.php',
+    'Symfony\\Component\\HttpKernel\\Tests\\Fixtures\\ExtensionNotValidBundle\\DependencyInjection\\ExtensionNotValidExtension' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionNotValidBundle/DependencyInjection/ExtensionNotValidExtension.php',
+    'Symfony\\Component\\HttpKernel\\Tests\\Fixtures\\ExtensionNotValidBundle\\ExtensionNotValidBundle' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionNotValidBundle/ExtensionNotValidBundle.php',
     'Symfony\\Component\\HttpKernel\\Tests\\Fixtures\\ExtensionPresentBundle\\Command\\BarCommand' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/Command/BarCommand.php',
     'Symfony\\Component\\HttpKernel\\Tests\\Fixtures\\ExtensionPresentBundle\\Command\\FooCommand' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/Command/FooCommand.php',
     'Symfony\\Component\\HttpKernel\\Tests\\Fixtures\\ExtensionPresentBundle\\DependencyInjection\\ExtensionPresentExtension' => $vendorDir . '/symfony/http-kernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/DependencyInjection/ExtensionPresentExtension.php',
@@ -502,6 +504,7 @@ return array(
     'Symfony\\Component\\Routing\\Tests\\Fixtures\\AnnotatedClasses\\BarClass' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/BarClass.php',
     'Symfony\\Component\\Routing\\Tests\\Fixtures\\AnnotatedClasses\\FooClass' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/FooClass.php',
     'Symfony\\Component\\Routing\\Tests\\Fixtures\\CustomXmlFileLoader' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/CustomXmlFileLoader.php',
+    'Symfony\\Component\\Routing\\Tests\\Fixtures\\OtherAnnotatedClasses\\VariadicClass' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/OtherAnnotatedClasses/VariadicClass.php',
     'Symfony\\Component\\Routing\\Tests\\Fixtures\\RedirectableUrlMatcher' => $vendorDir . '/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/RedirectableUrlMatcher.php',
     'Symfony\\Component\\Yaml\\Dumper' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Dumper.php',
     'Symfony\\Component\\Yaml\\Escaper' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Escaper.php',
--- a/vendor/composer/autoload_real.php
+++ b/vendor/composer/autoload_real.php
@@ -2,7 +2,7 @@
 
 // autoload_real.php @generated by Composer
 
-class ComposerAutoloaderInit814f006b1edecd862adaa89c194918bc
+class ComposerAutoloaderInitf856c46a38122313790aa31708d122a3
 {
     private static $loader;
 
@@ -19,9 +19,9 @@ class ComposerAutoloaderInit814f006b1edecd862adaa89c194918bc
             return self::$loader;
         }
 
-        spl_autoload_register(array('ComposerAutoloaderInit814f006b1edecd862adaa89c194918bc', 'loadClassLoader'), true, true);
+        spl_autoload_register(array('ComposerAutoloaderInitf856c46a38122313790aa31708d122a3', 'loadClassLoader'), true, true);
         self::$loader = $loader = new \Composer\Autoload\ClassLoader();
-        spl_autoload_unregister(array('ComposerAutoloaderInit814f006b1edecd862adaa89c194918bc', 'loadClassLoader'));
+        spl_autoload_unregister(array('ComposerAutoloaderInitf856c46a38122313790aa31708d122a3', 'loadClassLoader'));
 
         $map = require __DIR__ . '/autoload_namespaces.php';
         foreach ($map as $namespace => $path) {
@@ -44,7 +44,7 @@ class ComposerAutoloaderInit814f006b1edecd862adaa89c194918bc
     }
 }
 
-function composerRequire814f006b1edecd862adaa89c194918bc($file)
+function composerRequiref856c46a38122313790aa31708d122a3($file)
 {
     require $file;
 }
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -66,24 +66,24 @@
     },
     {
         "name": "symfony/filesystem",
-        "version": "v2.3.21",
-        "version_normalized": "2.3.21.0",
+        "version": "v2.3.35",
+        "version_normalized": "2.3.35.0",
         "target-dir": "Symfony/Component/Filesystem",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/Filesystem.git",
-            "reference": "1c3a5fab445d1d4a5d57f8fbf1379696c9785942"
+            "url": "https://github.com/symfony/filesystem.git",
+            "reference": "d72d4b276921c2388ac09a5a6716e10d57a6e89b"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/Filesystem/zipball/1c3a5fab445d1d4a5d57f8fbf1379696c9785942",
-            "reference": "1c3a5fab445d1d4a5d57f8fbf1379696c9785942",
+            "url": "https://api.github.com/repos/symfony/filesystem/zipball/d72d4b276921c2388ac09a5a6716e10d57a6e89b",
+            "reference": "d72d4b276921c2388ac09a5a6716e10d57a6e89b",
             "shasum": ""
         },
         "require": {
             "php": ">=5.3.3"
         },
-        "time": "2014-09-22 08:32:35",
+        "time": "2015-11-18 08:19:46",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -94,7 +94,10 @@
         "autoload": {
             "psr-0": {
                 "Symfony\\Component\\Filesystem\\": ""
-            }
+            },
+            "exclude-from-classmap": [
+                "/Tests/"
+            ]
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
@@ -102,38 +105,38 @@
         ],
         "authors": [
             {
-                "name": "Symfony Community",
-                "homepage": "http://symfony.com/contributors"
-            },
-            {
                 "name": "Fabien Potencier",
                 "email": "fabien@symfony.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
             }
         ],
         "description": "Symfony Filesystem Component",
-        "homepage": "http://symfony.com"
+        "homepage": "https://symfony.com"
     },
     {
         "name": "symfony/config",
-        "version": "v2.3.21",
-        "version_normalized": "2.3.21.0",
+        "version": "v2.3.35",
+        "version_normalized": "2.3.35.0",
         "target-dir": "Symfony/Component/Config",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/Config.git",
-            "reference": "f9fac999dbc2c6aabd749c034d938b5f9aa5fb7d"
+            "url": "https://github.com/symfony/config.git",
+            "reference": "665b906c22103bb36eaeff31cc3063b53ed4eae5"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/Config/zipball/f9fac999dbc2c6aabd749c034d938b5f9aa5fb7d",
-            "reference": "f9fac999dbc2c6aabd749c034d938b5f9aa5fb7d",
+            "url": "https://api.github.com/repos/symfony/config/zipball/665b906c22103bb36eaeff31cc3063b53ed4eae5",
+            "reference": "665b906c22103bb36eaeff31cc3063b53ed4eae5",
             "shasum": ""
         },
         "require": {
             "php": ">=5.3.3",
             "symfony/filesystem": "~2.3"
         },
-        "time": "2014-09-23 05:15:05",
+        "time": "2015-11-18 08:19:46",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -144,7 +147,10 @@
         "autoload": {
             "psr-0": {
                 "Symfony\\Component\\Config\\": ""
-            }
+            },
+            "exclude-from-classmap": [
+                "/Tests/"
+            ]
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
@@ -152,31 +158,31 @@
         ],
         "authors": [
             {
-                "name": "Symfony Community",
-                "homepage": "http://symfony.com/contributors"
-            },
-            {
                 "name": "Fabien Potencier",
                 "email": "fabien@symfony.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
             }
         ],
         "description": "Symfony Config Component",
-        "homepage": "http://symfony.com"
+        "homepage": "https://symfony.com"
     },
     {
         "name": "symfony/console",
-        "version": "v2.3.21",
-        "version_normalized": "2.3.21.0",
+        "version": "v2.3.35",
+        "version_normalized": "2.3.35.0",
         "target-dir": "Symfony/Component/Console",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/Console.git",
-            "reference": "aa12ac573c583a74c2cb26ad9be478e119f04ad1"
+            "url": "https://github.com/symfony/console.git",
+            "reference": "ed9c6cad324afb02672fa8ebf55fe0feb1659067"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/Console/zipball/aa12ac573c583a74c2cb26ad9be478e119f04ad1",
-            "reference": "aa12ac573c583a74c2cb26ad9be478e119f04ad1",
+            "url": "https://api.github.com/repos/symfony/console/zipball/ed9c6cad324afb02672fa8ebf55fe0feb1659067",
+            "reference": "ed9c6cad324afb02672fa8ebf55fe0feb1659067",
             "shasum": ""
         },
         "require": {
@@ -188,7 +194,7 @@
         "suggest": {
             "symfony/event-dispatcher": ""
         },
-        "time": "2014-10-05 13:45:10",
+        "time": "2015-11-18 08:19:46",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -199,7 +205,10 @@
         "autoload": {
             "psr-0": {
                 "Symfony\\Component\\Console\\": ""
-            }
+            },
+            "exclude-from-classmap": [
+                "/Tests/"
+            ]
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
@@ -207,31 +216,31 @@
         ],
         "authors": [
             {
-                "name": "Symfony Community",
-                "homepage": "http://symfony.com/contributors"
-            },
-            {
                 "name": "Fabien Potencier",
                 "email": "fabien@symfony.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
             }
         ],
         "description": "Symfony Console Component",
-        "homepage": "http://symfony.com"
+        "homepage": "https://symfony.com"
     },
     {
         "name": "symfony/dependency-injection",
-        "version": "v2.3.21",
-        "version_normalized": "2.3.21.0",
+        "version": "v2.3.35",
+        "version_normalized": "2.3.35.0",
         "target-dir": "Symfony/Component/DependencyInjection",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/DependencyInjection.git",
-            "reference": "e2324e1c8c39faa5f27e6170b278d7f631574141"
+            "url": "https://github.com/symfony/dependency-injection.git",
+            "reference": "d3c6bcab8f626c32e687f8b77d683f8a9f1f4be3"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/DependencyInjection/zipball/e2324e1c8c39faa5f27e6170b278d7f631574141",
-            "reference": "e2324e1c8c39faa5f27e6170b278d7f631574141",
+            "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/d3c6bcab8f626c32e687f8b77d683f8a9f1f4be3",
+            "reference": "d3c6bcab8f626c32e687f8b77d683f8a9f1f4be3",
             "shasum": ""
         },
         "require": {
@@ -239,14 +248,14 @@
         },
         "require-dev": {
             "symfony/config": "~2.2",
-            "symfony/yaml": "~2.0"
+            "symfony/yaml": "~2.1"
         },
         "suggest": {
             "symfony/config": "",
             "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them",
             "symfony/yaml": ""
         },
-        "time": "2014-10-01 05:38:33",
+        "time": "2015-11-19 14:08:33",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -257,7 +266,10 @@
         "autoload": {
             "psr-0": {
                 "Symfony\\Component\\DependencyInjection\\": ""
-            }
+            },
+            "exclude-from-classmap": [
+                "/Tests/"
+            ]
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
@@ -265,37 +277,37 @@
         ],
         "authors": [
             {
-                "name": "Symfony Community",
-                "homepage": "http://symfony.com/contributors"
-            },
-            {
                 "name": "Fabien Potencier",
                 "email": "fabien@symfony.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
             }
         ],
         "description": "Symfony DependencyInjection Component",
-        "homepage": "http://symfony.com"
+        "homepage": "https://symfony.com"
     },
     {
         "name": "symfony/http-foundation",
-        "version": "v2.3.21",
-        "version_normalized": "2.3.21.0",
+        "version": "v2.3.35",
+        "version_normalized": "2.3.35.0",
         "target-dir": "Symfony/Component/HttpFoundation",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/HttpFoundation.git",
-            "reference": "30c90f08f948dd43e7310beae7a85c02ad2b655d"
+            "url": "https://github.com/symfony/http-foundation.git",
+            "reference": "2242d5d7b12ee2291bbaac161d94ea312a9c0d1f"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/30c90f08f948dd43e7310beae7a85c02ad2b655d",
-            "reference": "30c90f08f948dd43e7310beae7a85c02ad2b655d",
+            "url": "https://api.github.com/repos/symfony/http-foundation/zipball/2242d5d7b12ee2291bbaac161d94ea312a9c0d1f",
+            "reference": "2242d5d7b12ee2291bbaac161d94ea312a9c0d1f",
             "shasum": ""
         },
         "require": {
             "php": ">=5.3.3"
         },
-        "time": "2014-10-23 13:11:04",
+        "time": "2015-11-19 16:24:57",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -309,6 +321,9 @@
             },
             "classmap": [
                 "Symfony/Component/HttpFoundation/Resources/stubs"
+            ],
+            "exclude-from-classmap": [
+                "/Tests/"
             ]
         },
         "notification-url": "https://packagist.org/downloads/",
@@ -317,44 +332,44 @@
         ],
         "authors": [
             {
-                "name": "Symfony Community",
-                "homepage": "http://symfony.com/contributors"
-            },
-            {
                 "name": "Fabien Potencier",
                 "email": "fabien@symfony.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
             }
         ],
         "description": "Symfony HttpFoundation Component",
-        "homepage": "http://symfony.com"
+        "homepage": "https://symfony.com"
     },
     {
         "name": "symfony/event-dispatcher",
-        "version": "v2.3.21",
-        "version_normalized": "2.3.21.0",
+        "version": "v2.3.35",
+        "version_normalized": "2.3.35.0",
         "target-dir": "Symfony/Component/EventDispatcher",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/EventDispatcher.git",
-            "reference": "3e0b837811fadd73c833c7c06a92201d953df59d"
+            "url": "https://github.com/symfony/event-dispatcher.git",
+            "reference": "08564581a8444035d0874efc35a6366be8c0af9e"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/3e0b837811fadd73c833c7c06a92201d953df59d",
-            "reference": "3e0b837811fadd73c833c7c06a92201d953df59d",
+            "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/08564581a8444035d0874efc35a6366be8c0af9e",
+            "reference": "08564581a8444035d0874efc35a6366be8c0af9e",
             "shasum": ""
         },
         "require": {
             "php": ">=5.3.3"
         },
         "require-dev": {
-            "symfony/dependency-injection": "~2.0"
+            "symfony/dependency-injection": "~2.0,>=2.0.5"
         },
         "suggest": {
             "symfony/dependency-injection": "",
             "symfony/http-kernel": ""
         },
-        "time": "2014-10-01 05:39:06",
+        "time": "2015-11-18 08:19:46",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -365,7 +380,10 @@
         "autoload": {
             "psr-0": {
                 "Symfony\\Component\\EventDispatcher\\": ""
-            }
+            },
+            "exclude-from-classmap": [
+                "/Tests/"
+            ]
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
@@ -373,46 +391,49 @@
         ],
         "authors": [
             {
-                "name": "Symfony Community",
-                "homepage": "http://symfony.com/contributors"
-            },
-            {
                 "name": "Fabien Potencier",
                 "email": "fabien@symfony.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
             }
         ],
         "description": "Symfony EventDispatcher Component",
-        "homepage": "http://symfony.com"
+        "homepage": "https://symfony.com"
     },
     {
         "name": "symfony/debug",
-        "version": "v2.3.21",
-        "version_normalized": "2.3.21.0",
+        "version": "v2.3.35",
+        "version_normalized": "2.3.35.0",
         "target-dir": "Symfony/Component/Debug",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/Debug.git",
-            "reference": "883f847ad179e92549a8cea372b08e5ef47ffe40"
+            "url": "https://github.com/symfony/debug.git",
+            "reference": "c0f543d3c40f5b885a68bc87ef1f2f8aec8e0424"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/Debug/zipball/883f847ad179e92549a8cea372b08e5ef47ffe40",
-            "reference": "883f847ad179e92549a8cea372b08e5ef47ffe40",
+            "url": "https://api.github.com/repos/symfony/debug/zipball/c0f543d3c40f5b885a68bc87ef1f2f8aec8e0424",
+            "reference": "c0f543d3c40f5b885a68bc87ef1f2f8aec8e0424",
             "shasum": ""
         },
         "require": {
             "php": ">=5.3.3"
         },
+        "conflict": {
+            "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
+        },
         "require-dev": {
             "symfony/http-foundation": "~2.1",
-            "symfony/http-kernel": "~2.1"
+            "symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2"
         },
         "suggest": {
             "symfony/class-loader": "",
             "symfony/http-foundation": "",
             "symfony/http-kernel": ""
         },
-        "time": "2014-10-09 16:42:17",
+        "time": "2015-11-18 08:19:46",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -423,7 +444,10 @@
         "autoload": {
             "psr-0": {
                 "Symfony\\Component\\Debug\\": ""
-            }
+            },
+            "exclude-from-classmap": [
+                "/Tests/"
+            ]
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
@@ -431,16 +455,16 @@
         ],
         "authors": [
             {
-                "name": "Symfony Community",
-                "homepage": "http://symfony.com/contributors"
-            },
-            {
                 "name": "Fabien Potencier",
                 "email": "fabien@symfony.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
             }
         ],
         "description": "Symfony Debug Component",
-        "homepage": "http://symfony.com"
+        "homepage": "https://symfony.com"
     },
     {
         "name": "psr/log",
@@ -484,37 +508,39 @@
     },
     {
         "name": "symfony/http-kernel",
-        "version": "v2.3.21",
-        "version_normalized": "2.3.21.0",
+        "version": "v2.3.35",
+        "version_normalized": "2.3.35.0",
         "target-dir": "Symfony/Component/HttpKernel",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/HttpKernel.git",
-            "reference": "0154ff659004d4148e8da0f2bdb672efe55e6ee5"
+            "url": "https://github.com/symfony/http-kernel.git",
+            "reference": "a79bd3b40c73fd504d1e66ab6c40cdede509c600"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/0154ff659004d4148e8da0f2bdb672efe55e6ee5",
-            "reference": "0154ff659004d4148e8da0f2bdb672efe55e6ee5",
+            "url": "https://api.github.com/repos/symfony/http-kernel/zipball/a79bd3b40c73fd504d1e66ab6c40cdede509c600",
+            "reference": "a79bd3b40c73fd504d1e66ab6c40cdede509c600",
             "shasum": ""
         },
         "require": {
             "php": ">=5.3.3",
             "psr/log": "~1.0",
-            "symfony/debug": "~2.3",
+            "symfony/debug": "~2.3.24|~2.5.9|~2.6,>=2.6.2",
             "symfony/event-dispatcher": "~2.1",
-            "symfony/http-foundation": "~2.2"
+            "symfony/http-foundation": "~2.3,>=2.3.4"
         },
         "require-dev": {
-            "symfony/browser-kit": "~2.2",
+            "symfony/browser-kit": "~2.3",
             "symfony/class-loader": "~2.1",
-            "symfony/config": "~2.0",
+            "symfony/config": "~2.0,>=2.0.5",
             "symfony/console": "~2.2",
-            "symfony/dependency-injection": "~2.0",
-            "symfony/finder": "~2.0",
-            "symfony/process": "~2.0",
+            "symfony/css-selector": "~2.0,>=2.0.5",
+            "symfony/dependency-injection": "~2.2",
+            "symfony/dom-crawler": "~2.0,>=2.0.5",
+            "symfony/finder": "~2.0,>=2.0.5",
+            "symfony/process": "~2.0,>=2.0.5",
             "symfony/routing": "~2.2",
-            "symfony/stopwatch": "~2.2",
+            "symfony/stopwatch": "~2.3",
             "symfony/templating": "~2.2"
         },
         "suggest": {
@@ -525,7 +551,7 @@
             "symfony/dependency-injection": "",
             "symfony/finder": ""
         },
-        "time": "2014-10-24 05:54:08",
+        "time": "2015-11-23 10:44:06",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -536,7 +562,10 @@
         "autoload": {
             "psr-0": {
                 "Symfony\\Component\\HttpKernel\\": ""
-            }
+            },
+            "exclude-from-classmap": [
+                "/Tests/"
+            ]
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
@@ -544,31 +573,31 @@
         ],
         "authors": [
             {
-                "name": "Symfony Community",
-                "homepage": "http://symfony.com/contributors"
-            },
-            {
                 "name": "Fabien Potencier",
                 "email": "fabien@symfony.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
             }
         ],
         "description": "Symfony HttpKernel Component",
-        "homepage": "http://symfony.com"
+        "homepage": "https://symfony.com"
     },
     {
         "name": "symfony/routing",
-        "version": "v2.3.21",
-        "version_normalized": "2.3.21.0",
+        "version": "v2.3.35",
+        "version_normalized": "2.3.35.0",
         "target-dir": "Symfony/Component/Routing",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/Routing.git",
-            "reference": "f7f8ebf9c99e5ebfdb908c3558a818c2883eab1f"
+            "url": "https://github.com/symfony/routing.git",
+            "reference": "08a4065c47b45a1785101aabb29082fe415cec6c"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/Routing/zipball/f7f8ebf9c99e5ebfdb908c3558a818c2883eab1f",
-            "reference": "f7f8ebf9c99e5ebfdb908c3558a818c2883eab1f",
+            "url": "https://api.github.com/repos/symfony/routing/zipball/08a4065c47b45a1785101aabb29082fe415cec6c",
+            "reference": "08a4065c47b45a1785101aabb29082fe415cec6c",
             "shasum": ""
         },
         "require": {
@@ -579,14 +608,14 @@
             "psr/log": "~1.0",
             "symfony/config": "~2.2",
             "symfony/http-foundation": "~2.3",
-            "symfony/yaml": "~2.0"
+            "symfony/yaml": "~2.0,>=2.0.5"
         },
         "suggest": {
             "doctrine/common": "",
             "symfony/config": "",
             "symfony/yaml": ""
         },
-        "time": "2014-10-13 12:38:27",
+        "time": "2015-11-18 08:19:46",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -597,7 +626,10 @@
         "autoload": {
             "psr-0": {
                 "Symfony\\Component\\Routing\\": ""
-            }
+            },
+            "exclude-from-classmap": [
+                "/Tests/"
+            ]
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
@@ -605,37 +637,37 @@
         ],
         "authors": [
             {
-                "name": "Symfony Community",
-                "homepage": "http://symfony.com/contributors"
-            },
-            {
                 "name": "Fabien Potencier",
                 "email": "fabien@symfony.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
             }
         ],
         "description": "Symfony Routing Component",
-        "homepage": "http://symfony.com"
+        "homepage": "https://symfony.com"
     },
     {
         "name": "symfony/yaml",
-        "version": "v2.3.21",
-        "version_normalized": "2.3.21.0",
+        "version": "v2.3.35",
+        "version_normalized": "2.3.35.0",
         "target-dir": "Symfony/Component/Yaml",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/Yaml.git",
-            "reference": "34687c6236f1dfcebc874fbebd8da74d90f9f64f"
+            "url": "https://github.com/symfony/yaml.git",
+            "reference": "6d7a3b7cfdd5095e5f4318ad4c2ed20c71c74764"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/Yaml/zipball/34687c6236f1dfcebc874fbebd8da74d90f9f64f",
-            "reference": "34687c6236f1dfcebc874fbebd8da74d90f9f64f",
+            "url": "https://api.github.com/repos/symfony/yaml/zipball/6d7a3b7cfdd5095e5f4318ad4c2ed20c71c74764",
+            "reference": "6d7a3b7cfdd5095e5f4318ad4c2ed20c71c74764",
             "shasum": ""
         },
         "require": {
             "php": ">=5.3.3"
         },
-        "time": "2014-10-01 05:38:33",
+        "time": "2015-11-18 08:19:46",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -646,7 +678,10 @@
         "autoload": {
             "psr-0": {
                 "Symfony\\Component\\Yaml\\": ""
-            }
+            },
+            "exclude-from-classmap": [
+                "/Tests/"
+            ]
         },
         "notification-url": "https://packagist.org/downloads/",
         "license": [
@@ -654,16 +689,16 @@
         ],
         "authors": [
             {
-                "name": "Symfony Community",
-                "homepage": "http://symfony.com/contributors"
-            },
-            {
                 "name": "Fabien Potencier",
                 "email": "fabien@symfony.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
             }
         ],
         "description": "Symfony Yaml Component",
-        "homepage": "http://symfony.com"
+        "homepage": "https://symfony.com"
     },
     {
         "name": "twig/twig",
--- a/vendor/symfony/config/Symfony/Component/Config/ConfigCache.php
+++ b/vendor/symfony/config/Symfony/Component/Config/ConfigCache.php
@@ -31,8 +31,8 @@ class ConfigCache
     /**
      * Constructor.
      *
-     * @param string  $file  The absolute cache path
-     * @param bool    $debug Whether debugging is enabled or not
+     * @param string $file  The absolute cache path
+     * @param bool   $debug Whether debugging is enabled or not
      */
     public function __construct($file, $debug)
     {
@@ -56,7 +56,7 @@ class ConfigCache
      * This method always returns true when debug is off and the
      * cache file exists.
      *
-     * @return bool    true if the cache is fresh, false otherwise
+     * @return bool true if the cache is fresh, false otherwise
      */
     public function isFresh()
     {
@@ -90,7 +90,7 @@ class ConfigCache
      * @param string              $content  The content to write in the cache
      * @param ResourceInterface[] $metadata An array of ResourceInterface instances
      *
-     * @throws \RuntimeException When cache file can't be wrote
+     * @throws \RuntimeException When cache file can't be written
      */
     public function write($content, array $metadata = null)
     {
--- a/vendor/symfony/config/Symfony/Component/Config/Definition/ArrayNode.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Definition/ArrayNode.php
@@ -109,7 +109,7 @@ class ArrayNode extends BaseNode implements PrototypeNodeInterface
      * Sets whether to add default values for this array if it has not been
      * defined in any of the configuration files.
      *
-     * @param bool    $boolean
+     * @param bool $boolean
      */
     public function setAddIfNotSet($boolean)
     {
@@ -119,7 +119,7 @@ class ArrayNode extends BaseNode implements PrototypeNodeInterface
     /**
      * Sets whether false is allowed as value indicating that the array should be unset.
      *
-     * @param bool    $allow
+     * @param bool $allow
      */
     public function setAllowFalse($allow)
     {
@@ -129,7 +129,7 @@ class ArrayNode extends BaseNode implements PrototypeNodeInterface
     /**
      * Sets whether new keys can be defined in subsequent configurations.
      *
-     * @param bool    $allow
+     * @param bool $allow
      */
     public function setAllowNewKeys($allow)
     {
@@ -139,7 +139,7 @@ class ArrayNode extends BaseNode implements PrototypeNodeInterface
     /**
      * Sets if deep merging should occur.
      *
-     * @param bool    $boolean
+     * @param bool $boolean
      */
     public function setPerformDeepMerging($boolean)
     {
@@ -149,7 +149,7 @@ class ArrayNode extends BaseNode implements PrototypeNodeInterface
     /**
      * Whether extra keys should just be ignore without an exception.
      *
-     * @param bool    $boolean To allow extra keys
+     * @param bool $boolean To allow extra keys
      */
     public function setIgnoreExtraKeys($boolean)
     {
@@ -256,7 +256,7 @@ class ArrayNode extends BaseNode implements PrototypeNodeInterface
 
             try {
                 $value[$name] = $child->finalize($value[$name]);
-            } catch (UnsetKeyException $unset) {
+            } catch (UnsetKeyException $e) {
                 unset($value[$name]);
             }
         }
@@ -312,7 +312,7 @@ class ArrayNode extends BaseNode implements PrototypeNodeInterface
 
         // if extra fields are present, throw exception
         if (count($value) && !$this->ignoreExtraKeys) {
-            $msg = sprintf('Unrecognized options "%s" under "%s"', implode(', ', array_keys($value)), $this->getPath());
+            $msg = sprintf('Unrecognized option%s "%s" under "%s"', 1 === count($value) ? '' : 's', implode(', ', array_keys($value)), $this->getPath());
             $ex = new InvalidConfigurationException($msg);
             $ex->setPath($this->getPath());
 
--- a/vendor/symfony/config/Symfony/Component/Config/Definition/BaseNode.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Definition/BaseNode.php
@@ -14,9 +14,10 @@ namespace Symfony\Component\Config\Definition;
 use Symfony\Component\Config\Definition\Exception\Exception;
 use Symfony\Component\Config\Definition\Exception\ForbiddenOverwriteException;
 use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
+use Symfony\Component\Config\Definition\Exception\InvalidTypeException;
 
 /**
- * The base node class
+ * The base node class.
  *
  * @author Johannes M. Schmitt <schmittjoh@gmail.com>
  */
@@ -138,7 +139,7 @@ abstract class BaseNode implements NodeInterface
     /**
      * Set this node as required.
      *
-     * @param bool    $boolean Required node
+     * @param bool $boolean Required node
      */
     public function setRequired($boolean)
     {
@@ -148,7 +149,7 @@ abstract class BaseNode implements NodeInterface
     /**
      * Sets if this node can be overridden.
      *
-     * @param bool    $allow
+     * @param bool $allow
      */
     public function setAllowOverwrite($allow)
     {
@@ -186,7 +187,7 @@ abstract class BaseNode implements NodeInterface
     }
 
     /**
-     * Returns the name of this node
+     * Returns the name of this node.
      *
      * @return string The Node's name.
      */
@@ -301,14 +302,10 @@ abstract class BaseNode implements NodeInterface
         foreach ($this->finalValidationClosures as $closure) {
             try {
                 $value = $closure($value);
-            } catch (Exception $correctEx) {
-                throw $correctEx;
-            } catch (\Exception $invalid) {
-                throw new InvalidConfigurationException(sprintf(
-                    'Invalid configuration for path "%s": %s',
-                    $this->getPath(),
-                    $invalid->getMessage()
-                ), $invalid->getCode(), $invalid);
+            } catch (Exception $e) {
+                throw $e;
+            } catch (\Exception $e) {
+                throw new InvalidConfigurationException(sprintf('Invalid configuration for path "%s": %s', $this->getPath(), $e->getMessage()), $e->getCode(), $e);
             }
         }
 
--- a/vendor/symfony/config/Symfony/Component/Config/Definition/BooleanNode.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Definition/BooleanNode.php
@@ -36,4 +36,13 @@ class BooleanNode extends ScalarNode
             throw $ex;
         }
     }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function isValueEmpty($value)
+    {
+        // a boolean value cannot be empty
+        return false;
+    }
 }
--- a/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/ArrayNodeDefinition.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/ArrayNodeDefinition.php
@@ -105,7 +105,7 @@ class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinition
     /**
      * Adds children with a default value when none are defined.
      *
-     * @param int|string|array|null     $children The number of children|The child name|The children names to be added
+     * @param int|string|array|null $children The number of children|The child name|The children names to be added
      *
      * This method is applicable to prototype nodes only.
      *
@@ -184,8 +184,8 @@ class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinition
      *
      * This method is applicable to prototype nodes only.
      *
-     * @param string  $name          The name of the key
-     * @param bool    $removeKeyItem Whether or not the key item should be removed.
+     * @param string $name          The name of the key
+     * @param bool   $removeKeyItem Whether or not the key item should be removed.
      *
      * @return ArrayNodeDefinition
      */
@@ -200,7 +200,7 @@ class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinition
     /**
      * Sets whether the node can be unset.
      *
-     * @param bool    $allow
+     * @param bool $allow
      *
      * @return ArrayNodeDefinition
      */
@@ -287,9 +287,10 @@ class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinition
      * Allows extra config keys to be specified under an array without
      * throwing an exception.
      *
-     * Those config values are simply ignored. This should be used only
-     * in special cases where you want to send an entire configuration
-     * array through a special tree that processes only part of the array.
+     * Those config values are simply ignored and removed from the
+     * resulting array. This should be used only in special cases where
+     * you want to send an entire configuration array through a special
+     * tree that processes only part of the array.
      *
      * @return ArrayNodeDefinition
      */
@@ -303,7 +304,7 @@ class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinition
     /**
      * Sets key normalization.
      *
-     * @param bool    $bool Whether to enable key normalization
+     * @param bool $bool Whether to enable key normalization
      *
      * @return ArrayNodeDefinition
      */
@@ -337,7 +338,7 @@ class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinition
     }
 
     /**
-     * Returns a node builder to be used to add children and prototype
+     * Returns a node builder to be used to add children and prototype.
      *
      * @return NodeBuilder The node builder
      */
@@ -480,7 +481,7 @@ class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinition
                 );
             }
 
-            if (null !== $this->key && (null === $this->addDefaultChildren || is_integer($this->addDefaultChildren) && $this->addDefaultChildren > 0)) {
+            if (null !== $this->key && (null === $this->addDefaultChildren || is_int($this->addDefaultChildren) && $this->addDefaultChildren > 0)) {
                 throw new InvalidDefinitionException(
                     sprintf('->addDefaultChildrenIfNoneSet() should set default children names as ->useAttributeAsKey() is used at path "%s"', $path)
                 );
--- a/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/BooleanNodeDefinition.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/BooleanNodeDefinition.php
@@ -31,7 +31,7 @@ class BooleanNodeDefinition extends ScalarNodeDefinition
     }
 
     /**
-     * Instantiate a Node
+     * Instantiate a Node.
      *
      * @return BooleanNode The node
      */
--- a/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/EnumNodeDefinition.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/EnumNodeDefinition.php
@@ -22,6 +22,11 @@ class EnumNodeDefinition extends ScalarNodeDefinition
 {
     private $values;
 
+    /**
+     * @param array $values
+     *
+     * @return EnumNodeDefinition|$this
+     */
     public function values(array $values)
     {
         $values = array_unique($values);
@@ -36,7 +41,7 @@ class EnumNodeDefinition extends ScalarNodeDefinition
     }
 
     /**
-     * Instantiate a Node
+     * Instantiate a Node.
      *
      * @return EnumNode The node
      *
--- a/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/ExprBuilder.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/ExprBuilder.php
@@ -26,7 +26,7 @@ class ExprBuilder
     public $thenPart;
 
     /**
-     * Constructor
+     * Constructor.
      *
      * @param NodeDefinition $node The related node
      */
@@ -196,7 +196,7 @@ class ExprBuilder
     }
 
     /**
-     * Returns the related node
+     * Returns the related node.
      *
      * @return NodeDefinition
      *
@@ -224,9 +224,11 @@ class ExprBuilder
     public static function buildExpressions(array $expressions)
     {
         foreach ($expressions as $k => $expr) {
-            if ($expr instanceof ExprBuilder) {
-                $expressions[$k] = function ($v) use ($expr) {
-                    return call_user_func($expr->ifPart, $v) ? call_user_func($expr->thenPart, $v) : $v;
+            if ($expr instanceof self) {
+                $if = $expr->ifPart;
+                $then = $expr->thenPart;
+                $expressions[$k] = function ($v) use ($if, $then) {
+                    return $if($v) ? $then($v) : $v;
                 };
             }
         }
--- a/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/MergeBuilder.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/MergeBuilder.php
@@ -23,7 +23,7 @@ class MergeBuilder
     public $allowOverwrite;
 
     /**
-     * Constructor
+     * Constructor.
      *
      * @param NodeDefinition $node The related node
      */
@@ -37,7 +37,7 @@ class MergeBuilder
     /**
      * Sets whether the node can be unset.
      *
-     * @param bool    $allow
+     * @param bool $allow
      *
      * @return MergeBuilder
      */
@@ -51,7 +51,7 @@ class MergeBuilder
     /**
      * Sets whether the node can be overwritten.
      *
-     * @param bool    $deny Whether the overwriting is forbidden or not
+     * @param bool $deny Whether the overwriting is forbidden or not
      *
      * @return MergeBuilder
      */
--- a/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/NodeBuilder.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/NodeBuilder.php
@@ -22,19 +22,18 @@ class NodeBuilder implements NodeParentInterface
     protected $nodeMapping;
 
     /**
-     * Constructor
-     *
+     * Constructor.
      */
     public function __construct()
     {
         $this->nodeMapping = array(
-            'variable'    => __NAMESPACE__.'\\VariableNodeDefinition',
-            'scalar'      => __NAMESPACE__.'\\ScalarNodeDefinition',
-            'boolean'     => __NAMESPACE__.'\\BooleanNodeDefinition',
-            'integer'     => __NAMESPACE__.'\\IntegerNodeDefinition',
-            'float'       => __NAMESPACE__.'\\FloatNodeDefinition',
-            'array'       => __NAMESPACE__.'\\ArrayNodeDefinition',
-            'enum'        => __NAMESPACE__.'\\EnumNodeDefinition',
+            'variable' => __NAMESPACE__.'\\VariableNodeDefinition',
+            'scalar' => __NAMESPACE__.'\\ScalarNodeDefinition',
+            'boolean' => __NAMESPACE__.'\\BooleanNodeDefinition',
+            'integer' => __NAMESPACE__.'\\IntegerNodeDefinition',
+            'float' => __NAMESPACE__.'\\FloatNodeDefinition',
+            'array' => __NAMESPACE__.'\\ArrayNodeDefinition',
+            'enum' => __NAMESPACE__.'\\EnumNodeDefinition',
         );
     }
 
--- a/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/NodeDefinition.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/NodeDefinition.php
@@ -39,7 +39,7 @@ abstract class NodeDefinition implements NodeParentInterface
     protected $attributes = array();
 
     /**
-     * Constructor
+     * Constructor.
      *
      * @param string              $name   The name of the node
      * @param NodeParentInterface $parent The parent
@@ -59,7 +59,7 @@ abstract class NodeDefinition implements NodeParentInterface
      *
      * @param NodeParentInterface $parent The parent
      *
-     * @return NodeDefinition
+     * @return NodeDefinition|$this
      */
     public function setParent(NodeParentInterface $parent)
     {
@@ -73,7 +73,7 @@ abstract class NodeDefinition implements NodeParentInterface
      *
      * @param string $info The info text
      *
-     * @return NodeDefinition
+     * @return NodeDefinition|$this
      */
     public function info($info)
     {
@@ -85,7 +85,7 @@ abstract class NodeDefinition implements NodeParentInterface
      *
      * @param string|array $example
      *
-     * @return NodeDefinition
+     * @return NodeDefinition|$this
      */
     public function example($example)
     {
@@ -96,9 +96,9 @@ abstract class NodeDefinition implements NodeParentInterface
      * Sets an attribute on the node.
      *
      * @param string $key
-     * @param mixed $value
+     * @param mixed  $value
      *
-     * @return NodeDefinition
+     * @return NodeDefinition|$this
      */
     public function attribute($key, $value)
     {
@@ -120,7 +120,7 @@ abstract class NodeDefinition implements NodeParentInterface
     /**
      * Creates the node.
      *
-     * @param bool    $forceRootNode Whether to force this node as the root node
+     * @param bool $forceRootNode Whether to force this node as the root node
      *
      * @return NodeInterface
      */
@@ -149,7 +149,7 @@ abstract class NodeDefinition implements NodeParentInterface
      *
      * @param mixed $value The default value
      *
-     * @return NodeDefinition
+     * @return NodeDefinition|$this
      */
     public function defaultValue($value)
     {
@@ -162,7 +162,7 @@ abstract class NodeDefinition implements NodeParentInterface
     /**
      * Sets the node as required.
      *
-     * @return NodeDefinition
+     * @return NodeDefinition|$this
      */
     public function isRequired()
     {
@@ -176,7 +176,7 @@ abstract class NodeDefinition implements NodeParentInterface
      *
      * @param mixed $value
      *
-     * @return NodeDefinition
+     * @return NodeDefinition|$this
      */
     public function treatNullLike($value)
     {
@@ -190,7 +190,7 @@ abstract class NodeDefinition implements NodeParentInterface
      *
      * @param mixed $value
      *
-     * @return NodeDefinition
+     * @return NodeDefinition|$this
      */
     public function treatTrueLike($value)
     {
@@ -204,7 +204,7 @@ abstract class NodeDefinition implements NodeParentInterface
      *
      * @param mixed $value
      *
-     * @return NodeDefinition
+     * @return NodeDefinition|$this
      */
     public function treatFalseLike($value)
     {
@@ -216,7 +216,7 @@ abstract class NodeDefinition implements NodeParentInterface
     /**
      * Sets null as the default value.
      *
-     * @return NodeDefinition
+     * @return NodeDefinition|$this
      */
     public function defaultNull()
     {
@@ -226,7 +226,7 @@ abstract class NodeDefinition implements NodeParentInterface
     /**
      * Sets true as the default value.
      *
-     * @return NodeDefinition
+     * @return NodeDefinition|$this
      */
     public function defaultTrue()
     {
@@ -236,7 +236,7 @@ abstract class NodeDefinition implements NodeParentInterface
     /**
      * Sets false as the default value.
      *
-     * @return NodeDefinition
+     * @return NodeDefinition|$this
      */
     public function defaultFalse()
     {
@@ -256,7 +256,7 @@ abstract class NodeDefinition implements NodeParentInterface
     /**
      * Denies the node value being empty.
      *
-     * @return NodeDefinition
+     * @return NodeDefinition|$this
      */
     public function cannotBeEmpty()
     {
@@ -282,9 +282,9 @@ abstract class NodeDefinition implements NodeParentInterface
     /**
      * Sets whether the node can be overwritten.
      *
-     * @param bool    $deny Whether the overwriting is forbidden or not
+     * @param bool $deny Whether the overwriting is forbidden or not
      *
-     * @return NodeDefinition
+     * @return NodeDefinition|$this
      */
     public function cannotBeOverwritten($deny = true)
     {
@@ -336,7 +336,7 @@ abstract class NodeDefinition implements NodeParentInterface
     }
 
     /**
-     * Instantiate and configure the node according to this definition
+     * Instantiate and configure the node according to this definition.
      *
      * @return NodeInterface $node The node instance
      *
--- a/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/NodeParentInterface.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/NodeParentInterface.php
@@ -12,7 +12,7 @@
 namespace Symfony\Component\Config\Definition\Builder;
 
 /**
- * An interface that must be implemented by all node parents
+ * An interface that must be implemented by all node parents.
  *
  * @author Victor Berchet <victor@suumit.com>
  */
--- a/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/NormalizationBuilder.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/NormalizationBuilder.php
@@ -23,7 +23,7 @@ class NormalizationBuilder
     public $remappings;
 
     /**
-     * Constructor
+     * Constructor.
      *
      * @param NodeDefinition $node The related node
      */
--- a/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/ParentNodeDefinitionInterface.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/ParentNodeDefinitionInterface.php
@@ -12,7 +12,7 @@
 namespace Symfony\Component\Config\Definition\Builder;
 
 /**
- * An interface that must be implemented by nodes which can have children
+ * An interface that must be implemented by nodes which can have children.
  *
  * @author Victor Berchet <victor@suumit.com>
  */
--- a/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/ScalarNodeDefinition.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/ScalarNodeDefinition.php
@@ -21,7 +21,7 @@ use Symfony\Component\Config\Definition\ScalarNode;
 class ScalarNodeDefinition extends VariableNodeDefinition
 {
     /**
-     * Instantiate a Node
+     * Instantiate a Node.
      *
      * @return ScalarNode The node
      */
--- a/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/ValidationBuilder.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/ValidationBuilder.php
@@ -22,7 +22,7 @@ class ValidationBuilder
     public $rules;
 
     /**
-     * Constructor
+     * Constructor.
      *
      * @param NodeDefinition $node The related node
      */
--- a/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/VariableNodeDefinition.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Definition/Builder/VariableNodeDefinition.php
@@ -21,7 +21,7 @@ use Symfony\Component\Config\Definition\VariableNode;
 class VariableNodeDefinition extends NodeDefinition
 {
     /**
-     * Instantiate a Node
+     * Instantiate a Node.
      *
      * @return VariableNode The node
      */
--- a/vendor/symfony/config/Symfony/Component/Config/Definition/ConfigurationInterface.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Definition/ConfigurationInterface.php
@@ -12,7 +12,7 @@
 namespace Symfony\Component\Config\Definition;
 
 /**
- * Configuration interface
+ * Configuration interface.
  *
  * @author Victor Berchet <victor@suumit.com>
  */
--- a/vendor/symfony/config/Symfony/Component/Config/Definition/Exception/Exception.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Definition/Exception/Exception.php
@@ -12,7 +12,7 @@
 namespace Symfony\Component\Config\Definition\Exception;
 
 /**
- * Base exception for all configuration exceptions
+ * Base exception for all configuration exceptions.
  *
  * @author Johannes M. Schmitt <schmittjoh@gmail.com>
  */
--- a/vendor/symfony/config/Symfony/Component/Config/Definition/NodeInterface.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Definition/NodeInterface.php
@@ -38,14 +38,14 @@ interface NodeInterface
     /**
      * Returns true when the node is required.
      *
-     * @return bool    If the node is required
+     * @return bool If the node is required
      */
     public function isRequired();
 
     /**
      * Returns true when the node has a default value.
      *
-     * @return bool    If the node has a default value
+     * @return bool If the node has a default value
      */
     public function hasDefaultValue();
 
@@ -53,6 +53,7 @@ interface NodeInterface
      * Returns the default value of the node.
      *
      * @return mixed The default value
+     *
      * @throws \RuntimeException if the node has no default value
      */
     public function getDefaultValue();
--- a/vendor/symfony/config/Symfony/Component/Config/Definition/NumericNode.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Definition/NumericNode.php
@@ -14,7 +14,7 @@ namespace Symfony\Component\Config\Definition;
 use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
 
 /**
- * This node represents a numeric value in the config tree
+ * This node represents a numeric value in the config tree.
  *
  * @author David Jeanmonod <david.jeanmonod@gmail.com>
  */
@@ -52,4 +52,13 @@ class NumericNode extends ScalarNode
 
         return $value;
     }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function isValueEmpty($value)
+    {
+        // a numeric value cannot be empty
+        return false;
+    }
 }
--- a/vendor/symfony/config/Symfony/Component/Config/Definition/PrototypedArrayNode.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Definition/PrototypedArrayNode.php
@@ -48,7 +48,7 @@ class PrototypedArrayNode extends ArrayNode
      * Sets the minimum number of elements that a prototype based node must
      * contain. By default this is zero, meaning no elements.
      *
-     * @param int     $number
+     * @param int $number
      */
     public function setMinNumberOfElements($number)
     {
@@ -76,8 +76,8 @@ class PrototypedArrayNode extends ArrayNode
      * If you'd like "'id' => 'my_name'" to still be present in the resulting
      * array, then you can set the second argument of this method to false.
      *
-     * @param string  $attribute The name of the attribute which value is to be used as a key
-     * @param bool    $remove    Whether or not to remove the key
+     * @param string $attribute The name of the attribute which value is to be used as a key
+     * @param bool   $remove    Whether or not to remove the key
      */
     public function setKeyAttribute($attribute, $remove = true)
     {
@@ -124,14 +124,14 @@ class PrototypedArrayNode extends ArrayNode
     /**
      * Adds default children when none are set.
      *
-     * @param int|string|array|null     $children The number of children|The child name|The children names to be added
+     * @param int|string|array|null $children The number of children|The child name|The children names to be added
      */
     public function setAddChildrenIfNoneSet($children = array('defaults'))
     {
         if (null === $children) {
             $this->defaultChildren = array('defaults');
         } else {
-            $this->defaultChildren = is_integer($children) && $children > 0 ? range(1, $children) : (array) $children;
+            $this->defaultChildren = is_int($children) && $children > 0 ? range(1, $children) : (array) $children;
         }
     }
 
@@ -169,7 +169,7 @@ class PrototypedArrayNode extends ArrayNode
     }
 
     /**
-     * Retrieves the prototype
+     * Retrieves the prototype.
      *
      * @return PrototypeNodeInterface The prototype
      */
@@ -211,7 +211,7 @@ class PrototypedArrayNode extends ArrayNode
             $this->prototype->setName($k);
             try {
                 $value[$k] = $this->prototype->finalize($v);
-            } catch (UnsetKeyException $unset) {
+            } catch (UnsetKeyException $e) {
                 unset($value[$k]);
             }
         }
@@ -245,7 +245,7 @@ class PrototypedArrayNode extends ArrayNode
 
         $value = $this->remapXml($value);
 
-        $isAssoc = array_keys($value) !== range(0, count($value) -1);
+        $isAssoc = array_keys($value) !== range(0, count($value) - 1);
         $normalized = array();
         foreach ($value as $k => $v) {
             if (null !== $this->keyAttribute && is_array($v)) {
--- a/vendor/symfony/config/Symfony/Component/Config/Definition/ReferenceDumper.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Definition/ReferenceDumper.php
@@ -120,7 +120,7 @@ class ReferenceDumper
         if ($info = $node->getInfo()) {
             $this->writeLine('');
             // indenting multi-line info
-            $info = str_replace("\n", sprintf("\n%".($depth * 4)."s# ", ' '), $info);
+            $info = str_replace("\n", sprintf("\n%".($depth * 4).'s# ', ' '), $info);
             $this->writeLine('# '.$info, $depth * 4);
         }
 
@@ -155,7 +155,7 @@ class ReferenceDumper
     }
 
     /**
-     * Outputs a single config reference line
+     * Outputs a single config reference line.
      *
      * @param string $text
      * @param int    $indent
--- a/vendor/symfony/config/Symfony/Component/Config/Definition/ScalarNode.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Definition/ScalarNode.php
@@ -43,4 +43,12 @@ class ScalarNode extends VariableNode
             throw $ex;
         }
     }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function isValueEmpty($value)
+    {
+        return null === $value || '' === $value;
+    }
 }
--- a/vendor/symfony/config/Symfony/Component/Config/Definition/VariableNode.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Definition/VariableNode.php
@@ -49,13 +49,15 @@ class VariableNode extends BaseNode implements PrototypeNodeInterface
      */
     public function getDefaultValue()
     {
-        return $this->defaultValue instanceof \Closure ? call_user_func($this->defaultValue) : $this->defaultValue;
+        $v = $this->defaultValue;
+
+        return $v instanceof \Closure ? $v() : $v;
     }
 
     /**
      * Sets if this node is allowed to have an empty value.
      *
-     * @param bool    $boolean True if this entity will accept empty values.
+     * @param bool $boolean True if this entity will accept empty values.
      */
     public function setAllowEmptyValue($boolean)
     {
@@ -82,7 +84,7 @@ class VariableNode extends BaseNode implements PrototypeNodeInterface
      */
     protected function finalizeValue($value)
     {
-        if (!$this->allowEmptyValue && empty($value)) {
+        if (!$this->allowEmptyValue && $this->isValueEmpty($value)) {
             $ex = new InvalidConfigurationException(sprintf(
                 'The path "%s" cannot contain an empty value, but got %s.',
                 $this->getPath(),
@@ -111,4 +113,20 @@ class VariableNode extends BaseNode implements PrototypeNodeInterface
     {
         return $rightSide;
     }
+
+    /**
+     * Evaluates if the given value is to be treated as empty.
+     *
+     * By default, PHP's empty() function is used to test for emptiness. This
+     * method may be overridden by subtypes to better match their understanding
+     * of empty data.
+     *
+     * @param mixed $value
+     *
+     * @return bool
+     */
+    protected function isValueEmpty($value)
+    {
+        return empty($value);
+    }
 }
--- a/vendor/symfony/config/Symfony/Component/Config/Exception/FileLoaderImportCircularReferenceException.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Exception/FileLoaderImportCircularReferenceException.php
@@ -22,6 +22,6 @@ class FileLoaderImportCircularReferenceException extends FileLoaderLoadException
     {
         $message = sprintf('Circular reference detected in "%s" ("%s" > "%s").', $this->varToString($resources[0]), implode('" > "', $resources), $resources[0]);
 
-        call_user_func('Exception::__construct', $message, $code, $previous);
+        \Exception::__construct($message, $code, $previous);
     }
 }
--- a/vendor/symfony/config/Symfony/Component/Config/Exception/FileLoaderLoadException.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Exception/FileLoaderLoadException.php
@@ -36,7 +36,8 @@ class FileLoaderLoadException extends \Exception
         if ('@' === $resource[0]) {
             $parts = explode(DIRECTORY_SEPARATOR, $resource);
             $bundle = substr($parts[0], 1);
-            $message .= ' '.sprintf('Make sure the "%s" bundle is correctly registered and loaded in the application kernel class.', $bundle);
+            $message .= sprintf(' Make sure the "%s" bundle is correctly registered and loaded in the application kernel class.', $bundle);
+            $message .= sprintf(' If the bundle is registered, make sure the bundle path "%s" is not empty.', $resource);
         } elseif ($previous) {
             // include the previous exception, to help the user see what might be the underlying cause
             $message .= ' '.sprintf('(%s)', $previous->getMessage());
@@ -57,7 +58,7 @@ class FileLoaderLoadException extends \Exception
                 $a[] = sprintf('%s => %s', $k, $this->varToString($v));
             }
 
-            return sprintf("Array(%s)", implode(', ', $a));
+            return sprintf('Array(%s)', implode(', ', $a));
         }
 
         if (is_resource($var)) {
--- a/vendor/symfony/config/Symfony/Component/Config/FileLocator.php
+++ b/vendor/symfony/config/Symfony/Component/Config/FileLocator.php
@@ -31,18 +31,14 @@ class FileLocator implements FileLocatorInterface
     }
 
     /**
-     * Returns a full path for a given file name.
-     *
-     * @param mixed   $name        The file name to locate
-     * @param string  $currentPath The current path
-     * @param bool    $first       Whether to return the first occurrence or an array of filenames
-     *
-     * @return string|array The full path to the file|An array of file paths
-     *
-     * @throws \InvalidArgumentException When file is not found
+     * {@inheritdoc}
      */
     public function locate($name, $currentPath = null, $first = true)
     {
+        if ('' == $name) {
+            throw new \InvalidArgumentException('An empty file name is not valid to be located.');
+        }
+
         if ($this->isAbsolutePath($name)) {
             if (!file_exists($name)) {
                 throw new \InvalidArgumentException(sprintf('The file "%s" does not exist.', $name));
@@ -51,15 +47,16 @@ class FileLocator implements FileLocatorInterface
             return $name;
         }
 
-        $filepaths = array();
-        if (null !== $currentPath && file_exists($file = $currentPath.DIRECTORY_SEPARATOR.$name)) {
-            if (true === $first) {
-                return $file;
-            }
-            $filepaths[] = $file;
+        $paths = $this->paths;
+
+        if (null !== $currentPath) {
+            array_unshift($paths, $currentPath);
         }
 
-        foreach ($this->paths as $path) {
+        $paths = array_unique($paths);
+        $filepaths = array();
+
+        foreach ($paths as $path) {
             if (file_exists($file = $path.DIRECTORY_SEPARATOR.$name)) {
                 if (true === $first) {
                     return $file;
@@ -69,10 +66,10 @@ class FileLocator implements FileLocatorInterface
         }
 
         if (!$filepaths) {
-            throw new \InvalidArgumentException(sprintf('The file "%s" does not exist (in: %s%s).', $name, null !== $currentPath ? $currentPath.', ' : '', implode(', ', $this->paths)));
+            throw new \InvalidArgumentException(sprintf('The file "%s" does not exist (in: %s).', $name, implode(', ', $paths)));
         }
 
-        return array_values(array_unique($filepaths));
+        return $filepaths;
     }
 
     /**
@@ -84,10 +81,10 @@ class FileLocator implements FileLocatorInterface
      */
     private function isAbsolutePath($file)
     {
-        if ($file[0] == '/' || $file[0] == '\\'
+        if ($file[0] === '/' || $file[0] === '\\'
             || (strlen($file) > 3 && ctype_alpha($file[0])
-                && $file[1] == ':'
-                && ($file[2] == '\\' || $file[2] == '/')
+                && $file[1] === ':'
+                && ($file[2] === '\\' || $file[2] === '/')
             )
             || null !== parse_url($file, PHP_URL_SCHEME)
         ) {
--- a/vendor/symfony/config/Symfony/Component/Config/FileLocatorInterface.php
+++ b/vendor/symfony/config/Symfony/Component/Config/FileLocatorInterface.php
@@ -19,11 +19,11 @@ interface FileLocatorInterface
     /**
      * Returns a full path for a given file name.
      *
-     * @param mixed   $name        The file name to locate
-     * @param string  $currentPath The current path
-     * @param bool    $first       Whether to return the first occurrence or an array of filenames
+     * @param string      $name        The file name to locate
+     * @param string|null $currentPath The current path
+     * @param bool        $first       Whether to return the first occurrence or an array of filenames
      *
-     * @return string|array The full path to the file|An array of file paths
+     * @return string|array The full path to the file or an array of file paths
      *
      * @throws \InvalidArgumentException When file is not found
      */
--- a/vendor/symfony/config/Symfony/Component/Config/LICENSE
+++ b/vendor/symfony/config/Symfony/Component/Config/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2014 Fabien Potencier
+Copyright (c) 2004-2015 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
--- a/vendor/symfony/config/Symfony/Component/Config/Loader/DelegatingLoader.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Loader/DelegatingLoader.php
@@ -34,14 +34,7 @@ class DelegatingLoader extends Loader
     }
 
     /**
-     * Loads a resource.
-     *
-     * @param mixed  $resource A resource
-     * @param string $type     The resource type
-     *
-     * @return mixed
-     *
-     * @throws FileLoaderLoadException if no loader is found.
+     * {@inheritdoc}
      */
     public function load($resource, $type = null)
     {
--- a/vendor/symfony/config/Symfony/Component/Config/Loader/FileLoader.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Loader/FileLoader.php
@@ -22,8 +22,14 @@ use Symfony\Component\Config\Exception\FileLoaderImportCircularReferenceExceptio
  */
 abstract class FileLoader extends Loader
 {
+    /**
+     * @var array
+     */
     protected static $loading = array();
 
+    /**
+     * @var FileLocatorInterface
+     */
     protected $locator;
 
     private $currentDir;
@@ -38,11 +44,21 @@ abstract class FileLoader extends Loader
         $this->locator = $locator;
     }
 
+    /**
+     * Sets the current directory.
+     *
+     * @param string $dir
+     */
     public function setCurrentDir($dir)
     {
         $this->currentDir = $dir;
     }
 
+    /**
+     * Returns the file locator used by this loader.
+     *
+     * @return FileLocatorInterface
+     */
     public function getLocator()
     {
         return $this->locator;
@@ -51,10 +67,10 @@ abstract class FileLoader extends Loader
     /**
      * Imports a resource.
      *
-     * @param mixed   $resource       A Resource
-     * @param string  $type           The resource type
-     * @param bool    $ignoreErrors   Whether to ignore import errors or not
-     * @param string  $sourceResource The original resource importing the new resource
+     * @param mixed       $resource       A Resource
+     * @param string|null $type           The resource type or null if unknown
+     * @param bool        $ignoreErrors   Whether to ignore import errors or not
+     * @param string|null $sourceResource The original resource importing the new resource
      *
      * @return mixed
      *
@@ -66,7 +82,7 @@ abstract class FileLoader extends Loader
         try {
             $loader = $this->resolve($resource, $type);
 
-            if ($loader instanceof FileLoader && null !== $this->currentDir) {
+            if ($loader instanceof self && null !== $this->currentDir) {
                 // we fallback to the current locator to keep BC
                 // as some some loaders do not call the parent __construct()
                 // @deprecated should be removed in 3.0
@@ -75,9 +91,9 @@ abstract class FileLoader extends Loader
             }
 
             $resources = is_array($resource) ? $resource : array($resource);
-            for ($i = 0; $i < $resourcesCount = count($resources); $i++ ) {
+            for ($i = 0; $i < $resourcesCount = count($resources); ++$i) {
                 if (isset(self::$loading[$resources[$i]])) {
-                    if ($i == $resourcesCount-1) {
+                    if ($i == $resourcesCount - 1) {
                         throw new FileLoaderImportCircularReferenceException(array_keys(self::$loading));
                     }
                 } else {
@@ -87,7 +103,12 @@ abstract class FileLoader extends Loader
             }
             self::$loading[$resource] = true;
 
-            $ret = $loader->load($resource, $type);
+            try {
+                $ret = $loader->load($resource, $type);
+            } catch (\Exception $e) {
+                unset(self::$loading[$resource]);
+                throw $e;
+            }
 
             unset(self::$loading[$resource]);
 
--- a/vendor/symfony/config/Symfony/Component/Config/Loader/Loader.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Loader/Loader.php
@@ -23,9 +23,7 @@ abstract class Loader implements LoaderInterface
     protected $resolver;
 
     /**
-     * Gets the loader resolver.
-     *
-     * @return LoaderResolverInterface A LoaderResolverInterface instance
+     * {@inheritdoc}
      */
     public function getResolver()
     {
@@ -33,9 +31,7 @@ abstract class Loader implements LoaderInterface
     }
 
     /**
-     * Sets the loader resolver.
-     *
-     * @param LoaderResolverInterface $resolver A LoaderResolverInterface instance
+     * {@inheritdoc}
      */
     public function setResolver(LoaderResolverInterface $resolver)
     {
@@ -45,8 +41,8 @@ abstract class Loader implements LoaderInterface
     /**
      * Imports a resource.
      *
-     * @param mixed  $resource A Resource
-     * @param string $type     The resource type
+     * @param mixed       $resource A resource
+     * @param string|null $type     The resource type or null if unknown
      *
      * @return mixed
      */
@@ -58,12 +54,12 @@ abstract class Loader implements LoaderInterface
     /**
      * Finds a loader able to load an imported resource.
      *
-     * @param mixed  $resource A Resource
-     * @param string $type     The resource type
+     * @param mixed       $resource A resource
+     * @param string|null $type     The resource type or null if unknown
      *
      * @return LoaderInterface A LoaderInterface instance
      *
-     * @throws FileLoaderLoadException if no loader is found
+     * @throws FileLoaderLoadException If no loader is found
      */
     public function resolve($resource, $type = null)
     {
--- a/vendor/symfony/config/Symfony/Component/Config/Loader/LoaderInterface.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Loader/LoaderInterface.php
@@ -21,18 +21,20 @@ interface LoaderInterface
     /**
      * Loads a resource.
      *
-     * @param mixed  $resource The resource
-     * @param string $type     The resource type
+     * @param mixed       $resource The resource
+     * @param string|null $type     The resource type or null if unknown
+     *
+     * @throws \Exception If something went wrong
      */
     public function load($resource, $type = null);
 
     /**
-     * Returns true if this class supports the given resource.
+     * Returns whether this class supports the given resource.
      *
-     * @param mixed  $resource A resource
-     * @param string $type     The resource type
+     * @param mixed       $resource A resource
+     * @param string|null $type     The resource type or null if unknown
      *
-     * @return bool    true if this class supports the given resource, false otherwise
+     * @return bool True if this class supports the given resource, false otherwise
      */
     public function supports($resource, $type = null);
 
--- a/vendor/symfony/config/Symfony/Component/Config/Loader/LoaderResolver.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Loader/LoaderResolver.php
@@ -40,12 +40,7 @@ class LoaderResolver implements LoaderResolverInterface
     }
 
     /**
-     * Returns a loader able to load the resource.
-     *
-     * @param mixed  $resource A resource
-     * @param string $type     The resource type
-     *
-     * @return LoaderInterface|false A LoaderInterface instance
+     * {@inheritdoc}
      */
     public function resolve($resource, $type = null)
     {
--- a/vendor/symfony/config/Symfony/Component/Config/Loader/LoaderResolverInterface.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Loader/LoaderResolverInterface.php
@@ -21,10 +21,10 @@ interface LoaderResolverInterface
     /**
      * Returns a loader able to load the resource.
      *
-     * @param mixed  $resource A resource
-     * @param string $type     The resource type
+     * @param mixed       $resource A resource
+     * @param string|null $type     The resource type or null if unknown
      *
-     * @return LoaderInterface A LoaderInterface instance
+     * @return LoaderInterface|false The loader or false if none is able to load the resource
      */
     public function resolve($resource, $type = null);
 }
--- a/vendor/symfony/config/Symfony/Component/Config/Resource/DirectoryResource.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Resource/DirectoryResource.php
@@ -24,8 +24,8 @@ class DirectoryResource implements ResourceInterface, \Serializable
     /**
      * Constructor.
      *
-     * @param string $resource The file path to the resource
-     * @param string $pattern  A pattern to restrict monitored files
+     * @param string      $resource The file path to the resource
+     * @param string|null $pattern  A pattern to restrict monitored files
      */
     public function __construct($resource, $pattern = null)
     {
@@ -34,36 +34,33 @@ class DirectoryResource implements ResourceInterface, \Serializable
     }
 
     /**
-     * Returns a string representation of the Resource.
-     *
-     * @return string A string representation of the Resource
+     * {@inheritdoc}
      */
     public function __toString()
     {
-        return (string) $this->resource;
+        return md5(serialize(array($this->resource, $this->pattern)));
     }
 
     /**
-     * Returns the resource tied to this Resource.
-     *
-     * @return mixed The resource
+     * {@inheritdoc}
      */
     public function getResource()
     {
         return $this->resource;
     }
 
+    /**
+     * Returns the pattern to restrict monitored files.
+     *
+     * @return string|null
+     */
     public function getPattern()
     {
         return $this->pattern;
     }
 
     /**
-     * Returns true if the resource has not been updated since the given timestamp.
-     *
-     * @param int     $timestamp The last time the resource was loaded
-     *
-     * @return bool    true if the resource has not been updated, false otherwise
+     * {@inheritdoc}
      */
     public function isFresh($timestamp)
     {
--- a/vendor/symfony/config/Symfony/Component/Config/Resource/FileResource.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Resource/FileResource.php
@@ -20,6 +20,9 @@ namespace Symfony\Component\Config\Resource;
  */
 class FileResource implements ResourceInterface, \Serializable
 {
+    /**
+     * @var string|false
+     */
     private $resource;
 
     /**
@@ -33,9 +36,7 @@ class FileResource implements ResourceInterface, \Serializable
     }
 
     /**
-     * Returns a string representation of the Resource.
-     *
-     * @return string A string representation of the Resource
+     * {@inheritdoc}
      */
     public function __toString()
     {
@@ -43,9 +44,7 @@ class FileResource implements ResourceInterface, \Serializable
     }
 
     /**
-     * Returns the resource tied to this Resource.
-     *
-     * @return mixed The resource
+     * {@inheritdoc}
      */
     public function getResource()
     {
@@ -53,19 +52,15 @@ class FileResource implements ResourceInterface, \Serializable
     }
 
     /**
-     * Returns true if the resource has not been updated since the given timestamp.
-     *
-     * @param int     $timestamp The last time the resource was loaded
-     *
-     * @return bool    true if the resource has not been updated, false otherwise
+     * {@inheritdoc}
      */
     public function isFresh($timestamp)
     {
-        if (!file_exists($this->resource)) {
+        if (false === $this->resource || !file_exists($this->resource)) {
             return false;
         }
 
-        return filemtime($this->resource) < $timestamp;
+        return filemtime($this->resource) <= $timestamp;
     }
 
     public function serialize()
--- a/vendor/symfony/config/Symfony/Component/Config/Resource/ResourceInterface.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Resource/ResourceInterface.php
@@ -28,14 +28,14 @@ interface ResourceInterface
     /**
      * Returns true if the resource has not been updated since the given timestamp.
      *
-     * @param int     $timestamp The last time the resource was loaded
+     * @param int $timestamp The last time the resource was loaded
      *
-     * @return bool    true if the resource has not been updated, false otherwise
+     * @return bool True if the resource has not been updated, false otherwise
      */
     public function isFresh($timestamp);
 
     /**
-     * Returns the resource tied to this Resource.
+     * Returns the tied resource.
      *
      * @return mixed The resource
      */
--- a/vendor/symfony/config/Symfony/Component/Config/Util/XmlUtils.php
+++ b/vendor/symfony/config/Symfony/Component/Config/Util/XmlUtils.php
@@ -22,7 +22,7 @@ namespace Symfony\Component\Config\Util;
 class XmlUtils
 {
     /**
-     * This class should not be instantiated
+     * This class should not be instantiated.
      */
     private function __construct()
     {
@@ -191,17 +191,19 @@ class XmlUtils
                 return;
             case ctype_digit($value):
                 $raw = $value;
-                $cast = intval($value);
+                $cast = (int) $value;
 
-                return '0' == $value[0] ? octdec($value) : (((string) $raw == (string) $cast) ? $cast : $raw);
+                return '0' == $value[0] ? octdec($value) : (((string) $raw === (string) $cast) ? $cast : $raw);
             case 'true' === $lowercaseValue:
                 return true;
             case 'false' === $lowercaseValue:
                 return false;
             case is_numeric($value):
-                return '0x' == $value[0].$value[1] ? hexdec($value) : floatval($value);
+                return '0x' === $value[0].$value[1] ? hexdec($value) : (float) $value;
+            case preg_match('/^0x[0-9a-f]++$/i', $value):
+                return hexdec($value);
             case preg_match('/^(-|\+)?[0-9]+(\.[0-9]+)?$/', $value):
-                return floatval($value);
+                return (float) $value;
             default:
                 return $value;
         }
@@ -215,7 +217,7 @@ class XmlUtils
                 LIBXML_ERR_WARNING == $error->level ? 'WARNING' : 'ERROR',
                 $error->code,
                 trim($error->message),
-                $error->file ? $error->file : 'n/a',
+                $error->file ?: 'n/a',
                 $error->line,
                 $error->column
             );
--- a/vendor/symfony/config/Symfony/Component/Config/composer.json
+++ b/vendor/symfony/config/Symfony/Component/Config/composer.json
@@ -3,7 +3,7 @@
     "type": "library",
     "description": "Symfony Config Component",
     "keywords": [],
-    "homepage": "http://symfony.com",
+    "homepage": "https://symfony.com",
     "license": "MIT",
     "authors": [
         {
@@ -12,7 +12,7 @@
         },
         {
             "name": "Symfony Community",
-            "homepage": "http://symfony.com/contributors"
+            "homepage": "https://symfony.com/contributors"
         }
     ],
     "require": {
@@ -20,7 +20,10 @@
         "symfony/filesystem": "~2.3"
     },
     "autoload": {
-        "psr-0": { "Symfony\\Component\\Config\\": "" }
+        "psr-0": { "Symfony\\Component\\Config\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
     },
     "target-dir": "Symfony/Component/Config",
     "minimum-stability": "dev",
--- a/vendor/symfony/console/Symfony/Component/Console/Application.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Application.php
@@ -49,8 +49,6 @@ use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  *     $app->run();
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class Application
 {
@@ -70,8 +68,6 @@ class Application
      *
      * @param string $name    The name of the application
      * @param string $version The version of the application
-     *
-     * @api
      */
     public function __construct($name = 'UNKNOWN', $version = 'UNKNOWN')
     {
@@ -102,8 +98,6 @@ class Application
      * @return int 0 if everything went fine, or an error code
      *
      * @throws \Exception When doRun returns Exception
-     *
-     * @api
      */
     public function run(InputInterface $input = null, OutputInterface $output = null)
     {
@@ -198,8 +192,6 @@ class Application
      * Set a helper set to be used with the command.
      *
      * @param HelperSet $helperSet The helper set
-     *
-     * @api
      */
     public function setHelperSet(HelperSet $helperSet)
     {
@@ -210,8 +202,6 @@ class Application
      * Get the helper set associated with the command.
      *
      * @return HelperSet The HelperSet instance associated with this command
-     *
-     * @api
      */
     public function getHelperSet()
     {
@@ -219,11 +209,9 @@ class Application
     }
 
     /**
-     * Set an input definition set to be used with this application
+     * Set an input definition set to be used with this application.
      *
      * @param InputDefinition $definition The input definition
-     *
-     * @api
      */
     public function setDefinition(InputDefinition $definition)
     {
@@ -251,7 +239,7 @@ class Application
             $this->getLongVersion(),
             '',
             '<comment>Usage:</comment>',
-            '  [options] command [arguments]',
+            '  command [options] [arguments]',
             '',
             '<comment>Options:</comment>',
         );
@@ -271,8 +259,6 @@ class Application
      * Sets whether to catch exceptions or not during commands execution.
      *
      * @param bool $boolean Whether to catch exceptions or not during commands execution
-     *
-     * @api
      */
     public function setCatchExceptions($boolean)
     {
@@ -283,8 +269,6 @@ class Application
      * Sets whether to automatically exit after a command execution or not.
      *
      * @param bool $boolean Whether to automatically exit after a command execution or not
-     *
-     * @api
      */
     public function setAutoExit($boolean)
     {
@@ -295,8 +279,6 @@ class Application
      * Gets the name of the application.
      *
      * @return string The application name
-     *
-     * @api
      */
     public function getName()
     {
@@ -307,8 +289,6 @@ class Application
      * Sets the application name.
      *
      * @param string $name The application name
-     *
-     * @api
      */
     public function setName($name)
     {
@@ -319,8 +299,6 @@ class Application
      * Gets the application version.
      *
      * @return string The application version
-     *
-     * @api
      */
     public function getVersion()
     {
@@ -331,8 +309,6 @@ class Application
      * Sets the application version.
      *
      * @param string $version The application version
-     *
-     * @api
      */
     public function setVersion($version)
     {
@@ -343,8 +319,6 @@ class Application
      * Returns the long version of the application.
      *
      * @return string The long application version
-     *
-     * @api
      */
     public function getLongVersion()
     {
@@ -361,8 +335,6 @@ class Application
      * @param string $name The command name
      *
      * @return Command The newly created command
-     *
-     * @api
      */
     public function register($name)
     {
@@ -373,8 +345,6 @@ class Application
      * Adds an array of command objects.
      *
      * @param Command[] $commands An array of commands
-     *
-     * @api
      */
     public function addCommands(array $commands)
     {
@@ -391,8 +361,6 @@ class Application
      * @param Command $command A Command object
      *
      * @return Command The registered command
-     *
-     * @api
      */
     public function add(Command $command)
     {
@@ -421,8 +389,6 @@ class Application
      * @return Command A Command object
      *
      * @throws \InvalidArgumentException When command name given does not exist
-     *
-     * @api
      */
     public function get($name)
     {
@@ -450,8 +416,6 @@ class Application
      * @param string $name The command name or alias
      *
      * @return bool true if the command exists, false otherwise
-     *
-     * @api
      */
     public function has($name)
     {
@@ -469,10 +433,10 @@ class Application
     {
         $namespaces = array();
         foreach ($this->commands as $command) {
-            $namespaces[] = $this->extractNamespace($command->getName());
+            $namespaces = array_merge($namespaces, $this->extractAllNamespaces($command->getName()));
 
             foreach ($command->getAliases() as $alias) {
-                $namespaces[] = $this->extractNamespace($alias);
+                $namespaces = array_merge($namespaces, $this->extractAllNamespaces($alias));
             }
         }
 
@@ -549,8 +513,6 @@ class Application
      * @return Command A Command instance
      *
      * @throws \InvalidArgumentException When command name is incorrect or ambiguous
-     *
-     * @api
      */
     public function find($name)
     {
@@ -632,8 +594,6 @@ class Application
      * @param string $namespace A namespace name
      *
      * @return Command[] An array of Command instances
-     *
-     * @api
      */
     public function all($namespace = null)
     {
@@ -754,12 +714,12 @@ class Application
                 $trace = $e->getTrace();
                 array_unshift($trace, array(
                     'function' => '',
-                    'file'     => $e->getFile() != null ? $e->getFile() : 'n/a',
-                    'line'     => $e->getLine() != null ? $e->getLine() : 'n/a',
-                    'args'     => array(),
+                    'file' => $e->getFile() !== null ? $e->getFile() : 'n/a',
+                    'line' => $e->getLine() !== null ? $e->getLine() : 'n/a',
+                    'args' => array(),
                 ));
 
-                for ($i = 0, $count = count($trace); $i < $count; $i++) {
+                for ($i = 0, $count = count($trace); $i < $count; ++$i) {
                     $class = isset($trace[$i]['class']) ? $trace[$i]['class'] : '';
                     $type = isset($trace[$i]['type']) ? $trace[$i]['type'] : '';
                     $function = $trace[$i]['function'];
@@ -769,20 +729,20 @@ class Application
                     $output->writeln(sprintf(' %s%s%s() at <info>%s:%s</info>', $class, $type, $function, $file, $line));
                 }
 
-                $output->writeln("");
-                $output->writeln("");
+                $output->writeln('');
+                $output->writeln('');
             }
         } while ($e = $e->getPrevious());
 
         if (null !== $this->runningCommand) {
             $output->writeln(sprintf('<info>%s</info>', sprintf($this->runningCommand->getSynopsis(), $this->getName())));
-            $output->writeln("");
-            $output->writeln("");
+            $output->writeln('');
+            $output->writeln('');
         }
     }
 
     /**
-     * Tries to figure out the terminal width in which this application runs
+     * Tries to figure out the terminal width in which this application runs.
      *
      * @return int|null
      */
@@ -794,7 +754,7 @@ class Application
     }
 
     /**
-     * Tries to figure out the terminal height in which this application runs
+     * Tries to figure out the terminal height in which this application runs.
      *
      * @return int|null
      */
@@ -806,13 +766,13 @@ class Application
     }
 
     /**
-     * Tries to figure out the terminal dimensions based on the current environment
+     * Tries to figure out the terminal dimensions based on the current environment.
      *
      * @return array Array containing width and height
      */
     public function getTerminalDimensions()
     {
-        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
+        if ('\\' === DIRECTORY_SEPARATOR) {
             // extract [w, H] from "wxh (WxH)"
             if (preg_match('/^(\d+)x\d+ \(\d+x(\d+)\)$/', trim(getenv('ANSICON')), $matches)) {
                 return array((int) $matches[1], (int) $matches[2]);
@@ -855,7 +815,7 @@ class Application
             $input->setInteractive(false);
         } elseif (function_exists('posix_isatty') && $this->getHelperSet()->has('dialog')) {
             $inputStream = $this->getHelperSet()->get('dialog')->getInputStream();
-            if (!@posix_isatty($inputStream)) {
+            if (!@posix_isatty($inputStream) && false === getenv('SHELL_INTERACTIVE')) {
                 $input->setInteractive(false);
             }
         }
@@ -899,13 +859,15 @@ class Application
         try {
             $exitCode = $command->run($input, $output);
         } catch (\Exception $e) {
+            $event = new ConsoleExceptionEvent($command, $input, $output, $e, $e->getCode());
+            $this->dispatcher->dispatch(ConsoleEvents::EXCEPTION, $event);
+
+            $e = $event->getException();
+
             $event = new ConsoleTerminateEvent($command, $input, $output, $e->getCode());
             $this->dispatcher->dispatch(ConsoleEvents::TERMINATE, $event);
 
-            $event = new ConsoleExceptionEvent($command, $input, $output, $e, $event->getExitCode());
-            $this->dispatcher->dispatch(ConsoleEvents::EXCEPTION, $event);
-
-            throw $event->getException();
+            throw $e;
         }
 
         $event = new ConsoleTerminateEvent($command, $input, $output, $exitCode);
@@ -936,13 +898,13 @@ class Application
         return new InputDefinition(array(
             new InputArgument('command', InputArgument::REQUIRED, 'The command to execute'),
 
-            new InputOption('--help',           '-h', InputOption::VALUE_NONE, 'Display this help message.'),
-            new InputOption('--quiet',          '-q', InputOption::VALUE_NONE, 'Do not output any message.'),
-            new InputOption('--verbose',        '-v|vv|vvv', InputOption::VALUE_NONE, 'Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug.'),
-            new InputOption('--version',        '-V', InputOption::VALUE_NONE, 'Display this application version.'),
-            new InputOption('--ansi',           '',   InputOption::VALUE_NONE, 'Force ANSI output.'),
-            new InputOption('--no-ansi',        '',   InputOption::VALUE_NONE, 'Disable ANSI output.'),
-            new InputOption('--no-interaction', '-n', InputOption::VALUE_NONE, 'Do not ask any interactive question.'),
+            new InputOption('--help', '-h', InputOption::VALUE_NONE, 'Display this help message'),
+            new InputOption('--quiet', '-q', InputOption::VALUE_NONE, 'Do not output any message'),
+            new InputOption('--verbose', '-v|vv|vvv', InputOption::VALUE_NONE, 'Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug'),
+            new InputOption('--version', '-V', InputOption::VALUE_NONE, 'Display this application version'),
+            new InputOption('--ansi', '', InputOption::VALUE_NONE, 'Force ANSI output'),
+            new InputOption('--no-ansi', '', InputOption::VALUE_NONE, 'Disable ANSI output'),
+            new InputOption('--no-interaction', '-n', InputOption::VALUE_NONE, 'Do not ask any interactive question'),
         ));
     }
 
@@ -972,7 +934,7 @@ class Application
     }
 
     /**
-     * Runs and parses stty -a if it's available, suppressing any error output
+     * Runs and parses stty -a if it's available, suppressing any error output.
      *
      * @return string
      */
@@ -995,7 +957,7 @@ class Application
     }
 
     /**
-     * Runs and parses mode CON if it's available, suppressing any error output
+     * Runs and parses mode CON if it's available, suppressing any error output.
      *
      * @return string <width>x<height> or null if it could not be parsed
      */
@@ -1050,7 +1012,7 @@ class Application
     }
 
     /**
-     * Finds alternative commands of $name
+     * Finds alternative commands of $name.
      *
      * @param string $name    The full name of the command
      * @param array  $abbrevs The abbreviations
@@ -1067,7 +1029,7 @@ class Application
     }
 
     /**
-     * Finds alternative namespace of $name
+     * Finds alternative namespace of $name.
      *
      * @param string $name    The full name of the namespace
      * @param array  $abbrevs The abbreviations
@@ -1081,12 +1043,12 @@ class Application
 
     /**
      * Finds alternative of $name among $collection,
-     * if nothing is found in $collection, try in $abbrevs
+     * if nothing is found in $collection, try in $abbrevs.
      *
-     * @param string               $name       The string
-     * @param array|\Traversable   $collection The collection
-     * @param array                $abbrevs    The abbreviations
-     * @param Closure|string|array $callback   The callable to transform collection item before comparison
+     * @param string             $name       The string
+     * @param array|\Traversable $collection The collection
+     * @param array              $abbrevs    The abbreviations
+     * @param callable           $callback   The callable to transform collection item before comparison
      *
      * @return array A sorted array of similar string
      */
@@ -1127,7 +1089,7 @@ class Application
             return strlen($string);
         }
 
-        if (false === $encoding = mb_detect_encoding($string)) {
+        if (false === $encoding = mb_detect_encoding($string, null, true)) {
             return strlen($string);
         }
 
@@ -1144,7 +1106,7 @@ class Application
             return str_split($string, $width);
         }
 
-        if (false === $encoding = mb_detect_encoding($string)) {
+        if (false === $encoding = mb_detect_encoding($string, null, true)) {
             return str_split($string, $width);
         }
 
@@ -1161,7 +1123,7 @@ class Application
             $lines[] = str_pad($line, $width);
             $line = $char;
         }
-        if (strlen($line)) {
+        if ('' !== $line) {
             $lines[] = count($lines) ? str_pad($line, $width) : $line;
         }
 
@@ -1169,4 +1131,28 @@ class Application
 
         return $lines;
     }
+
+    /**
+     * Returns all namespaces of the command name.
+     *
+     * @param string $name The full name of the command
+     *
+     * @return array The namespaces of the command
+     */
+    private function extractAllNamespaces($name)
+    {
+        // -1 as third argument is needed to skip the command short name when exploding
+        $parts = explode(':', $name, -1);
+        $namespaces = array();
+
+        foreach ($parts as $part) {
+            if (count($namespaces)) {
+                $namespaces[] = end($namespaces).':'.$part;
+            } else {
+                $namespaces[] = $part;
+            }
+        }
+
+        return $namespaces;
+    }
 }
--- a/vendor/symfony/console/Symfony/Component/Console/Command/Command.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Command/Command.php
@@ -25,8 +25,6 @@ use Symfony\Component\Console\Helper\HelperSet;
  * Base class for all commands.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class Command
 {
@@ -49,8 +47,6 @@ class Command
      * @param string $name The name of the command
      *
      * @throws \LogicException When the command name is empty
-     *
-     * @api
      */
     public function __construct($name = null)
     {
@@ -85,8 +81,6 @@ class Command
      * Sets the application instance for this command.
      *
      * @param Application $application An Application instance
-     *
-     * @api
      */
     public function setApplication(Application $application = null)
     {
@@ -122,8 +116,6 @@ class Command
      * Gets the application instance for this command.
      *
      * @return Application An Application instance
-     *
-     * @api
      */
     public function getApplication()
     {
@@ -131,7 +123,7 @@ class Command
     }
 
     /**
-     * Checks whether the command is enabled or not in the current environment
+     * Checks whether the command is enabled or not in the current environment.
      *
      * Override this to check for x or y and return false if the command can not
      * run properly under the current conditions.
@@ -161,10 +153,11 @@ class Command
      * @param InputInterface  $input  An InputInterface instance
      * @param OutputInterface $output An OutputInterface instance
      *
-     * @return null|int     null or 0 if everything went fine, or an error code
+     * @return null|int null or 0 if everything went fine, or an error code
      *
      * @throws \LogicException When this abstract method is not implemented
-     * @see    setCode()
+     *
+     * @see setCode()
      */
     protected function execute(InputInterface $input, OutputInterface $output)
     {
@@ -174,6 +167,10 @@ class Command
     /**
      * Interacts with the user.
      *
+     * This method is executed before the InputDefinition is validated.
+     * This means that this is the only place where the command can
+     * interactively ask for values of missing required arguments.
+     *
      * @param InputInterface  $input  An InputInterface instance
      * @param OutputInterface $output An OutputInterface instance
      */
@@ -204,14 +201,12 @@ class Command
      * @param InputInterface  $input  An InputInterface instance
      * @param OutputInterface $output An OutputInterface instance
      *
-     * @return int     The command exit code
+     * @return int The command exit code
      *
      * @throws \Exception
      *
      * @see setCode()
      * @see execute()
-     *
-     * @api
      */
     public function run(InputInterface $input, OutputInterface $output)
     {
@@ -236,6 +231,13 @@ class Command
             $this->interact($input, $output);
         }
 
+        // The command name argument is often omitted when a command is executed directly with its run() method.
+        // It would fail the validation if we didn't make sure the command argument is present,
+        // since it's required by the application.
+        if ($input->hasArgument('command') && null === $input->getArgument('command')) {
+            $input->setArgument('command', $this->getName());
+        }
+
         $input->validate();
 
         if ($this->code) {
@@ -260,8 +262,6 @@ class Command
      * @throws \InvalidArgumentException
      *
      * @see execute()
-     *
-     * @api
      */
     public function setCode($code)
     {
@@ -279,7 +279,7 @@ class Command
      *
      * This method is not part of public API and should not be used directly.
      *
-     * @param bool    $mergeArgs Whether to merge or not the Application definition arguments to Command definition arguments
+     * @param bool $mergeArgs Whether to merge or not the Application definition arguments to Command definition arguments
      */
     public function mergeApplicationDefinition($mergeArgs = true)
     {
@@ -307,8 +307,6 @@ class Command
      * @param array|InputDefinition $definition An array of argument and option instances or a definition instance
      *
      * @return Command The current instance
-     *
-     * @api
      */
     public function setDefinition($definition)
     {
@@ -327,8 +325,6 @@ class Command
      * Gets the InputDefinition attached to this Command.
      *
      * @return InputDefinition An InputDefinition instance
-     *
-     * @api
      */
     public function getDefinition()
     {
@@ -353,14 +349,12 @@ class Command
     /**
      * Adds an argument.
      *
-     * @param string  $name        The argument name
-     * @param int     $mode        The argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL
-     * @param string  $description A description text
-     * @param mixed   $default     The default value (for InputArgument::OPTIONAL mode only)
+     * @param string $name        The argument name
+     * @param int    $mode        The argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL
+     * @param string $description A description text
+     * @param mixed  $default     The default value (for InputArgument::OPTIONAL mode only)
      *
      * @return Command The current instance
-     *
-     * @api
      */
     public function addArgument($name, $mode = null, $description = '', $default = null)
     {
@@ -372,15 +366,13 @@ class Command
     /**
      * Adds an option.
      *
-     * @param string  $name        The option name
-     * @param string  $shortcut    The shortcut (can be null)
-     * @param int     $mode        The option mode: One of the InputOption::VALUE_* constants
-     * @param string  $description A description text
-     * @param mixed   $default     The default value (must be null for InputOption::VALUE_REQUIRED or InputOption::VALUE_NONE)
+     * @param string $name        The option name
+     * @param string $shortcut    The shortcut (can be null)
+     * @param int    $mode        The option mode: One of the InputOption::VALUE_* constants
+     * @param string $description A description text
+     * @param mixed  $default     The default value (must be null for InputOption::VALUE_REQUIRED or InputOption::VALUE_NONE)
      *
      * @return Command The current instance
-     *
-     * @api
      */
     public function addOption($name, $shortcut = null, $mode = null, $description = '', $default = null)
     {
@@ -402,8 +394,6 @@ class Command
      * @return Command The current instance
      *
      * @throws \InvalidArgumentException When command name given is empty
-     *
-     * @api
      */
     public function setName($name)
     {
@@ -418,8 +408,6 @@ class Command
      * Returns the command name.
      *
      * @return string The command name
-     *
-     * @api
      */
     public function getName()
     {
@@ -432,8 +420,6 @@ class Command
      * @param string $description The description for the command
      *
      * @return Command The current instance
-     *
-     * @api
      */
     public function setDescription($description)
     {
@@ -446,8 +432,6 @@ class Command
      * Returns the description for the command.
      *
      * @return string The description for the command
-     *
-     * @api
      */
     public function getDescription()
     {
@@ -460,8 +444,6 @@ class Command
      * @param string $help The help for the command
      *
      * @return Command The current instance
-     *
-     * @api
      */
     public function setHelp($help)
     {
@@ -474,8 +456,6 @@ class Command
      * Returns the help for the command.
      *
      * @return string The help for the command
-     *
-     * @api
      */
     public function getHelp()
     {
@@ -486,7 +466,7 @@ class Command
      * Returns the processed help for the command replacing the %command.name% and
      * %command.full_name% patterns with the real values dynamically.
      *
-     * @return string  The processed help for the command
+     * @return string The processed help for the command
      */
     public function getProcessedHelp()
     {
@@ -501,7 +481,7 @@ class Command
             $_SERVER['PHP_SELF'].' '.$name,
         );
 
-        return str_replace($placeholders, $replacements, $this->getHelp());
+        return str_replace($placeholders, $replacements, $this->getHelp() ?: $this->getDescription());
     }
 
     /**
@@ -510,8 +490,6 @@ class Command
      * @param string[] $aliases An array of aliases for the command
      *
      * @return Command The current instance
-     *
-     * @api
      */
     public function setAliases($aliases)
     {
@@ -532,8 +510,6 @@ class Command
      * Returns the aliases for the command.
      *
      * @return array An array of aliases for the command
-     *
-     * @api
      */
     public function getAliases()
     {
@@ -562,8 +538,6 @@ class Command
      * @return mixed The helper value
      *
      * @throws \InvalidArgumentException if the helper is not defined
-     *
-     * @api
      */
     public function getHelper($name)
     {
@@ -587,7 +561,7 @@ class Command
     /**
      * Returns an XML representation of the command.
      *
-     * @param bool    $asDom Whether to return a DOM or an XML string
+     * @param bool $asDom Whether to return a DOM or an XML string
      *
      * @return string|\DOMDocument An XML string representing the command
      *
--- a/vendor/symfony/console/Symfony/Component/Console/Command/HelpCommand.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Command/HelpCommand.php
@@ -58,7 +58,7 @@ EOF
     }
 
     /**
-     * Sets the command
+     * Sets the command.
      *
      * @param Command $command The command to set
      */
--- a/vendor/symfony/console/Symfony/Component/Console/ConsoleEvents.php
+++ b/vendor/symfony/console/Symfony/Component/Console/ConsoleEvents.php
@@ -26,6 +26,8 @@ final class ConsoleEvents
      * The event listener method receives a Symfony\Component\Console\Event\ConsoleCommandEvent
      * instance.
      *
+     * @Event
+     *
      * @var string
      */
     const COMMAND = 'console.command';
@@ -37,6 +39,8 @@ final class ConsoleEvents
      * The event listener method receives a Symfony\Component\Console\Event\ConsoleTerminateEvent
      * instance.
      *
+     * @Event
+     *
      * @var string
      */
     const TERMINATE = 'console.terminate';
@@ -49,6 +53,8 @@ final class ConsoleEvents
      * a Symfony\Component\Console\Event\ConsoleExceptionEvent
      * instance.
      *
+     * @Event
+     *
      * @var string
      */
     const EXCEPTION = 'console.exception';
--- a/vendor/symfony/console/Symfony/Component/Console/Descriptor/ApplicationDescription.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Descriptor/ApplicationDescription.php
@@ -134,19 +134,23 @@ class ApplicationDescription
     private function sortCommands(array $commands)
     {
         $namespacedCommands = array();
+        $globalCommands = array();
         foreach ($commands as $name => $command) {
             $key = $this->application->extractNamespace($name, 1);
             if (!$key) {
-                $key = '_global';
+                $globalCommands['_global'][$name] = $command;
+            } else {
+                $namespacedCommands[$key][$name] = $command;
             }
-
-            $namespacedCommands[$key][$name] = $command;
         }
         ksort($namespacedCommands);
+        $namespacedCommands = array_merge($globalCommands, $namespacedCommands);
 
-        foreach ($namespacedCommands as &$commands) {
-            ksort($commands);
+        foreach ($namespacedCommands as &$commandsSet) {
+            ksort($commandsSet);
         }
+        // unset reference to keep scope clear
+        unset($commandsSet);
 
         return $namespacedCommands;
     }
--- a/vendor/symfony/console/Symfony/Component/Console/Descriptor/JsonDescriptor.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Descriptor/JsonDescriptor.php
@@ -30,11 +30,11 @@ class JsonDescriptor extends Descriptor
     protected function describeInputArgument(InputArgument $argument, array $options = array())
     {
         return $this->output(array(
-            'name'        => $argument->getName(),
+            'name' => $argument->getName(),
             'is_required' => $argument->isRequired(),
-            'is_array'    => $argument->isArray(),
+            'is_array' => $argument->isArray(),
             'description' => $argument->getDescription(),
-            'default'     => $argument->getDefault(),
+            'default' => $argument->getDefault(),
         ), $options);
     }
 
@@ -44,13 +44,13 @@ class JsonDescriptor extends Descriptor
     protected function describeInputOption(InputOption $option, array $options = array())
     {
         return $this->output(array(
-            'name'              => '--'.$option->getName(),
-            'shortcut'          => $option->getShortcut() ? '-'.implode('|-', explode('|', $option->getShortcut())) : '',
-            'accept_value'      => $option->acceptValue(),
+            'name' => '--'.$option->getName(),
+            'shortcut' => $option->getShortcut() ? '-'.implode('|-', explode('|', $option->getShortcut())) : '',
+            'accept_value' => $option->acceptValue(),
             'is_value_required' => $option->isValueRequired(),
-            'is_multiple'       => $option->isArray(),
-            'description'       => $option->getDescription(),
-            'default'           => $option->getDefault(),
+            'is_multiple' => $option->isArray(),
+            'description' => $option->getDescription(),
+            'default' => $option->getDefault(),
         ), $options);
     }
 
@@ -81,12 +81,12 @@ class JsonDescriptor extends Descriptor
         $command->mergeApplicationDefinition(false);
 
         return $this->output(array(
-            'name'        => $command->getName(),
-            'usage'       => $command->getSynopsis(),
+            'name' => $command->getName(),
+            'usage' => $command->getSynopsis(),
             'description' => $command->getDescription(),
-            'help'        => $command->getProcessedHelp(),
-            'aliases'     => $command->getAliases(),
-            'definition'  => $this->describeInputDefinition($command->getNativeDefinition(), array('as_array' => true)),
+            'help' => $command->getProcessedHelp(),
+            'aliases' => $command->getAliases(),
+            'definition' => $this->describeInputDefinition($command->getNativeDefinition(), array('as_array' => true)),
         ), $options);
     }
 
--- a/vendor/symfony/console/Symfony/Component/Console/Descriptor/MarkdownDescriptor.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Descriptor/MarkdownDescriptor.php
@@ -117,7 +117,7 @@ class MarkdownDescriptor extends Descriptor
 
             $blocks[] = implode("\n", array_map(function ($commandName) {
                 return '* '.$commandName;
-            } , $namespace['commands']));
+            }, $namespace['commands']));
         }
 
         foreach ($description->getCommands() as $command) {
--- a/vendor/symfony/console/Symfony/Component/Console/Descriptor/TextDescriptor.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Descriptor/TextDescriptor.php
@@ -155,7 +155,7 @@ class TextDescriptor extends Descriptor
             $messages[] = '';
 
             if ($describedNamespace) {
-                $messages[] = sprintf("<comment>Available commands for the \"%s\" namespace:</comment>", $describedNamespace);
+                $messages[] = sprintf('<comment>Available commands for the "%s" namespace:</comment>', $describedNamespace);
             } else {
                 $messages[] = '<comment>Available commands:</comment>';
             }
@@ -186,7 +186,7 @@ class TextDescriptor extends Descriptor
      */
     private function formatDefaultValue($default)
     {
-        if (version_compare(PHP_VERSION, '5.4', '<')) {
+        if (PHP_VERSION_ID < 50400) {
             return str_replace('\/', '/', json_encode($default));
         }
 
--- a/vendor/symfony/console/Symfony/Component/Console/Event/ConsoleExceptionEvent.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Event/ConsoleExceptionEvent.php
@@ -58,7 +58,7 @@ class ConsoleExceptionEvent extends ConsoleEvent
     /**
      * Gets the exit code.
      *
-     * @return int     The command exit code
+     * @return int The command exit code
      */
     public function getExitCode()
     {
--- a/vendor/symfony/console/Symfony/Component/Console/Event/ConsoleTerminateEvent.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Event/ConsoleTerminateEvent.php
@@ -39,7 +39,7 @@ class ConsoleTerminateEvent extends ConsoleEvent
     /**
      * Sets the exit code.
      *
-     * @param int     $exitCode The command exit code
+     * @param int $exitCode The command exit code
      */
     public function setExitCode($exitCode)
     {
@@ -49,7 +49,7 @@ class ConsoleTerminateEvent extends ConsoleEvent
     /**
      * Gets the exit code.
      *
-     * @return int     The command exit code
+     * @return int The command exit code
      */
     public function getExitCode()
     {
--- a/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatter.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatter.php
@@ -15,8 +15,6 @@ namespace Symfony\Component\Console\Formatter;
  * Formatter class for console output.
  *
  * @author Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * @api
  */
 class OutputFormatter implements OutputFormatterInterface
 {
@@ -33,16 +31,14 @@ class OutputFormatter implements OutputFormatterInterface
      */
     public static function escape($text)
     {
-        return preg_replace('/([^\\\\]?)</is', '$1\\<', $text);
+        return preg_replace('/([^\\\\]?)</', '$1\\<', $text);
     }
 
     /**
      * Initializes console output formatter.
      *
-     * @param bool             $decorated Whether this formatter should actually decorate strings
+     * @param bool                            $decorated Whether this formatter should actually decorate strings
      * @param OutputFormatterStyleInterface[] $styles    Array of "name => FormatterStyle" instances
-     *
-     * @api
      */
     public function __construct($decorated = false, array $styles = array())
     {
@@ -63,9 +59,7 @@ class OutputFormatter implements OutputFormatterInterface
     /**
      * Sets the decorated flag.
      *
-     * @param bool    $decorated Whether to decorate the messages or not
-     *
-     * @api
+     * @param bool $decorated Whether to decorate the messages or not
      */
     public function setDecorated($decorated)
     {
@@ -75,9 +69,7 @@ class OutputFormatter implements OutputFormatterInterface
     /**
      * Gets the decorated flag.
      *
-     * @return bool    true if the output will decorate messages, false otherwise
-     *
-     * @api
+     * @return bool true if the output will decorate messages, false otherwise
      */
     public function isDecorated()
     {
@@ -89,8 +81,6 @@ class OutputFormatter implements OutputFormatterInterface
      *
      * @param string                        $name  The style name
      * @param OutputFormatterStyleInterface $style The style instance
-     *
-     * @api
      */
     public function setStyle($name, OutputFormatterStyleInterface $style)
     {
@@ -103,8 +93,6 @@ class OutputFormatter implements OutputFormatterInterface
      * @param string $name
      *
      * @return bool
-     *
-     * @api
      */
     public function hasStyle($name)
     {
@@ -119,8 +107,6 @@ class OutputFormatter implements OutputFormatterInterface
      * @return OutputFormatterStyleInterface
      *
      * @throws \InvalidArgumentException When style isn't defined
-     *
-     * @api
      */
     public function getStyle($name)
     {
@@ -137,19 +123,22 @@ class OutputFormatter implements OutputFormatterInterface
      * @param string $message The message to style
      *
      * @return string The styled message
-     *
-     * @api
      */
     public function format($message)
     {
+        $message = (string) $message;
         $offset = 0;
         $output = '';
         $tagRegex = '[a-z][a-z0-9_=;-]*';
-        preg_match_all("#<(($tagRegex) | /($tagRegex)?)>#isx", $message, $matches, PREG_OFFSET_CAPTURE);
+        preg_match_all("#<(($tagRegex) | /($tagRegex)?)>#ix", $message, $matches, PREG_OFFSET_CAPTURE);
         foreach ($matches[0] as $i => $match) {
             $pos = $match[1];
             $text = $match[0];
 
+            if (0 != $pos && '\\' == $message[$pos - 1]) {
+                continue;
+            }
+
             // add the text up to the next tag
             $output .= $this->applyCurrentStyle(substr($message, $offset, $pos - $offset));
             $offset = $pos + strlen($text);
@@ -164,9 +153,6 @@ class OutputFormatter implements OutputFormatterInterface
             if (!$open && !$tag) {
                 // </>
                 $this->styleStack->pop();
-            } elseif ($pos && '\\' == $message[$pos - 1]) {
-                // escaped tag
-                $output .= $this->applyCurrentStyle($text);
             } elseif (false === $style = $this->createStyleFromString(strtolower($tag))) {
                 $output .= $this->applyCurrentStyle($text);
             } elseif ($open) {
@@ -194,7 +180,7 @@ class OutputFormatter implements OutputFormatterInterface
      *
      * @param string $string
      *
-     * @return OutputFormatterStyle|bool    false if string is not format string
+     * @return OutputFormatterStyle|bool false if string is not format string
      */
     private function createStyleFromString($string)
     {
--- a/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterInterface.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterInterface.php
@@ -15,26 +15,20 @@ namespace Symfony\Component\Console\Formatter;
  * Formatter interface for console output.
  *
  * @author Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * @api
  */
 interface OutputFormatterInterface
 {
     /**
      * Sets the decorated flag.
      *
-     * @param bool    $decorated Whether to decorate the messages or not
-     *
-     * @api
+     * @param bool $decorated Whether to decorate the messages or not
      */
     public function setDecorated($decorated);
 
     /**
      * Gets the decorated flag.
      *
-     * @return bool    true if the output will decorate messages, false otherwise
-     *
-     * @api
+     * @return bool true if the output will decorate messages, false otherwise
      */
     public function isDecorated();
 
@@ -43,8 +37,6 @@ interface OutputFormatterInterface
      *
      * @param string                        $name  The style name
      * @param OutputFormatterStyleInterface $style The style instance
-     *
-     * @api
      */
     public function setStyle($name, OutputFormatterStyleInterface $style);
 
@@ -54,8 +46,6 @@ interface OutputFormatterInterface
      * @param string $name
      *
      * @return bool
-     *
-     * @api
      */
     public function hasStyle($name);
 
@@ -65,8 +55,6 @@ interface OutputFormatterInterface
      * @param string $name
      *
      * @return OutputFormatterStyleInterface
-     *
-     * @api
      */
     public function getStyle($name);
 
@@ -76,8 +64,6 @@ interface OutputFormatterInterface
      * @param string $message The message to style
      *
      * @return string The styled message
-     *
-     * @api
      */
     public function format($message);
 }
--- a/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterStyle.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterStyle.php
@@ -15,37 +15,37 @@ namespace Symfony\Component\Console\Formatter;
  * Formatter style class for defining styles.
  *
  * @author Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * @api
  */
 class OutputFormatterStyle implements OutputFormatterStyleInterface
 {
     private static $availableForegroundColors = array(
-        'black'     => 30,
-        'red'       => 31,
-        'green'     => 32,
-        'yellow'    => 33,
-        'blue'      => 34,
-        'magenta'   => 35,
-        'cyan'      => 36,
-        'white'     => 37,
+        'black' => 30,
+        'red' => 31,
+        'green' => 32,
+        'yellow' => 33,
+        'blue' => 34,
+        'magenta' => 35,
+        'cyan' => 36,
+        'white' => 37,
+        'default' => 39,
     );
     private static $availableBackgroundColors = array(
-        'black'     => 40,
-        'red'       => 41,
-        'green'     => 42,
-        'yellow'    => 43,
-        'blue'      => 44,
-        'magenta'   => 45,
-        'cyan'      => 46,
-        'white'     => 47,
+        'black' => 40,
+        'red' => 41,
+        'green' => 42,
+        'yellow' => 43,
+        'blue' => 44,
+        'magenta' => 45,
+        'cyan' => 46,
+        'white' => 47,
+        'default' => 49,
     );
     private static $availableOptions = array(
-        'bold'          => 1,
-        'underscore'    => 4,
-        'blink'         => 5,
-        'reverse'       => 7,
-        'conceal'       => 8,
+        'bold' => 1,
+        'underscore' => 4,
+        'blink' => 5,
+        'reverse' => 7,
+        'conceal' => 8,
     );
 
     private $foreground;
@@ -58,8 +58,6 @@ class OutputFormatterStyle implements OutputFormatterStyleInterface
      * @param string|null $foreground The style foreground color name
      * @param string|null $background The style background color name
      * @param array       $options    The style options
-     *
-     * @api
      */
     public function __construct($foreground = null, $background = null, array $options = array())
     {
@@ -80,8 +78,6 @@ class OutputFormatterStyle implements OutputFormatterStyleInterface
      * @param string|null $color The color name
      *
      * @throws \InvalidArgumentException When the color name isn't defined
-     *
-     * @api
      */
     public function setForeground($color = null)
     {
@@ -108,8 +104,6 @@ class OutputFormatterStyle implements OutputFormatterStyleInterface
      * @param string|null $color The color name
      *
      * @throws \InvalidArgumentException When the color name isn't defined
-     *
-     * @api
      */
     public function setBackground($color = null)
     {
@@ -136,8 +130,6 @@ class OutputFormatterStyle implements OutputFormatterStyleInterface
      * @param string $option The option name
      *
      * @throws \InvalidArgumentException When the option name isn't defined
-     *
-     * @api
      */
     public function setOption($option)
     {
@@ -149,7 +141,7 @@ class OutputFormatterStyle implements OutputFormatterStyleInterface
             ));
         }
 
-        if (false === array_search(static::$availableOptions[$option], $this->options)) {
+        if (!in_array(static::$availableOptions[$option], $this->options)) {
             $this->options[] = static::$availableOptions[$option];
         }
     }
@@ -160,7 +152,6 @@ class OutputFormatterStyle implements OutputFormatterStyleInterface
      * @param string $option The option name
      *
      * @throws \InvalidArgumentException When the option name isn't defined
-     *
      */
     public function unsetOption($option)
     {
--- a/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterStyleInterface.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterStyleInterface.php
@@ -15,8 +15,6 @@ namespace Symfony\Component\Console\Formatter;
  * Formatter style interface for defining styles.
  *
  * @author Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * @api
  */
 interface OutputFormatterStyleInterface
 {
@@ -24,8 +22,6 @@ interface OutputFormatterStyleInterface
      * Sets style foreground color.
      *
      * @param string $color The color name
-     *
-     * @api
      */
     public function setForeground($color = null);
 
@@ -33,8 +29,6 @@ interface OutputFormatterStyleInterface
      * Sets style background color.
      *
      * @param string $color The color name
-     *
-     * @api
      */
     public function setBackground($color = null);
 
@@ -42,8 +36,6 @@ interface OutputFormatterStyleInterface
      * Sets some specific style option.
      *
      * @param string $option The option name
-     *
-     * @api
      */
     public function setOption($option);
 
--- a/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterStyleStack.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterStyleStack.php
@@ -62,7 +62,7 @@ class OutputFormatterStyleStack
      *
      * @return OutputFormatterStyleInterface
      *
-     * @throws \InvalidArgumentException  When style tags incorrectly nested
+     * @throws \InvalidArgumentException When style tags incorrectly nested
      */
     public function pop(OutputFormatterStyleInterface $style = null)
     {
@@ -96,7 +96,7 @@ class OutputFormatterStyleStack
             return $this->emptyStyle;
         }
 
-        return $this->styles[count($this->styles)-1];
+        return $this->styles[count($this->styles) - 1];
     }
 
     /**
--- a/vendor/symfony/console/Symfony/Component/Console/Helper/DescriptorHelper.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Helper/DescriptorHelper.php
@@ -36,10 +36,10 @@ class DescriptorHelper extends Helper
     public function __construct()
     {
         $this
-            ->register('txt',  new TextDescriptor())
-            ->register('xml',  new XmlDescriptor())
+            ->register('txt', new TextDescriptor())
+            ->register('xml', new XmlDescriptor())
             ->register('json', new JsonDescriptor())
-            ->register('md',   new MarkdownDescriptor())
+            ->register('md', new MarkdownDescriptor())
         ;
     }
 
--- a/vendor/symfony/console/Symfony/Component/Console/Helper/DialogHelper.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Helper/DialogHelper.php
@@ -32,11 +32,11 @@ class DialogHelper extends Helper
      * @param string|array    $question     The question to ask
      * @param array           $choices      List of choices to pick from
      * @param bool|string     $default      The default answer if the user enters nothing
-     * @param bool|int        $attempts Max number of times to ask before giving up (false by default, which means infinite)
+     * @param bool|int        $attempts     Max number of times to ask before giving up (false by default, which means infinite)
      * @param string          $errorMessage Message which will be shown if invalid value from choice list would be picked
      * @param bool            $multiselect  Select more than one value separated by comma
      *
-     * @return int|string|array     The selected value or values (the key of the choices array)
+     * @return int|string|array The selected value or values (the key of the choices array)
      *
      * @throws \InvalidArgumentException
      */
@@ -53,14 +53,14 @@ class DialogHelper extends Helper
 
         $result = $this->askAndValidate($output, '> ', function ($picked) use ($choices, $errorMessage, $multiselect) {
             // Collapse all spaces.
-            $selectedChoices = str_replace(" ", "", $picked);
+            $selectedChoices = str_replace(' ', '', $picked);
 
             if ($multiselect) {
                 // Check for a separated comma values
                 if (!preg_match('/^[a-zA-Z0-9_-]+(?:,[a-zA-Z0-9_-]+)*$/', $selectedChoices, $matches)) {
                     throw new \InvalidArgumentException(sprintf($errorMessage, $picked));
                 }
-                $selectedChoices = explode(",", $selectedChoices);
+                $selectedChoices = explode(',', $selectedChoices);
             } else {
                 $selectedChoices = array($picked);
             }
@@ -71,7 +71,7 @@ class DialogHelper extends Helper
                 if (empty($choices[$value])) {
                     throw new \InvalidArgumentException(sprintf($errorMessage, $value));
                 }
-                array_push($multiselectChoices, $value);
+                $multiselectChoices[] = $value;
             }
 
             if ($multiselect) {
@@ -131,7 +131,7 @@ class DialogHelper extends Helper
                 // Backspace Character
                 if ("\177" === $c) {
                     if (0 === $numMatches && 0 !== $i) {
-                        $i--;
+                        --$i;
                         // Move cursor backwards
                         $output->write("\033[1D");
                     }
@@ -184,7 +184,7 @@ class DialogHelper extends Helper
                 } else {
                     $output->write($c);
                     $ret .= $c;
-                    $i++;
+                    ++$i;
 
                     $numMatches = 0;
                     $ofs = 0;
@@ -226,7 +226,7 @@ class DialogHelper extends Helper
      * @param string|array    $question The question to ask
      * @param bool            $default  The default answer if the user enters nothing
      *
-     * @return bool    true if the user has confirmed, false otherwise
+     * @return bool true if the user has confirmed, false otherwise
      */
     public function askConfirmation(OutputInterface $output, $question, $default = true)
     {
@@ -243,19 +243,19 @@ class DialogHelper extends Helper
     }
 
     /**
-     * Asks a question to the user, the response is hidden
+     * Asks a question to the user, the response is hidden.
      *
      * @param OutputInterface $output   An Output instance
      * @param string|array    $question The question
      * @param bool            $fallback In case the response can not be hidden, whether to fallback on non-hidden question or not
      *
-     * @return string         The answer
+     * @return string The answer
      *
      * @throws \RuntimeException In case the fallback is deactivated and the response can not be hidden
      */
     public function askHiddenResponse(OutputInterface $output, $question, $fallback = true)
     {
-        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
+        if ('\\' === DIRECTORY_SEPARATOR) {
             $exe = __DIR__.'/../Resources/bin/hiddeninput.exe';
 
             // handle code running from a phar
@@ -354,11 +354,10 @@ class DialogHelper extends Helper
      * @param int|false       $attempts  Max number of times to ask before giving up (false by default, which means infinite)
      * @param bool            $fallback  In case the response can not be hidden, whether to fallback on non-hidden question or not
      *
-     * @return string         The response
+     * @return string The response
      *
      * @throws \Exception        When any of the validators return an error
      * @throws \RuntimeException In case the fallback is deactivated and the response can not be hidden
-     *
      */
     public function askHiddenResponseAndValidate(OutputInterface $output, $question, $validator, $attempts = false, $fallback = true)
     {
@@ -384,9 +383,9 @@ class DialogHelper extends Helper
     }
 
     /**
-     * Returns the helper's input stream
+     * Returns the helper's input stream.
      *
-     * @return string
+     * @return resource|null The input stream or null if the default STDIN is used
      */
     public function getInputStream()
     {
@@ -402,9 +401,9 @@ class DialogHelper extends Helper
     }
 
     /**
-     * Return a valid Unix shell
+     * Return a valid Unix shell.
      *
-     * @return string|bool     The valid shell name, false in case no valid shell is found
+     * @return string|bool The valid shell name, false in case no valid shell is found
      */
     private function getShell()
     {
@@ -440,31 +439,31 @@ class DialogHelper extends Helper
     }
 
     /**
-     * Validate an attempt
+     * Validate an attempt.
      *
-     * @param callable         $interviewer  A callable that will ask for a question and return the result
-     * @param OutputInterface  $output       An Output instance
-     * @param callable         $validator    A PHP callback
-     * @param int|false        $attempts     Max number of times to ask before giving up ; false will ask infinitely
+     * @param callable        $interviewer A callable that will ask for a question and return the result
+     * @param OutputInterface $output      An Output instance
+     * @param callable        $validator   A PHP callback
+     * @param int|false       $attempts    Max number of times to ask before giving up ; false will ask infinitely
      *
-     * @return string   The validated response
+     * @return string The validated response
      *
      * @throws \Exception In case the max number of attempts has been reached and no valid response has been given
      */
     private function validateAttempts($interviewer, OutputInterface $output, $validator, $attempts)
     {
-        $error = null;
+        $e = null;
         while (false === $attempts || $attempts--) {
-            if (null !== $error) {
-                $output->writeln($this->getHelperSet()->get('formatter')->formatBlock($error->getMessage(), 'error'));
+            if (null !== $e) {
+                $output->writeln($this->getHelperSet()->get('formatter')->formatBlock($e->getMessage(), 'error'));
             }
 
             try {
                 return call_user_func($validator, $interviewer());
-            } catch (\Exception $error) {
+            } catch (\Exception $e) {
             }
         }
 
-        throw $error;
+        throw $e;
     }
 }
--- a/vendor/symfony/console/Symfony/Component/Console/Helper/FormatterHelper.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Helper/FormatterHelper.php
@@ -45,7 +45,9 @@ class FormatterHelper extends Helper
      */
     public function formatBlock($messages, $style, $large = false)
     {
-        $messages = (array) $messages;
+        if (!is_array($messages)) {
+            $messages = array($messages);
+        }
 
         $len = 0;
         $lines = array();
@@ -56,15 +58,15 @@ class FormatterHelper extends Helper
         }
 
         $messages = $large ? array(str_repeat(' ', $len)) : array();
-        foreach ($lines as $line) {
-            $messages[] = $line.str_repeat(' ', $len - $this->strlen($line));
+        for ($i = 0; isset($lines[$i]); ++$i) {
+            $messages[] = $lines[$i].str_repeat(' ', $len - $this->strlen($lines[$i]));
         }
         if ($large) {
             $messages[] = str_repeat(' ', $len);
         }
 
-        foreach ($messages as &$message) {
-            $message = sprintf('<%s>%s</%s>', $style, $message, $style);
+        for ($i = 0; isset($messages[$i]); ++$i) {
+            $messages[$i] = sprintf('<%s>%s</%s>', $style, $messages[$i], $style);
         }
 
         return implode("\n", $messages);
--- a/vendor/symfony/console/Symfony/Component/Console/Helper/Helper.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Helper/Helper.php
@@ -41,11 +41,11 @@ abstract class Helper implements HelperInterface
     }
 
     /**
-     * Returns the length of a string, using mb_strlen if it is available.
+     * Returns the length of a string, using mb_strwidth if it is available.
      *
      * @param string $string The string to check its length
      *
-     * @return int     The length of the string
+     * @return int The length of the string
      */
     protected function strlen($string)
     {
@@ -53,7 +53,7 @@ abstract class Helper implements HelperInterface
             return strlen($string);
         }
 
-        if (false === $encoding = mb_detect_encoding($string)) {
+        if (false === $encoding = mb_detect_encoding($string, null, true)) {
             return strlen($string);
         }
 
--- a/vendor/symfony/console/Symfony/Component/Console/Helper/HelperInterface.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Helper/HelperInterface.php
@@ -15,8 +15,6 @@ namespace Symfony\Component\Console\Helper;
  * HelperInterface is the interface all helpers must implement.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 interface HelperInterface
 {
@@ -24,8 +22,6 @@ interface HelperInterface
      * Sets the helper set associated with this helper.
      *
      * @param HelperSet $helperSet A HelperSet instance
-     *
-     * @api
      */
     public function setHelperSet(HelperSet $helperSet = null);
 
@@ -33,8 +29,6 @@ interface HelperInterface
      * Gets the helper set associated with this helper.
      *
      * @return HelperSet A HelperSet instance
-     *
-     * @api
      */
     public function getHelperSet();
 
@@ -42,8 +36,6 @@ interface HelperInterface
      * Returns the canonical name of this helper.
      *
      * @return string The canonical name
-     *
-     * @api
      */
     public function getName();
 }
--- a/vendor/symfony/console/Symfony/Component/Console/Helper/HelperSet.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Helper/HelperSet.php
@@ -57,7 +57,7 @@ class HelperSet
      *
      * @param string $name The helper name
      *
-     * @return bool    true if the helper is defined, false otherwise
+     * @return bool true if the helper is defined, false otherwise
      */
     public function has($name)
     {
--- a/vendor/symfony/console/Symfony/Component/Console/Helper/ProgressHelper.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Helper/ProgressHelper.php
@@ -21,20 +21,20 @@ use Symfony\Component\Console\Output\OutputInterface;
  */
 class ProgressHelper extends Helper
 {
-    const FORMAT_QUIET         = ' %percent%%';
-    const FORMAT_NORMAL        = ' %current%/%max% [%bar%] %percent%%';
-    const FORMAT_VERBOSE       = ' %current%/%max% [%bar%] %percent%% Elapsed: %elapsed%';
-    const FORMAT_QUIET_NOMAX   = ' %current%';
-    const FORMAT_NORMAL_NOMAX  = ' %current% [%bar%]';
+    const FORMAT_QUIET = ' %percent%%';
+    const FORMAT_NORMAL = ' %current%/%max% [%bar%] %percent%%';
+    const FORMAT_VERBOSE = ' %current%/%max% [%bar%] %percent%% Elapsed: %elapsed%';
+    const FORMAT_QUIET_NOMAX = ' %current%';
+    const FORMAT_NORMAL_NOMAX = ' %current% [%bar%]';
     const FORMAT_VERBOSE_NOMAX = ' %current% [%bar%] Elapsed: %elapsed%';
 
     // options
-    private $barWidth     = 28;
-    private $barChar      = '=';
+    private $barWidth = 28;
+    private $barChar = '=';
     private $emptyBarChar = '-';
     private $progressChar = '>';
-    private $format       = null;
-    private $redrawFreq   = 1;
+    private $format = null;
+    private $redrawFreq = 1;
 
     private $lastMessagesLength;
     private $barCharOriginal;
@@ -45,28 +45,28 @@ class ProgressHelper extends Helper
     private $output;
 
     /**
-     * Current step
+     * Current step.
      *
      * @var int
      */
     private $current;
 
     /**
-     * Maximum number of steps
+     * Maximum number of steps.
      *
      * @var int
      */
     private $max;
 
     /**
-     * Start time of the progress bar
+     * Start time of the progress bar.
      *
      * @var int
      */
     private $startTime;
 
     /**
-     * List of formatting variables
+     * List of formatting variables.
      *
      * @var array
      */
@@ -79,26 +79,26 @@ class ProgressHelper extends Helper
     );
 
     /**
-     * Available formatting variables
+     * Available formatting variables.
      *
      * @var array
      */
     private $formatVars;
 
     /**
-     * Stored format part widths (used for padding)
+     * Stored format part widths (used for padding).
      *
      * @var array
      */
     private $widths = array(
         'current' => 4,
-        'max'     => 4,
+        'max' => 4,
         'percent' => 3,
         'elapsed' => 6,
     );
 
     /**
-     * Various time formats
+     * Various time formats.
      *
      * @var array
      */
@@ -183,9 +183,9 @@ class ProgressHelper extends Helper
     public function start(OutputInterface $output, $max = null)
     {
         $this->startTime = time();
-        $this->current   = 0;
-        $this->max       = (int) $max;
-        $this->output    = $output;
+        $this->current = 0;
+        $this->max = (int) $max;
+        $this->output = $output;
         $this->lastMessagesLength = 0;
         $this->barCharOriginal = '';
 
@@ -220,8 +220,8 @@ class ProgressHelper extends Helper
     /**
      * Advances the progress output X steps.
      *
-     * @param int     $step   Number of steps to advance
-     * @param bool    $redraw Whether to redraw or not
+     * @param int  $step   Number of steps to advance
+     * @param bool $redraw Whether to redraw or not
      *
      * @throws \LogicException
      */
@@ -235,11 +235,11 @@ class ProgressHelper extends Helper
             $redraw = true;
         }
 
-        $prevPeriod = intval($this->current / $this->redrawFreq);
+        $prevPeriod = (int) ($this->current / $this->redrawFreq);
 
         $this->current += $step;
 
-        $currPeriod = intval($this->current / $this->redrawFreq);
+        $currPeriod = (int) ($this->current / $this->redrawFreq);
         if ($redraw || $prevPeriod !== $currPeriod || $this->max === $this->current) {
             $this->display();
         }
@@ -248,8 +248,8 @@ class ProgressHelper extends Helper
     /**
      * Sets the current progress.
      *
-     * @param int     $current The current progress
-     * @param bool    $redraw  Whether to redraw or not
+     * @param int  $current The current progress
+     * @param bool $redraw  Whether to redraw or not
      *
      * @throws \LogicException
      */
@@ -269,11 +269,11 @@ class ProgressHelper extends Helper
             $redraw = true;
         }
 
-        $prevPeriod = intval($this->current / $this->redrawFreq);
+        $prevPeriod = (int) ($this->current / $this->redrawFreq);
 
         $this->current = $current;
 
-        $currPeriod = intval($this->current / $this->redrawFreq);
+        $currPeriod = (int) ($this->current / $this->redrawFreq);
         if ($redraw || $prevPeriod !== $currPeriod || $this->max === $this->current) {
             $this->display();
         }
@@ -282,7 +282,7 @@ class ProgressHelper extends Helper
     /**
      * Outputs the current progress string.
      *
-     * @param bool    $finish Forces the end result
+     * @param bool $finish Forces the end result
      *
      * @throws \LogicException
      */
@@ -332,24 +332,24 @@ class ProgressHelper extends Helper
         }
 
         if ($this->max > 0) {
-            $this->widths['max']     = $this->strlen($this->max);
+            $this->widths['max'] = $this->strlen($this->max);
             $this->widths['current'] = $this->widths['max'];
         } else {
             $this->barCharOriginal = $this->barChar;
-            $this->barChar         = $this->emptyBarChar;
+            $this->barChar = $this->emptyBarChar;
         }
     }
 
     /**
      * Generates the array map of format variables to values.
      *
-     * @param bool    $finish Forces the end result
+     * @param bool $finish Forces the end result
      *
      * @return array Array of format vars and values
      */
     private function generate($finish = false)
     {
-        $vars    = array();
+        $vars = array();
         $percent = 0;
         if ($this->max > 0) {
             $percent = (float) $this->current / $this->max;
@@ -401,7 +401,7 @@ class ProgressHelper extends Helper
     /**
      * Converts seconds into human-readable format.
      *
-     * @param int     $secs Number of seconds
+     * @param int $secs Number of seconds
      *
      * @return string Time in readable format
      */
@@ -426,8 +426,8 @@ class ProgressHelper extends Helper
     /**
      * Overwrites a previous message to the output.
      *
-     * @param OutputInterface $output   An Output instance
-     * @param string          $message  The message
+     * @param OutputInterface $output  An Output instance
+     * @param string          $message The message
      */
     private function overwrite(OutputInterface $output, $message)
     {
--- a/vendor/symfony/console/Symfony/Component/Console/Helper/TableHelper.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Helper/TableHelper.php
@@ -12,7 +12,6 @@
 namespace Symfony\Component\Console\Helper;
 
 use Symfony\Component\Console\Output\OutputInterface;
-use InvalidArgumentException;
 
 /**
  * Provides helpers to display table output.
@@ -79,7 +78,7 @@ class TableHelper extends Helper
      *
      * @return TableHelper
      *
-     * @throws InvalidArgumentException when the table layout is not known
+     * @throws \InvalidArgumentException when the table layout is not known
      */
     public function setLayout($layout)
     {
@@ -111,8 +110,7 @@ class TableHelper extends Helper
                 break;
 
             default:
-                throw new InvalidArgumentException(sprintf('Invalid table layout "%s".', $layout));
-                break;
+                throw new \InvalidArgumentException(sprintf('Invalid table layout "%s".', $layout));
         };
 
         return $this;
@@ -145,11 +143,12 @@ class TableHelper extends Helper
     {
         $this->rows[] = array_values($row);
 
-        $keys = array_keys($this->rows);
-        $rowKey = array_pop($keys);
+        end($this->rows);
+        $rowKey = key($this->rows);
+        reset($this->rows);
 
         foreach ($row as $key => $cellValue) {
-            if (!strstr($cellValue, "\n")) {
+            if (false === strpos($cellValue, "\n")) {
                 continue;
             }
 
@@ -279,7 +278,7 @@ class TableHelper extends Helper
     /**
      * Sets cell padding type.
      *
-     * @param int     $padType STR_PAD_*
+     * @param int $padType STR_PAD_*
      *
      * @return TableHelper
      */
@@ -335,7 +334,7 @@ class TableHelper extends Helper
         }
 
         $markup = $this->crossingChar;
-        for ($column = 0; $column < $count; $column++) {
+        for ($column = 0; $column < $count; ++$column) {
             $markup .= str_repeat($this->horizontalBorderChar, $this->getColumnWidth($column))
                     .$this->crossingChar
             ;
@@ -367,7 +366,7 @@ class TableHelper extends Helper
         }
 
         $this->renderColumnSeparator();
-        for ($column = 0, $count = $this->getNumberOfColumns(); $column < $count; $column++) {
+        for ($column = 0, $count = $this->getNumberOfColumns(); $column < $count; ++$column) {
             $this->renderCell($row, $column, $cellFormat);
             $this->renderColumnSeparator();
         }
@@ -377,9 +376,9 @@ class TableHelper extends Helper
     /**
      * Renders table cell with padding.
      *
-     * @param array   $row
-     * @param int     $column
-     * @param string  $cellFormat
+     * @param array  $row
+     * @param int    $column
+     * @param string $cellFormat
      */
     private function renderCell(array $row, $column, $cellFormat)
     {
@@ -387,8 +386,8 @@ class TableHelper extends Helper
         $width = $this->getColumnWidth($column);
 
         // str_pad won't work properly with multi-byte strings, we need to fix the padding
-        if (function_exists('mb_strlen') && false !== $encoding = mb_detect_encoding($cell)) {
-            $width += strlen($cell) - mb_strlen($cell, $encoding);
+        if (function_exists('mb_strwidth') && false !== $encoding = mb_detect_encoding($cell, null, true)) {
+            $width += strlen($cell) - mb_strwidth($cell, $encoding);
         }
 
         $width += $this->strlen($cell) - $this->computeLengthWithoutDecoration($cell);
@@ -427,7 +426,7 @@ class TableHelper extends Helper
     /**
      * Gets column width.
      *
-     * @param int     $column
+     * @param int $column
      *
      * @return int
      */
@@ -449,8 +448,8 @@ class TableHelper extends Helper
     /**
      * Gets cell width.
      *
-     * @param array   $row
-     * @param int     $column
+     * @param array $row
+     * @param int   $column
      *
      * @return int
      */
--- a/vendor/symfony/console/Symfony/Component/Console/Input/ArgvInput.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Input/ArgvInput.php
@@ -33,10 +33,8 @@ namespace Symfony\Component\Console\Input;
  *
  * @author Fabien Potencier <fabien@symfony.com>
  *
- * @see    http://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html
- * @see    http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html#tag_12_02
- *
- * @api
+ * @see http://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html
+ * @see http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html#tag_12_02
  */
 class ArgvInput extends Input
 {
@@ -48,8 +46,6 @@ class ArgvInput extends Input
      *
      * @param array           $argv       An array of parameters from the CLI (in the argv format)
      * @param InputDefinition $definition A InputDefinition instance
-     *
-     * @api
      */
     public function __construct(array $argv = null, InputDefinition $definition = null)
     {
@@ -123,7 +119,7 @@ class ArgvInput extends Input
     private function parseShortOptionSet($name)
     {
         $len = strlen($name);
-        for ($i = 0; $i < $len; $i++) {
+        for ($i = 0; $i < $len; ++$i) {
             if (!$this->definition->hasShortcut($name[$i])) {
                 throw new \RuntimeException(sprintf('The "-%s" option does not exist.', $name[$i]));
             }
@@ -215,13 +211,13 @@ class ArgvInput extends Input
 
         $option = $this->definition->getOption($name);
 
-        // Convert false values (from a previous call to substr()) to null
-        if (false === $value) {
+        // Convert empty values to null
+        if (!isset($value[0])) {
             $value = null;
         }
 
         if (null !== $value && !$option->acceptValue()) {
-            throw new \RuntimeException(sprintf('The "--%s" option does not accept a value.', $name, $value));
+            throw new \RuntimeException(sprintf('The "--%s" option does not accept a value.', $name));
         }
 
         if (null === $value && $option->acceptValue() && count($this->parsed)) {
@@ -278,7 +274,7 @@ class ArgvInput extends Input
      *
      * @param string|array $values The value(s) to look for in the raw parameters (can be an array)
      *
-     * @return bool    true if the value is contained in the raw parameters
+     * @return bool true if the value is contained in the raw parameters
      */
     public function hasParameterOption($values)
     {
@@ -309,9 +305,11 @@ class ArgvInput extends Input
     public function getParameterOption($values, $default = false)
     {
         $values = (array) $values;
-
         $tokens = $this->tokens;
-        while ($token = array_shift($tokens)) {
+
+        while (0 < count($tokens)) {
+            $token = array_shift($tokens);
+
             foreach ($values as $value) {
                 if ($token === $value || 0 === strpos($token, $value.'=')) {
                     if (false !== $pos = strpos($token, '=')) {
@@ -327,7 +325,7 @@ class ArgvInput extends Input
     }
 
     /**
-     * Returns a stringified representation of the args passed to the command
+     * Returns a stringified representation of the args passed to the command.
      *
      * @return string
      */
--- a/vendor/symfony/console/Symfony/Component/Console/Input/ArrayInput.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Input/ArrayInput.php
@@ -19,8 +19,6 @@ namespace Symfony\Component\Console\Input;
  *     $input = new ArrayInput(array('name' => 'foo', '--bar' => 'foobar'));
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class ArrayInput extends Input
 {
@@ -31,8 +29,6 @@ class ArrayInput extends Input
      *
      * @param array           $parameters An array of parameters
      * @param InputDefinition $definition A InputDefinition instance
-     *
-     * @api
      */
     public function __construct(array $parameters, InputDefinition $definition = null)
     {
@@ -65,7 +61,7 @@ class ArrayInput extends Input
      *
      * @param string|array $values The values to look for in the raw parameters (can be an array)
      *
-     * @return bool    true if the value is contained in the raw parameters
+     * @return bool true if the value is contained in the raw parameters
      */
     public function hasParameterOption($values)
     {
@@ -100,8 +96,10 @@ class ArrayInput extends Input
         $values = (array) $values;
 
         foreach ($this->parameters as $k => $v) {
-            if (is_int($k) && in_array($v, $values)) {
-                return true;
+            if (is_int($k)) {
+                if (in_array($v, $values)) {
+                    return true;
+                }
             } elseif (in_array($k, $values)) {
                 return $v;
             }
@@ -111,7 +109,7 @@ class ArrayInput extends Input
     }
 
     /**
-     * Returns a stringified representation of the args passed to the command
+     * Returns a stringified representation of the args passed to the command.
      *
      * @return string
      */
--- a/vendor/symfony/console/Symfony/Component/Console/Input/Input.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Input/Input.php
@@ -72,15 +72,22 @@ abstract class Input implements InputInterface
      */
     public function validate()
     {
-        if (count($this->arguments) < $this->definition->getArgumentRequiredCount()) {
-            throw new \RuntimeException('Not enough arguments.');
+        $definition = $this->definition;
+        $givenArguments = $this->arguments;
+
+        $missingArguments = array_filter(array_keys($definition->getArguments()), function ($argument) use ($definition, $givenArguments) {
+            return !array_key_exists($argument, $givenArguments) && $definition->getArgument($argument)->isRequired();
+        });
+
+        if (count($missingArguments) > 0) {
+            throw new \RuntimeException(sprintf('Not enough arguments (missing: "%s").', implode(', ', $missingArguments)));
         }
     }
 
     /**
      * Checks if the input is interactive.
      *
-     * @return bool    Returns true if the input is interactive
+     * @return bool Returns true if the input is interactive
      */
     public function isInteractive()
     {
@@ -90,7 +97,7 @@ abstract class Input implements InputInterface
     /**
      * Sets the input interactivity.
      *
-     * @param bool    $interactive If the input should be interactive
+     * @param bool $interactive If the input should be interactive
      */
     public function setInteractive($interactive)
     {
@@ -145,9 +152,9 @@ abstract class Input implements InputInterface
     /**
      * Returns true if an InputArgument object exists by name or position.
      *
-     * @param string|int     $name The InputArgument name or position
+     * @param string|int $name The InputArgument name or position
      *
-     * @return bool    true if the InputArgument object exists, false otherwise
+     * @return bool true if the InputArgument object exists, false otherwise
      */
     public function hasArgument($name)
     {
@@ -185,8 +192,8 @@ abstract class Input implements InputInterface
     /**
      * Sets an option value by name.
      *
-     * @param string         $name  The option name
-     * @param string|bool    $value The option value
+     * @param string      $name  The option name
+     * @param string|bool $value The option value
      *
      * @throws \InvalidArgumentException When option given doesn't exist
      */
@@ -204,7 +211,7 @@ abstract class Input implements InputInterface
      *
      * @param string $name The InputOption name
      *
-     * @return bool    true if the InputOption object exists, false otherwise
+     * @return bool true if the InputOption object exists, false otherwise
      */
     public function hasOption($name)
     {
@@ -212,7 +219,7 @@ abstract class Input implements InputInterface
     }
 
     /**
-     * Escapes a token through escapeshellarg if it contains unsafe chars
+     * Escapes a token through escapeshellarg if it contains unsafe chars.
      *
      * @param string $token
      *
--- a/vendor/symfony/console/Symfony/Component/Console/Input/InputArgument.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Input/InputArgument.php
@@ -15,8 +15,6 @@ namespace Symfony\Component\Console\Input;
  * Represents a command line argument.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class InputArgument
 {
@@ -32,14 +30,12 @@ class InputArgument
     /**
      * Constructor.
      *
-     * @param string  $name        The argument name
-     * @param int     $mode        The argument mode: self::REQUIRED or self::OPTIONAL
-     * @param string  $description A description text
-     * @param mixed   $default     The default value (for self::OPTIONAL mode only)
+     * @param string $name        The argument name
+     * @param int    $mode        The argument mode: self::REQUIRED or self::OPTIONAL
+     * @param string $description A description text
+     * @param mixed  $default     The default value (for self::OPTIONAL mode only)
      *
      * @throws \InvalidArgumentException When argument mode is not valid
-     *
-     * @api
      */
     public function __construct($name, $mode = null, $description = '', $default = null)
     {
@@ -49,8 +45,8 @@ class InputArgument
             throw new \InvalidArgumentException(sprintf('Argument mode "%s" is not valid.', $mode));
         }
 
-        $this->name        = $name;
-        $this->mode        = $mode;
+        $this->name = $name;
+        $this->mode = $mode;
         $this->description = $description;
 
         $this->setDefault($default);
@@ -69,7 +65,7 @@ class InputArgument
     /**
      * Returns true if the argument is required.
      *
-     * @return bool    true if parameter mode is self::REQUIRED, false otherwise
+     * @return bool true if parameter mode is self::REQUIRED, false otherwise
      */
     public function isRequired()
     {
@@ -79,7 +75,7 @@ class InputArgument
     /**
      * Returns true if the argument can take multiple values.
      *
-     * @return bool    true if mode is self::IS_ARRAY, false otherwise
+     * @return bool true if mode is self::IS_ARRAY, false otherwise
      */
     public function isArray()
     {
--- a/vendor/symfony/console/Symfony/Component/Console/Input/InputDefinition.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Input/InputDefinition.php
@@ -11,11 +11,6 @@
 
 namespace Symfony\Component\Console\Input;
 
-if (!defined('JSON_UNESCAPED_UNICODE')) {
-    define('JSON_UNESCAPED_SLASHES', 64);
-    define('JSON_UNESCAPED_UNICODE', 256);
-}
-
 use Symfony\Component\Console\Descriptor\TextDescriptor;
 use Symfony\Component\Console\Descriptor\XmlDescriptor;
 
@@ -30,8 +25,6 @@ use Symfony\Component\Console\Descriptor\XmlDescriptor;
  *     ));
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class InputDefinition
 {
@@ -46,8 +39,6 @@ class InputDefinition
      * Constructor.
      *
      * @param array $definition An array of InputArgument and InputOption instance
-     *
-     * @api
      */
     public function __construct(array $definition = array())
     {
@@ -58,8 +49,6 @@ class InputDefinition
      * Sets the definition of the input.
      *
      * @param array $definition The definition array
-     *
-     * @api
      */
     public function setDefinition(array $definition)
     {
@@ -81,14 +70,12 @@ class InputDefinition
      * Sets the InputArgument objects.
      *
      * @param InputArgument[] $arguments An array of InputArgument objects
-     *
-     * @api
      */
     public function setArguments($arguments = array())
     {
-        $this->arguments          = array();
-        $this->requiredCount      = 0;
-        $this->hasOptional        = false;
+        $this->arguments = array();
+        $this->requiredCount = 0;
+        $this->hasOptional = false;
         $this->hasAnArrayArgument = false;
         $this->addArguments($arguments);
     }
@@ -97,8 +84,6 @@ class InputDefinition
      * Adds an array of InputArgument objects.
      *
      * @param InputArgument[] $arguments An array of InputArgument objects
-     *
-     * @api
      */
     public function addArguments($arguments = array())
     {
@@ -115,8 +100,6 @@ class InputDefinition
      * @param InputArgument $argument An InputArgument object
      *
      * @throws \LogicException When incorrect argument is given
-     *
-     * @api
      */
     public function addArgument(InputArgument $argument)
     {
@@ -148,13 +131,11 @@ class InputDefinition
     /**
      * Returns an InputArgument by name or by position.
      *
-     * @param string|int     $name The InputArgument name or position
+     * @param string|int $name The InputArgument name or position
      *
      * @return InputArgument An InputArgument object
      *
      * @throws \InvalidArgumentException When argument given doesn't exist
-     *
-     * @api
      */
     public function getArgument($name)
     {
@@ -170,11 +151,9 @@ class InputDefinition
     /**
      * Returns true if an InputArgument object exists by name or position.
      *
-     * @param string|int     $name The InputArgument name or position
+     * @param string|int $name The InputArgument name or position
      *
-     * @return bool    true if the InputArgument object exists, false otherwise
-     *
-     * @api
+     * @return bool true if the InputArgument object exists, false otherwise
      */
     public function hasArgument($name)
     {
@@ -187,8 +166,6 @@ class InputDefinition
      * Gets the array of InputArgument objects.
      *
      * @return InputArgument[] An array of InputArgument objects
-     *
-     * @api
      */
     public function getArguments()
     {
@@ -198,7 +175,7 @@ class InputDefinition
     /**
      * Returns the number of InputArguments.
      *
-     * @return int     The number of InputArguments
+     * @return int The number of InputArguments
      */
     public function getArgumentCount()
     {
@@ -208,7 +185,7 @@ class InputDefinition
     /**
      * Returns the number of required InputArguments.
      *
-     * @return int     The number of required InputArguments
+     * @return int The number of required InputArguments
      */
     public function getArgumentRequiredCount()
     {
@@ -234,8 +211,6 @@ class InputDefinition
      * Sets the InputOption objects.
      *
      * @param InputOption[] $options An array of InputOption objects
-     *
-     * @api
      */
     public function setOptions($options = array())
     {
@@ -248,8 +223,6 @@ class InputDefinition
      * Adds an array of InputOption objects.
      *
      * @param InputOption[] $options An array of InputOption objects
-     *
-     * @api
      */
     public function addOptions($options = array())
     {
@@ -264,8 +237,6 @@ class InputDefinition
      * @param InputOption $option An InputOption object
      *
      * @throws \LogicException When option given already exist
-     *
-     * @api
      */
     public function addOption(InputOption $option)
     {
@@ -297,8 +268,6 @@ class InputDefinition
      * @return InputOption A InputOption object
      *
      * @throws \InvalidArgumentException When option given doesn't exist
-     *
-     * @api
      */
     public function getOption($name)
     {
@@ -314,9 +283,7 @@ class InputDefinition
      *
      * @param string $name The InputOption name
      *
-     * @return bool    true if the InputOption object exists, false otherwise
-     *
-     * @api
+     * @return bool true if the InputOption object exists, false otherwise
      */
     public function hasOption($name)
     {
@@ -327,8 +294,6 @@ class InputDefinition
      * Gets the array of InputOption objects.
      *
      * @return InputOption[] An array of InputOption objects
-     *
-     * @api
      */
     public function getOptions()
     {
@@ -340,7 +305,7 @@ class InputDefinition
      *
      * @param string $name The InputOption shortcut
      *
-     * @return bool    true if the InputOption object exists, false otherwise
+     * @return bool true if the InputOption object exists, false otherwise
      */
     public function hasShortcut($name)
     {
@@ -433,7 +398,7 @@ class InputDefinition
     /**
      * Returns an XML representation of the InputDefinition.
      *
-     * @param bool    $asDom Whether to return a DOM or an XML string
+     * @param bool $asDom Whether to return a DOM or an XML string
      *
      * @return string|\DOMDocument An XML string representing the InputDefinition
      *
--- a/vendor/symfony/console/Symfony/Component/Console/Input/InputInterface.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Input/InputInterface.php
@@ -33,7 +33,7 @@ interface InputInterface
      *
      * @param string|array $values The values to look for in the raw parameters (can be an array)
      *
-     * @return bool    true if the value is contained in the raw parameters
+     * @return bool true if the value is contained in the raw parameters
      */
     public function hasParameterOption($values);
 
@@ -95,9 +95,9 @@ interface InputInterface
     /**
      * Returns true if an InputArgument object exists by name or position.
      *
-     * @param string|int     $name The InputArgument name or position
+     * @param string|int $name The InputArgument name or position
      *
-     * @return bool    true if the InputArgument object exists, false otherwise
+     * @return bool true if the InputArgument object exists, false otherwise
      */
     public function hasArgument($name);
 
@@ -120,8 +120,8 @@ interface InputInterface
     /**
      * Sets an option value by name.
      *
-     * @param string         $name  The option name
-     * @param string|bool    $value The option value
+     * @param string      $name  The option name
+     * @param string|bool $value The option value
      *
      * @throws \InvalidArgumentException When option given doesn't exist
      */
@@ -132,7 +132,7 @@ interface InputInterface
      *
      * @param string $name The InputOption name
      *
-     * @return bool    true if the InputOption object exists, false otherwise
+     * @return bool true if the InputOption object exists, false otherwise
      */
     public function hasOption($name);
 
@@ -146,7 +146,7 @@ interface InputInterface
     /**
      * Sets the input interactivity.
      *
-     * @param bool    $interactive If the input should be interactive
+     * @param bool $interactive If the input should be interactive
      */
     public function setInteractive($interactive);
 }
--- a/vendor/symfony/console/Symfony/Component/Console/Input/InputOption.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Input/InputOption.php
@@ -15,12 +15,10 @@ namespace Symfony\Component\Console\Input;
  * Represents a command line option.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class InputOption
 {
-    const VALUE_NONE     = 1;
+    const VALUE_NONE = 1;
     const VALUE_REQUIRED = 2;
     const VALUE_OPTIONAL = 4;
     const VALUE_IS_ARRAY = 8;
@@ -41,8 +39,6 @@ class InputOption
      * @param mixed        $default     The default value (must be null for self::VALUE_REQUIRED or self::VALUE_NONE)
      *
      * @throws \InvalidArgumentException If option mode is invalid or incompatible
-     *
-     * @api
      */
     public function __construct($name, $shortcut = null, $mode = null, $description = '', $default = null)
     {
@@ -77,9 +73,9 @@ class InputOption
             throw new \InvalidArgumentException(sprintf('Option mode "%s" is not valid.', $mode));
         }
 
-        $this->name        = $name;
-        $this->shortcut    = $shortcut;
-        $this->mode        = $mode;
+        $this->name = $name;
+        $this->shortcut = $shortcut;
+        $this->mode = $mode;
         $this->description = $description;
 
         if ($this->isArray() && !$this->acceptValue()) {
@@ -112,7 +108,7 @@ class InputOption
     /**
      * Returns true if the option accepts a value.
      *
-     * @return bool    true if value mode is not self::VALUE_NONE, false otherwise
+     * @return bool true if value mode is not self::VALUE_NONE, false otherwise
      */
     public function acceptValue()
     {
@@ -122,7 +118,7 @@ class InputOption
     /**
      * Returns true if the option requires a value.
      *
-     * @return bool    true if value mode is self::VALUE_REQUIRED, false otherwise
+     * @return bool true if value mode is self::VALUE_REQUIRED, false otherwise
      */
     public function isValueRequired()
     {
@@ -132,7 +128,7 @@ class InputOption
     /**
      * Returns true if the option takes an optional value.
      *
-     * @return bool    true if value mode is self::VALUE_OPTIONAL, false otherwise
+     * @return bool true if value mode is self::VALUE_OPTIONAL, false otherwise
      */
     public function isValueOptional()
     {
@@ -142,7 +138,7 @@ class InputOption
     /**
      * Returns true if the option can take multiple values.
      *
-     * @return bool    true if mode is self::VALUE_IS_ARRAY, false otherwise
+     * @return bool true if mode is self::VALUE_IS_ARRAY, false otherwise
      */
     public function isArray()
     {
@@ -194,9 +190,10 @@ class InputOption
     }
 
     /**
-     * Checks whether the given option equals this one
+     * Checks whether the given option equals this one.
      *
      * @param InputOption $option option to compare
+     *
      * @return bool
      */
     public function equals(InputOption $option)
--- a/vendor/symfony/console/Symfony/Component/Console/Input/StringInput.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Input/StringInput.php
@@ -19,8 +19,6 @@ namespace Symfony\Component\Console\Input;
  *     $input = new StringInput('foo --bar="foobar"');
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class StringInput extends ArgvInput
 {
@@ -34,8 +32,6 @@ class StringInput extends ArgvInput
      * @param InputDefinition $definition A InputDefinition instance
      *
      * @deprecated The second argument is deprecated as it does not work (will be removed in 3.0), use 'bind' method instead
-     *
-     * @api
      */
     public function __construct($input, InputDefinition $definition = null)
     {
--- a/vendor/symfony/console/Symfony/Component/Console/LICENSE
+++ b/vendor/symfony/console/Symfony/Component/Console/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2014 Fabien Potencier
+Copyright (c) 2004-2015 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
--- a/vendor/symfony/console/Symfony/Component/Console/Output/ConsoleOutput.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Output/ConsoleOutput.php
@@ -25,11 +25,12 @@ use Symfony\Component\Console\Formatter\OutputFormatterInterface;
  *     $output = new StreamOutput(fopen('php://stdout', 'w'));
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface
 {
+    /**
+     * @var StreamOutput
+     */
     private $stderr;
 
     /**
@@ -38,19 +39,17 @@ class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface
      * @param int                           $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface)
      * @param bool|null                     $decorated Whether to decorate messages (null for auto-guessing)
      * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter)
-     *
-     * @api
      */
     public function __construct($verbosity = self::VERBOSITY_NORMAL, $decorated = null, OutputFormatterInterface $formatter = null)
     {
-        $outputStream = 'php://stdout';
-        if (!$this->hasStdoutSupport()) {
-            $outputStream = 'php://output';
-        }
+        parent::__construct($this->openOutputStream(), $verbosity, $decorated, $formatter);
 
-        parent::__construct(fopen($outputStream, 'w'), $verbosity, $decorated, $formatter);
+        $actualDecorated = $this->isDecorated();
+        $this->stderr = new StreamOutput($this->openErrorStream(), $verbosity, $decorated, $this->getFormatter());
 
-        $this->stderr = new StreamOutput(fopen('php://stderr', 'w'), $verbosity, $decorated, $this->getFormatter());
+        if (null === $decorated) {
+            $this->setDecorated($actualDecorated && $this->stderr->isDecorated());
+        }
     }
 
     /**
@@ -100,14 +99,58 @@ class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface
      * Returns true if current environment supports writing console output to
      * STDOUT.
      *
-     * IBM iSeries (OS400) exhibits character-encoding issues when writing to
-     * STDOUT and doesn't properly convert ASCII to EBCDIC, resulting in garbage
-     * output.
-     *
      * @return bool
      */
     protected function hasStdoutSupport()
     {
-        return ('OS400' != php_uname('s'));
+        return false === $this->isRunningOS400();
+    }
+
+    /**
+     * Returns true if current environment supports writing console output to
+     * STDERR.
+     *
+     * @return bool
+     */
+    protected function hasStderrSupport()
+    {
+        return false === $this->isRunningOS400();
+    }
+
+    /**
+     * Checks if current executing environment is IBM iSeries (OS400), which
+     * doesn't properly convert character-encodings between ASCII to EBCDIC.
+     *
+     * @return bool
+     */
+    private function isRunningOS400()
+    {
+        $checks = array(
+            function_exists('php_uname') ? php_uname('s') : '',
+            getenv('OSTYPE'),
+            PHP_OS,
+        );
+
+        return false !== stristr(implode(';', $checks), 'OS400');
+    }
+
+    /**
+     * @return resource
+     */
+    private function openOutputStream()
+    {
+        $outputStream = $this->hasStdoutSupport() ? 'php://stdout' : 'php://output';
+
+        return @fopen($outputStream, 'w') ?: fopen('php://output', 'w');
+    }
+
+    /**
+     * @return resource
+     */
+    private function openErrorStream()
+    {
+        $errorStream = $this->hasStderrSupport() ? 'php://stderr' : 'php://output';
+
+        return fopen($errorStream, 'w');
     }
 }
--- a/vendor/symfony/console/Symfony/Component/Console/Output/NullOutput.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Output/NullOutput.php
@@ -21,8 +21,6 @@ use Symfony\Component\Console\Formatter\OutputFormatterInterface;
  *
  * @author Fabien Potencier <fabien@symfony.com>
  * @author Tobias Schultze <http://tobion.de>
- *
- * @api
  */
 class NullOutput implements OutputInterface
 {
--- a/vendor/symfony/console/Symfony/Component/Console/Output/Output.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Output/Output.php
@@ -26,8 +26,6 @@ use Symfony\Component\Console\Formatter\OutputFormatter;
  *  * quiet: -q (no output)
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 abstract class Output implements OutputInterface
 {
@@ -40,8 +38,6 @@ abstract class Output implements OutputInterface
      * @param int                           $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface)
      * @param bool                          $decorated Whether to decorate messages
      * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter)
-     *
-     * @api
      */
     public function __construct($verbosity = self::VERBOSITY_NORMAL, $decorated = false, OutputFormatterInterface $formatter = null)
     {
@@ -138,8 +134,8 @@ abstract class Output implements OutputInterface
     /**
      * Writes a message to the output.
      *
-     * @param string  $message A message to write to the output
-     * @param bool    $newline Whether to add a newline or not
+     * @param string $message A message to write to the output
+     * @param bool   $newline Whether to add a newline or not
      */
     abstract protected function doWrite($message, $newline);
 }
--- a/vendor/symfony/console/Symfony/Component/Console/Output/OutputInterface.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Output/OutputInterface.php
@@ -17,20 +17,18 @@ use Symfony\Component\Console\Formatter\OutputFormatterInterface;
  * OutputInterface is the interface implemented by all Output classes.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 interface OutputInterface
 {
-    const VERBOSITY_QUIET        = 0;
-    const VERBOSITY_NORMAL       = 1;
-    const VERBOSITY_VERBOSE      = 2;
+    const VERBOSITY_QUIET = 0;
+    const VERBOSITY_NORMAL = 1;
+    const VERBOSITY_VERBOSE = 2;
     const VERBOSITY_VERY_VERBOSE = 3;
-    const VERBOSITY_DEBUG        = 4;
+    const VERBOSITY_DEBUG = 4;
 
     const OUTPUT_NORMAL = 0;
-    const OUTPUT_RAW    = 1;
-    const OUTPUT_PLAIN  = 2;
+    const OUTPUT_RAW = 1;
+    const OUTPUT_PLAIN = 2;
 
     /**
      * Writes a message to the output.
@@ -40,56 +38,44 @@ interface OutputInterface
      * @param int          $type     The type of output (one of the OUTPUT constants)
      *
      * @throws \InvalidArgumentException When unknown output type is given
-     *
-     * @api
      */
     public function write($messages, $newline = false, $type = self::OUTPUT_NORMAL);
 
     /**
      * Writes a message to the output and adds a newline at the end.
      *
-     * @param string|array $messages The message as an array of lines of a single string
+     * @param string|array $messages The message as an array of lines or a single string
      * @param int          $type     The type of output (one of the OUTPUT constants)
      *
      * @throws \InvalidArgumentException When unknown output type is given
-     *
-     * @api
      */
     public function writeln($messages, $type = self::OUTPUT_NORMAL);
 
     /**
      * Sets the verbosity of the output.
      *
-     * @param int     $level The level of verbosity (one of the VERBOSITY constants)
-     *
-     * @api
+     * @param int $level The level of verbosity (one of the VERBOSITY constants)
      */
     public function setVerbosity($level);
 
     /**
      * Gets the current verbosity of the output.
      *
-     * @return int     The current level of verbosity (one of the VERBOSITY constants)
-     *
-     * @api
+     * @return int The current level of verbosity (one of the VERBOSITY constants)
      */
     public function getVerbosity();
 
     /**
      * Sets the decorated flag.
      *
-     * @param bool    $decorated Whether to decorate the messages
-     *
-     * @api
+     * @param bool $decorated Whether to decorate the messages
      */
     public function setDecorated($decorated);
 
     /**
      * Gets the decorated flag.
      *
-     * @return bool    true if the output will decorate messages, false otherwise
-     *
-     * @api
+     * @return bool true if the output will decorate messages, false otherwise
      */
     public function isDecorated();
 
@@ -97,17 +83,13 @@ interface OutputInterface
      * Sets output formatter.
      *
      * @param OutputFormatterInterface $formatter
-     *
-     * @api
      */
     public function setFormatter(OutputFormatterInterface $formatter);
 
     /**
      * Returns current output formatter instance.
      *
-     * @return  OutputFormatterInterface
-     *
-     * @api
+     * @return OutputFormatterInterface
      */
     public function getFormatter();
 }
--- a/vendor/symfony/console/Symfony/Component/Console/Output/StreamOutput.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Output/StreamOutput.php
@@ -25,8 +25,6 @@ use Symfony\Component\Console\Formatter\OutputFormatterInterface;
  * $output = new StreamOutput(fopen('/path/to/output.log', 'a', false));
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class StreamOutput extends Output
 {
@@ -35,14 +33,12 @@ class StreamOutput extends Output
     /**
      * Constructor.
      *
-     * @param mixed                         $stream    A stream resource
+     * @param resource                      $stream    A stream resource
      * @param int                           $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface)
      * @param bool|null                     $decorated Whether to decorate messages (null for auto-guessing)
      * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter)
      *
      * @throws \InvalidArgumentException When first argument is not a real stream
-     *
-     * @api
      */
     public function __construct($stream, $verbosity = self::VERBOSITY_NORMAL, $decorated = null, OutputFormatterInterface $formatter = null)
     {
@@ -89,16 +85,16 @@ class StreamOutput extends Output
      *
      * Colorization is disabled if not supported by the stream:
      *
-     *  -  Windows without Ansicon and ConEmu
+     *  -  Windows without Ansicon, ConEmu or Mintty
      *  -  non tty consoles
      *
-     * @return bool    true if the stream supports colorization, false otherwise
+     * @return bool true if the stream supports colorization, false otherwise
      */
     protected function hasColorSupport()
     {
         // @codeCoverageIgnoreStart
-        if (DIRECTORY_SEPARATOR == '\\') {
-            return false !== getenv('ANSICON') || 'ON' === getenv('ConEmuANSI');
+        if (DIRECTORY_SEPARATOR === '\\') {
+            return false !== getenv('ANSICON') || 'ON' === getenv('ConEmuANSI') || 'xterm' === getenv('TERM');
         }
 
         return function_exists('posix_isatty') && @posix_isatty($this->stream);
--- a/vendor/symfony/console/Symfony/Component/Console/Shell.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Shell.php
@@ -164,7 +164,7 @@ EOF;
      *
      * @param string $text The last segment of the entered text
      *
-     * @return bool|array    A list of guessed strings or true
+     * @return bool|array A list of guessed strings or true
      */
     private function autocompleter($text)
     {
@@ -207,7 +207,7 @@ EOF;
         } else {
             $this->output->write($this->getPrompt());
             $line = fgets(STDIN, 1024);
-            $line = (!$line && strlen($line) == 0) ? false : rtrim($line);
+            $line = (false === $line || '' === $line) ? false : rtrim($line);
         }
 
         return $line;
--- a/vendor/symfony/console/Symfony/Component/Console/Tester/ApplicationTester.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Tester/ApplicationTester.php
@@ -55,7 +55,7 @@ class ApplicationTester
      * @param array $input   An array of arguments and options
      * @param array $options An array of options
      *
-     * @return int     The command exit code
+     * @return int The command exit code
      */
     public function run(array $input, $options = array())
     {
@@ -78,7 +78,7 @@ class ApplicationTester
     /**
      * Gets the display returned by the last execution of the application.
      *
-     * @param bool    $normalize Whether to normalize end of lines to \n or not
+     * @param bool $normalize Whether to normalize end of lines to \n or not
      *
      * @return string The display
      */
--- a/vendor/symfony/console/Symfony/Component/Console/Tester/CommandTester.php
+++ b/vendor/symfony/console/Symfony/Component/Console/Tester/CommandTester.php
@@ -41,16 +41,16 @@ class CommandTester
     /**
      * Executes the command.
      *
-     * Available options:
+     * Available execution options:
      *
      *  * interactive: Sets the input interactive flag
      *  * decorated:   Sets the output decorated flag
      *  * verbosity:   Sets the output verbosity flag
      *
-     * @param array $input   An array of arguments and options
-     * @param array $options An array of options
+     * @param array $input   An array of command arguments and options
+     * @param array $options An array of execution options
      *
-     * @return int     The command exit code
+     * @return int The command exit code
      */
     public function execute(array $input, array $options = array())
     {
@@ -73,7 +73,7 @@ class CommandTester
     /**
      * Gets the display returned by the last execution of the command.
      *
-     * @param bool    $normalize Whether to normalize end of lines to \n or not
+     * @param bool $normalize Whether to normalize end of lines to \n or not
      *
      * @return string The display
      */
--- a/vendor/symfony/console/Symfony/Component/Console/composer.json
+++ b/vendor/symfony/console/Symfony/Component/Console/composer.json
@@ -3,7 +3,7 @@
     "type": "library",
     "description": "Symfony Console Component",
     "keywords": [],
-    "homepage": "http://symfony.com",
+    "homepage": "https://symfony.com",
     "license": "MIT",
     "authors": [
         {
@@ -12,7 +12,7 @@
         },
         {
             "name": "Symfony Community",
-            "homepage": "http://symfony.com/contributors"
+            "homepage": "https://symfony.com/contributors"
         }
     ],
     "require": {
@@ -25,7 +25,10 @@
         "symfony/event-dispatcher": ""
     },
     "autoload": {
-        "psr-0": { "Symfony\\Component\\Console\\": "" }
+        "psr-0": { "Symfony\\Component\\Console\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
     },
     "target-dir": "Symfony/Component/Console",
     "minimum-stability": "dev",
--- a/vendor/symfony/debug/Symfony/Component/Debug/Debug.php
+++ b/vendor/symfony/debug/Symfony/Component/Debug/Debug.php
@@ -30,8 +30,8 @@ class Debug
      * If the Symfony ClassLoader component is available, a special
      * class loader is also registered.
      *
-     * @param int     $errorReportingLevel The level of error reporting you want
-     * @param bool    $displayErrors       Whether to display errors (for development) or just log them (for production)
+     * @param int  $errorReportingLevel The level of error reporting you want
+     * @param bool $displayErrors       Whether to display errors (for development) or just log them (for production)
      */
     public static function enable($errorReportingLevel = null, $displayErrors = true)
     {
--- a/vendor/symfony/debug/Symfony/Component/Debug/ErrorHandler.php
+++ b/vendor/symfony/debug/Symfony/Component/Debug/ErrorHandler.php
@@ -27,19 +27,19 @@ class ErrorHandler
     const TYPE_DEPRECATION = -100;
 
     private $levels = array(
-        E_WARNING           => 'Warning',
-        E_NOTICE            => 'Notice',
-        E_USER_ERROR        => 'User Error',
-        E_USER_WARNING      => 'User Warning',
-        E_USER_NOTICE       => 'User Notice',
-        E_STRICT            => 'Runtime Notice',
+        E_WARNING => 'Warning',
+        E_NOTICE => 'Notice',
+        E_USER_ERROR => 'User Error',
+        E_USER_WARNING => 'User Warning',
+        E_USER_NOTICE => 'User Notice',
+        E_STRICT => 'Runtime Notice',
         E_RECOVERABLE_ERROR => 'Catchable Fatal Error',
-        E_DEPRECATED        => 'Deprecated',
-        E_USER_DEPRECATED   => 'User Deprecated',
-        E_ERROR             => 'Error',
-        E_CORE_ERROR        => 'Core Error',
-        E_COMPILE_ERROR     => 'Compile Error',
-        E_PARSE             => 'Parse',
+        E_DEPRECATED => 'Deprecated',
+        E_USER_DEPRECATED => 'User Deprecated',
+        E_ERROR => 'Error',
+        E_CORE_ERROR => 'Core Error',
+        E_COMPILE_ERROR => 'Compile Error',
+        E_PARSE => 'Parse',
     );
 
     private $level;
@@ -56,8 +56,8 @@ class ErrorHandler
     /**
      * Registers the error handler.
      *
-     * @param int     $level The level at which the conversion to Exception is done (null to use the error_reporting() value and 0 to disable)
-     * @param bool    $displayErrors Display errors (for dev environment) or just log they (production usage)
+     * @param int  $level         The level at which the conversion to Exception is done (null to use the error_reporting() value and 0 to disable)
+     * @param bool $displayErrors Display errors (for dev environment) or just log they (production usage)
      *
      * @return ErrorHandler The registered error handler
      */
@@ -101,7 +101,7 @@ class ErrorHandler
 
         if ($level & (E_USER_DEPRECATED | E_DEPRECATED)) {
             if (isset(self::$loggers['deprecation'])) {
-                if (version_compare(PHP_VERSION, '5.4', '<')) {
+                if (PHP_VERSION_ID < 50400) {
                     $stack = array_map(
                         function ($row) {
                             unset($row['args']);
@@ -133,6 +133,7 @@ class ErrorHandler
                 unset($context['GLOBALS']);
             }
 
+            $level &= E_ALL | E_STRICT;
             $exception = new ContextErrorException(sprintf('%s: %s in %s line %d', isset($this->levels[$level]) ? $this->levels[$level] : $level, $message, $file, $line), 0, $level, $file, $line, $context);
 
             // Exceptions thrown from error handlers are sometimes not caught by the exception
@@ -173,7 +174,7 @@ class ErrorHandler
         }
 
         $this->reservedMemory = '';
-        $type = $error['type'];
+        $type = $error['type'] & (E_ALL | E_STRICT);
         if (0 === $this->level || !in_array($type, array(E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR, E_PARSE))) {
             return;
         }
--- a/vendor/symfony/debug/Symfony/Component/Debug/Exception/FatalErrorException.php
+++ b/vendor/symfony/debug/Symfony/Component/Debug/Exception/FatalErrorException.php
@@ -9,13 +9,28 @@
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Component\Debug\Exception;
+namespace Symfony\Component\HttpKernel\Exception;
 
 /**
  * Fatal Error Exception.
  *
  * @author Konstanton Myakshin <koc-dp@yandex.ru>
+ *
+ * @deprecated Deprecated in 2.3, to be removed in 3.0. Use the same class from the Debug component instead.
  */
 class FatalErrorException extends \ErrorException
 {
 }
+
+namespace Symfony\Component\Debug\Exception;
+
+use Symfony\Component\HttpKernel\Exception\FatalErrorException as LegacyFatalErrorException;
+
+/**
+ * Fatal Error Exception.
+ *
+ * @author Konstanton Myakshin <koc-dp@yandex.ru>
+ */
+class FatalErrorException extends LegacyFatalErrorException
+{
+}
--- a/vendor/symfony/debug/Symfony/Component/Debug/Exception/FlattenException.php
+++ b/vendor/symfony/debug/Symfony/Component/Debug/Exception/FlattenException.php
@@ -9,8 +9,49 @@
  * file that was distributed with this source code.
  */
 
+namespace Symfony\Component\HttpKernel\Exception;
+
+use Symfony\Component\Debug\Exception\FlattenException as DebugFlattenException;
+
+/**
+ * FlattenException wraps a PHP Exception to be able to serialize it.
+ *
+ * Basically, this class removes all objects from the trace.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @deprecated Deprecated in 2.3, to be removed in 3.0. Use the same class from the Debug component instead.
+ */
+class FlattenException
+{
+    private $handler;
+
+    public static function __callStatic($method, $args)
+    {
+        if (!method_exists('Symfony\Component\Debug\Exception\FlattenException', $method)) {
+            throw new \BadMethodCallException(sprintf('Call to undefined method %s::%s()', get_called_class(), $method));
+        }
+
+        return call_user_func_array(array('Symfony\Component\Debug\Exception\FlattenException', $method), $args);
+    }
+
+    public function __call($method, $args)
+    {
+        if (!isset($this->handler)) {
+            $this->handler = new DebugFlattenException();
+        }
+
+        if (!method_exists($this->handler, $method)) {
+            throw new \BadMethodCallException(sprintf('Call to undefined method %s::%s()', get_class($this), $method));
+        }
+
+        return call_user_func_array(array($this->handler, $method), $args);
+    }
+}
+
 namespace Symfony\Component\Debug\Exception;
 
+use Symfony\Component\HttpKernel\Exception\FlattenException as LegacyFlattenException;
 use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
 
 /**
@@ -20,7 +61,7 @@ use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
  *
  * @author Fabien Potencier <fabien@symfony.com>
  */
-class FlattenException
+class FlattenException extends LegacyFlattenException
 {
     private $message;
     private $code;
@@ -66,8 +107,8 @@ class FlattenException
         foreach (array_merge(array($this), $this->getAllPrevious()) as $exception) {
             $exceptions[] = array(
                 'message' => $exception->getMessage(),
-                'class'   => $exception->getClass(),
-                'trace'   => $exception->getTrace(),
+                'class' => $exception->getClass(),
+                'trace' => $exception->getTrace(),
             );
         }
 
@@ -208,14 +249,14 @@ class FlattenException
     {
         $this->trace = array();
         $this->trace[] = array(
-            'namespace'   => '',
+            'namespace' => '',
             'short_class' => '',
-            'class'       => '',
-            'type'        => '',
-            'function'    => '',
-            'file'        => $file,
-            'line'        => $line,
-            'args'        => array(),
+            'class' => '',
+            'type' => '',
+            'function' => '',
+            'file' => $file,
+            'line' => $line,
+            'args' => array(),
         );
         foreach ($trace as $entry) {
             $class = '';
@@ -227,29 +268,32 @@ class FlattenException
             }
 
             $this->trace[] = array(
-                'namespace'   => $namespace,
+                'namespace' => $namespace,
                 'short_class' => $class,
-                'class'       => isset($entry['class']) ? $entry['class'] : '',
-                'type'        => isset($entry['type']) ? $entry['type'] : '',
-                'function'    => isset($entry['function']) ? $entry['function'] : null,
-                'file'        => isset($entry['file']) ? $entry['file'] : null,
-                'line'        => isset($entry['line']) ? $entry['line'] : null,
-                'args'        => isset($entry['args']) ? $this->flattenArgs($entry['args']) : array(),
+                'class' => isset($entry['class']) ? $entry['class'] : '',
+                'type' => isset($entry['type']) ? $entry['type'] : '',
+                'function' => isset($entry['function']) ? $entry['function'] : null,
+                'file' => isset($entry['file']) ? $entry['file'] : null,
+                'line' => isset($entry['line']) ? $entry['line'] : null,
+                'args' => isset($entry['args']) ? $this->flattenArgs($entry['args']) : array(),
             );
         }
     }
 
-    private function flattenArgs($args, $level = 0)
+    private function flattenArgs($args, $level = 0, &$count = 0)
     {
         $result = array();
         foreach ($args as $key => $value) {
+            if (++$count > 1e4) {
+                return array('array', '*SKIPPED over 10000 entries*');
+            }
             if (is_object($value)) {
                 $result[$key] = array('object', get_class($value));
             } elseif (is_array($value)) {
                 if ($level > 10) {
                     $result[$key] = array('array', '*DEEP NESTED ARRAY*');
                 } else {
-                    $result[$key] = array('array', $this->flattenArgs($value, $level + 1));
+                    $result[$key] = array('array', $this->flattenArgs($value, $level + 1, $count));
                 }
             } elseif (null === $value) {
                 $result[$key] = array('null', null);
--- a/vendor/symfony/debug/Symfony/Component/Debug/ExceptionHandler.php
+++ b/vendor/symfony/debug/Symfony/Component/Debug/ExceptionHandler.php
@@ -14,10 +14,6 @@ namespace Symfony\Component\Debug;
 use Symfony\Component\HttpFoundation\Response;
 use Symfony\Component\Debug\Exception\FlattenException;
 
-if (!defined('ENT_SUBSTITUTE')) {
-    define('ENT_SUBSTITUTE', 8);
-}
-
 /**
  * ExceptionHandler converts an exception to a Response object.
  *
@@ -43,7 +39,7 @@ class ExceptionHandler
     /**
      * Registers the exception handler.
      *
-     * @param bool    $debug
+     * @param bool $debug
      *
      * @return ExceptionHandler The registered exception handler
      */
@@ -65,8 +61,8 @@ class ExceptionHandler
      *
      * @param \Exception $exception An \Exception instance
      *
-     * @see sendPhpResponse
-     * @see createResponse
+     * @see sendPhpResponse()
+     * @see createResponse()
      */
     public function handle(\Exception $exception)
     {
@@ -96,6 +92,7 @@ class ExceptionHandler
             foreach ($exception->getHeaders() as $name => $value) {
                 header($name.': '.$value, false);
             }
+            header('Content-Type: text/html; charset='.$this->charset);
         }
 
         echo $this->decorate($this->getContent($exception), $this->getStylesheet($exception));
@@ -114,7 +111,7 @@ class ExceptionHandler
             $exception = FlattenException::create($exception);
         }
 
-        return new Response($this->decorate($this->getContent($exception), $this->getStylesheet($exception)), $exception->getStatusCode(), $exception->getHeaders());
+        return Response::create($this->decorate($this->getContent($exception), $this->getStylesheet($exception)), $exception->getStatusCode(), $exception->getHeaders())->setCharset($this->charset);
     }
 
     /**
@@ -135,6 +132,7 @@ class ExceptionHandler
         }
 
         $content = '';
+        $flags = PHP_VERSION_ID >= 50400 ? ENT_QUOTES | ENT_SUBSTITUTE : ENT_QUOTES;
         if ($this->debug) {
             try {
                 $count = count($exception->getAllPrevious());
@@ -142,7 +140,7 @@ class ExceptionHandler
                 foreach ($exception->toArray() as $position => $e) {
                     $ind = $count - $position + 1;
                     $class = $this->abbrClass($e['class']);
-                    $message = nl2br($e['message']);
+                    $message = nl2br(htmlspecialchars($e['message'], $flags, $this->charset));
                     $content .= sprintf(<<<EOF
                         <div class="block_exception clear_fix">
                             <h2><span>%d/%d</span> %s: %s</h2>
@@ -159,10 +157,11 @@ EOF
                         }
                         if (isset($trace['file']) && isset($trace['line'])) {
                             if ($linkFormat = ini_get('xdebug.file_link_format')) {
-                                $link = str_replace(array('%f', '%l'), array($trace['file'], $trace['line']), $linkFormat);
-                                $content .= sprintf(' in <a href="%s" title="Go to source">%s line %s</a>', $link, $trace['file'], $trace['line']);
+                                $link = strtr($linkFormat, array('%f' => $trace['file'], '%l' => $trace['line']));
+                                $link = htmlspecialchars($link, $flags, $this->charset);
+                                $content .= sprintf(' in <a href="%s" title="Go to source">%s line %d</a>', $link, htmlspecialchars($trace['file'], $flags, $this->charset), $trace['line']);
                             } else {
-                                $content .= sprintf(' in %s line %s', $trace['file'], $trace['line']);
+                                $content .= sprintf(' in %s line %d', htmlspecialchars($trace['file'], $flags, $this->charset), $trace['line']);
                             }
                         }
                         $content .= "</li>\n";
@@ -173,7 +172,7 @@ EOF
             } catch (\Exception $e) {
                 // something nasty happened and we cannot throw an exception anymore
                 if ($this->debug) {
-                    $title = sprintf('Exception thrown when handling an exception (%s: %s)', get_class($exception), $exception->getMessage());
+                    $title = sprintf('Exception thrown when handling an exception (%s: %s)', get_class($e), htmlspecialchars($e->getMessage(), $flags, $this->charset));
                 } else {
                     $title = 'Whoops, looks like something went wrong.';
                 }
@@ -280,7 +279,7 @@ EOF;
     {
         $parts = explode('\\', $class);
 
-        return sprintf("<abbr title=\"%s\">%s</abbr>", $class, array_pop($parts));
+        return sprintf('<abbr title="%s">%s</abbr>', $class, array_pop($parts));
     }
 
     /**
@@ -292,14 +291,19 @@ EOF;
      */
     private function formatArgs(array $args)
     {
+        if (PHP_VERSION_ID >= 50400) {
+            $flags = ENT_QUOTES | ENT_SUBSTITUTE;
+        } else {
+            $flags = ENT_QUOTES;
+        }
         $result = array();
         foreach ($args as $key => $item) {
             if ('object' === $item[0]) {
-                $formattedValue = sprintf("<em>object</em>(%s)", $this->abbrClass($item[1]));
+                $formattedValue = sprintf('<em>object</em>(%s)', $this->abbrClass($item[1]));
             } elseif ('array' === $item[0]) {
-                $formattedValue = sprintf("<em>array</em>(%s)", is_array($item[1]) ? $this->formatArgs($item[1]) : $item[1]);
-            } elseif ('string'  === $item[0]) {
-                $formattedValue = sprintf("'%s'", htmlspecialchars($item[1], ENT_QUOTES | ENT_SUBSTITUTE, $this->charset));
+                $formattedValue = sprintf('<em>array</em>(%s)', is_array($item[1]) ? $this->formatArgs($item[1]) : $item[1]);
+            } elseif ('string' === $item[0]) {
+                $formattedValue = sprintf("'%s'", htmlspecialchars($item[1], $flags, $this->charset));
             } elseif ('null' === $item[0]) {
                 $formattedValue = '<em>null</em>';
             } elseif ('boolean' === $item[0]) {
@@ -307,7 +311,7 @@ EOF;
             } elseif ('resource' === $item[0]) {
                 $formattedValue = '<em>resource</em>';
             } else {
-                $formattedValue = str_replace("\n", '', var_export(htmlspecialchars((string) $item[1], ENT_QUOTES | ENT_SUBSTITUTE, $this->charset), true));
+                $formattedValue = str_replace("\n", '', var_export(htmlspecialchars((string) $item[1], $flags, $this->charset), true));
             }
 
             $result[] = is_int($key) ? $formattedValue : sprintf("'%s' => %s", $key, $formattedValue);
--- a/vendor/symfony/debug/Symfony/Component/Debug/LICENSE
+++ b/vendor/symfony/debug/Symfony/Component/Debug/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2014 Fabien Potencier
+Copyright (c) 2004-2015 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
--- a/vendor/symfony/debug/Symfony/Component/Debug/composer.json
+++ b/vendor/symfony/debug/Symfony/Component/Debug/composer.json
@@ -3,7 +3,7 @@
     "type": "library",
     "description": "Symfony Debug Component",
     "keywords": [],
-    "homepage": "http://symfony.com",
+    "homepage": "https://symfony.com",
     "license": "MIT",
     "authors": [
         {
@@ -12,14 +12,17 @@
         },
         {
             "name": "Symfony Community",
-            "homepage": "http://symfony.com/contributors"
+            "homepage": "https://symfony.com/contributors"
         }
     ],
     "require": {
         "php": ">=5.3.3"
     },
+    "conflict": {
+        "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
+    },
     "require-dev": {
-        "symfony/http-kernel": "~2.1",
+        "symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2",
         "symfony/http-foundation": "~2.1"
     },
     "suggest": {
@@ -28,7 +31,10 @@
         "symfony/class-loader": ""
     },
     "autoload": {
-        "psr-0": { "Symfony\\Component\\Debug\\": "" }
+        "psr-0": { "Symfony\\Component\\Debug\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
     },
     "target-dir": "Symfony/Component/Debug",
     "minimum-stability": "dev",
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Alias.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Alias.php
@@ -11,9 +11,6 @@
 
 namespace Symfony\Component\DependencyInjection;
 
-/**
- * @api
- */
 class Alias
 {
     private $id;
@@ -22,10 +19,8 @@ class Alias
     /**
      * Constructor.
      *
-     * @param string  $id     Alias identifier
-     * @param bool    $public If this alias is public
-     *
-     * @api
+     * @param string $id     Alias identifier
+     * @param bool   $public If this alias is public
      */
     public function __construct($id, $public = true)
     {
@@ -37,8 +32,6 @@ class Alias
      * Checks if this DI Alias should be public or not.
      *
      * @return bool
-     *
-     * @api
      */
     public function isPublic()
     {
@@ -48,9 +41,7 @@ class Alias
     /**
      * Sets if this Alias is public.
      *
-     * @param bool    $boolean If this Alias should be public
-     *
-     * @api
+     * @param bool $boolean If this Alias should be public
      */
     public function setPublic($boolean)
     {
@@ -61,8 +52,6 @@ class Alias
      * Returns the Id of this alias.
      *
      * @return string The alias id
-     *
-     * @api
      */
     public function __toString()
     {
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/AnalyzeServiceReferencesPass.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/AnalyzeServiceReferencesPass.php
@@ -36,7 +36,7 @@ class AnalyzeServiceReferencesPass implements RepeatablePassInterface
     /**
      * Constructor.
      *
-     * @param bool    $onlyConstructorArguments Sets this Service Reference pass to ignore method calls
+     * @param bool $onlyConstructorArguments Sets this Service Reference pass to ignore method calls
      */
     public function __construct($onlyConstructorArguments = false)
     {
@@ -59,7 +59,7 @@ class AnalyzeServiceReferencesPass implements RepeatablePassInterface
     public function process(ContainerBuilder $container)
     {
         $this->container = $container;
-        $this->graph     = $container->getCompiler()->getServiceReferenceGraph();
+        $this->graph = $container->getCompiler()->getServiceReferenceGraph();
         $this->graph->clear();
 
         foreach ($container->getDefinitions() as $id => $definition) {
@@ -111,6 +111,10 @@ class AnalyzeServiceReferencesPass implements RepeatablePassInterface
                 $this->processArguments($argument->getArguments());
                 $this->processArguments($argument->getMethodCalls());
                 $this->processArguments($argument->getProperties());
+
+                if ($argument->getFactoryService()) {
+                    $this->processArguments(array(new Reference($argument->getFactoryService())));
+                }
             }
         }
     }
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/CheckCircularReferencesPass.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/CheckCircularReferencesPass.php
@@ -15,7 +15,7 @@ use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceExce
 use Symfony\Component\DependencyInjection\ContainerBuilder;
 
 /**
- * Checks your services for circular references
+ * Checks your services for circular references.
  *
  * References from method calls are ignored since we might be able to resolve
  * these references depending on the order in which services are called.
@@ -26,7 +26,6 @@ use Symfony\Component\DependencyInjection\ContainerBuilder;
  */
 class CheckCircularReferencesPass implements CompilerPassInterface
 {
-    private $currentId;
     private $currentPath;
     private $checkedNodes;
 
@@ -41,7 +40,6 @@ class CheckCircularReferencesPass implements CompilerPassInterface
 
         $this->checkedNodes = array();
         foreach ($graph->getNodes() as $id => $node) {
-            $this->currentId = $id;
             $this->currentPath = array($id);
 
             $this->checkOutEdges($node->getOutEdges());
@@ -58,8 +56,8 @@ class CheckCircularReferencesPass implements CompilerPassInterface
     private function checkOutEdges(array $edges)
     {
         foreach ($edges as $edge) {
-            $node      = $edge->getDestNode();
-            $id        = $node->getId();
+            $node = $edge->getDestNode();
+            $id = $node->getId();
 
             if (empty($this->checkedNodes[$id])) {
                 $searchKey = array_search($id, $this->currentPath);
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php
@@ -12,7 +12,6 @@
 namespace Symfony\Component\DependencyInjection\Compiler;
 
 use Symfony\Component\DependencyInjection\Definition;
-
 use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\DependencyInjection\Reference;
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/CheckReferenceValidityPass.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/CheckReferenceValidityPass.php
@@ -20,7 +20,7 @@ use Symfony\Component\DependencyInjection\Exception\ScopeCrossingInjectionExcept
 use Symfony\Component\DependencyInjection\Exception\ScopeWideningInjectionException;
 
 /**
- * Checks the validity of references
+ * Checks the validity of references.
  *
  * The following checks are performed by this pass:
  * - target definitions are not abstract
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/Compiler.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/Compiler.php
@@ -17,8 +17,6 @@ use Symfony\Component\DependencyInjection\ContainerBuilder;
  * This class is used to remove circular dependencies between individual passes.
  *
  * @author Johannes M. Schmitt <schmittjoh@gmail.com>
- *
- * @api
  */
 class Compiler
 {
@@ -42,8 +40,6 @@ class Compiler
      * Returns the PassConfig.
      *
      * @return PassConfig The PassConfig instance
-     *
-     * @api
      */
     public function getPassConfig()
     {
@@ -54,8 +50,6 @@ class Compiler
      * Returns the ServiceReferenceGraph.
      *
      * @return ServiceReferenceGraph The ServiceReferenceGraph instance
-     *
-     * @api
      */
     public function getServiceReferenceGraph()
     {
@@ -77,8 +71,6 @@ class Compiler
      *
      * @param CompilerPassInterface $pass A compiler pass
      * @param string                $type The type of the pass
-     *
-     * @api
      */
     public function addPass(CompilerPassInterface $pass, $type = PassConfig::TYPE_BEFORE_OPTIMIZATION)
     {
@@ -109,8 +101,6 @@ class Compiler
      * Run the Compiler and process all Passes.
      *
      * @param ContainerBuilder $container
-     *
-     * @api
      */
     public function compile(ContainerBuilder $container)
     {
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/CompilerPassInterface.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/CompilerPassInterface.php
@@ -14,11 +14,9 @@ namespace Symfony\Component\DependencyInjection\Compiler;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
 
 /**
- * Interface that must be implemented by compilation passes
+ * Interface that must be implemented by compilation passes.
  *
  * @author Johannes M. Schmitt <schmittjoh@gmail.com>
- *
- * @api
  */
 interface CompilerPassInterface
 {
@@ -26,8 +24,6 @@ interface CompilerPassInterface
      * You can modify the container here before it is dumped to PHP code.
      *
      * @param ContainerBuilder $container
-     *
-     * @api
      */
     public function process(ContainerBuilder $container);
 }
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php
@@ -109,7 +109,7 @@ class InlineServiceDefinitionsPass implements RepeatablePassInterface
      * @param string           $id
      * @param Definition       $definition
      *
-     * @return bool    If the definition is inlineable
+     * @return bool If the definition is inlineable
      */
     private function isInlineableDefinition(ContainerBuilder $container, $id, Definition $definition)
     {
@@ -138,6 +138,10 @@ class InlineServiceDefinitionsPass implements RepeatablePassInterface
             return false;
         }
 
+        if (count($ids) > 1 && $definition->getFactoryService()) {
+            return false;
+        }
+
         return $container->getDefinition(reset($ids))->getScope() === $definition->getScope();
     }
 }
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/MergeExtensionConfigurationPass.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/MergeExtensionConfigurationPass.php
@@ -15,7 +15,7 @@ use Symfony\Component\DependencyInjection\ContainerBuilder;
 use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
 
 /**
- * Merges extension configs into the container builder
+ * Merges extension configs into the container builder.
  *
  * @author Fabien Potencier <fabien@symfony.com>
  */
@@ -50,10 +50,10 @@ class MergeExtensionConfigurationPass implements CompilerPassInterface
             $extension->load($config, $tmpContainer);
 
             $container->merge($tmpContainer);
+            $container->getParameterBag()->add($parameters);
         }
 
         $container->addDefinitions($definitions);
         $container->addAliases($aliases);
-        $container->getParameterBag()->add($parameters);
     }
 }
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/PassConfig.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/PassConfig.php
@@ -14,13 +14,11 @@ namespace Symfony\Component\DependencyInjection\Compiler;
 use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
 
 /**
- * Compiler Pass Configuration
+ * Compiler Pass Configuration.
  *
  * This class has a default configuration embedded.
  *
  * @author Johannes M. Schmitt <schmittjoh@gmail.com>
- *
- * @api
  */
 class PassConfig
 {
@@ -77,8 +75,6 @@ class PassConfig
      * Returns all passes in order to be processed.
      *
      * @return array An array of all passes to process
-     *
-     * @api
      */
     public function getPasses()
     {
@@ -99,8 +95,6 @@ class PassConfig
      * @param string                $type The pass type
      *
      * @throws InvalidArgumentException when a pass type doesn't exist
-     *
-     * @api
      */
     public function addPass(CompilerPassInterface $pass, $type = self::TYPE_BEFORE_OPTIMIZATION)
     {
@@ -117,8 +111,6 @@ class PassConfig
      * Gets all passes for the AfterRemoving pass.
      *
      * @return array An array of passes
-     *
-     * @api
      */
     public function getAfterRemovingPasses()
     {
@@ -129,8 +121,6 @@ class PassConfig
      * Gets all passes for the BeforeOptimization pass.
      *
      * @return array An array of passes
-     *
-     * @api
      */
     public function getBeforeOptimizationPasses()
     {
@@ -141,8 +131,6 @@ class PassConfig
      * Gets all passes for the BeforeRemoving pass.
      *
      * @return array An array of passes
-     *
-     * @api
      */
     public function getBeforeRemovingPasses()
     {
@@ -153,8 +141,6 @@ class PassConfig
      * Gets all passes for the Optimization pass.
      *
      * @return array An array of passes
-     *
-     * @api
      */
     public function getOptimizationPasses()
     {
@@ -165,8 +151,6 @@ class PassConfig
      * Gets all passes for the Removing pass.
      *
      * @return array An array of passes
-     *
-     * @api
      */
     public function getRemovingPasses()
     {
@@ -177,8 +161,6 @@ class PassConfig
      * Gets all passes for the Merge pass.
      *
      * @return array An array of passes
-     *
-     * @api
      */
     public function getMergePass()
     {
@@ -189,8 +171,6 @@ class PassConfig
      * Sets the Merge Pass.
      *
      * @param CompilerPassInterface $pass The merge pass
-     *
-     * @api
      */
     public function setMergePass(CompilerPassInterface $pass)
     {
@@ -201,8 +181,6 @@ class PassConfig
      * Sets the AfterRemoving passes.
      *
      * @param array $passes An array of passes
-     *
-     * @api
      */
     public function setAfterRemovingPasses(array $passes)
     {
@@ -213,8 +191,6 @@ class PassConfig
      * Sets the BeforeOptimization passes.
      *
      * @param array $passes An array of passes
-     *
-     * @api
      */
     public function setBeforeOptimizationPasses(array $passes)
     {
@@ -225,8 +201,6 @@ class PassConfig
      * Sets the BeforeRemoving passes.
      *
      * @param array $passes An array of passes
-     *
-     * @api
      */
     public function setBeforeRemovingPasses(array $passes)
     {
@@ -237,8 +211,6 @@ class PassConfig
      * Sets the Optimization passes.
      *
      * @param array $passes An array of passes
-     *
-     * @api
      */
     public function setOptimizationPasses(array $passes)
     {
@@ -249,8 +221,6 @@ class PassConfig
      * Sets the Removing passes.
      *
      * @param array $passes An array of passes
-     *
-     * @api
      */
     public function setRemovingPasses(array $passes)
     {
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/RemoveAbstractDefinitionsPass.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/RemoveAbstractDefinitionsPass.php
@@ -14,13 +14,12 @@ namespace Symfony\Component\DependencyInjection\Compiler;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
 
 /**
- * Removes abstract Definitions
- *
+ * Removes abstract Definitions.
  */
 class RemoveAbstractDefinitionsPass implements CompilerPassInterface
 {
     /**
-     * Removes abstract definitions from the ContainerBuilder
+     * Removes abstract definitions from the ContainerBuilder.
      *
      * @param ContainerBuilder $container
      */
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/RemovePrivateAliasesPass.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/RemovePrivateAliasesPass.php
@@ -23,7 +23,7 @@ use Symfony\Component\DependencyInjection\ContainerBuilder;
 class RemovePrivateAliasesPass implements CompilerPassInterface
 {
     /**
-     * Removes private aliases from the ContainerBuilder
+     * Removes private aliases from the ContainerBuilder.
      *
      * @param ContainerBuilder $container
      */
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/RepeatedPass.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/RepeatedPass.php
@@ -69,7 +69,7 @@ class RepeatedPass implements CompilerPassInterface
     }
 
     /**
-     * Sets if the pass should repeat
+     * Sets if the pass should repeat.
      */
     public function setRepeat()
     {
@@ -77,7 +77,7 @@ class RepeatedPass implements CompilerPassInterface
     }
 
     /**
-     * Returns the passes
+     * Returns the passes.
      *
      * @return RepeatablePassInterface[] An array of RepeatablePassInterface objects
      */
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php
@@ -39,7 +39,7 @@ class ResolveDefinitionTemplatesPass implements CompilerPassInterface
         $this->compiler = $container->getCompiler();
         $this->formatter = $this->compiler->getLoggingFormatter();
 
-        foreach (array_keys($container->getDefinitions()) as $id) {
+        foreach ($container->getDefinitions() as $id => $definition) {
             // yes, we are specifically fetching the definition from the
             // container to ensure we are not operating on stale data
             $definition = $container->getDefinition($id);
@@ -52,7 +52,7 @@ class ResolveDefinitionTemplatesPass implements CompilerPassInterface
     }
 
     /**
-     * Resolves the definition
+     * Resolves the definition.
      *
      * @param string              $id         The definition identifier
      * @param DefinitionDecorator $definition
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ResolveInvalidReferencesPass.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ResolveInvalidReferencesPass.php
@@ -47,7 +47,7 @@ class ResolveInvalidReferencesPass implements CompilerPassInterface
             foreach ($definition->getMethodCalls() as $call) {
                 try {
                     $calls[] = array($call[0], $this->processArguments($call[1], true));
-                } catch (RuntimeException $ignore) {
+                } catch (RuntimeException $e) {
                     // this call is simply removed
                 }
             }
@@ -58,7 +58,7 @@ class ResolveInvalidReferencesPass implements CompilerPassInterface
                 try {
                     $value = $this->processArguments(array($value), true);
                     $properties[$name] = reset($value);
-                } catch (RuntimeException $ignore) {
+                } catch (RuntimeException $e) {
                     // ignore property
                 }
             }
@@ -69,8 +69,8 @@ class ResolveInvalidReferencesPass implements CompilerPassInterface
     /**
      * Processes arguments to determine invalid references.
      *
-     * @param array   $arguments    An array of Reference objects
-     * @param bool    $inMethodCall
+     * @param array $arguments    An array of Reference objects
+     * @param bool  $inMethodCall
      *
      * @return array
      *
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ResolveParameterPlaceHoldersPass.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ResolveParameterPlaceHoldersPass.php
@@ -37,6 +37,7 @@ class ResolveParameterPlaceHoldersPass implements CompilerPassInterface
                 $definition->setClass($parameterBag->resolveValue($definition->getClass()));
                 $definition->setFile($parameterBag->resolveValue($definition->getFile()));
                 $definition->setArguments($parameterBag->resolveValue($definition->getArguments()));
+                $definition->setFactoryClass($parameterBag->resolveValue($definition->getFactoryClass()));
 
                 $calls = array();
                 foreach ($definition->getMethodCalls() as $name => $arguments) {
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ResolveReferencesToAliasesPass.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ResolveReferencesToAliasesPass.php
@@ -12,6 +12,7 @@
 namespace Symfony\Component\DependencyInjection\Compiler;
 
 use Symfony\Component\DependencyInjection\Alias;
+use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
 use Symfony\Component\DependencyInjection\Reference;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
 
@@ -84,7 +85,12 @@ class ResolveReferencesToAliasesPass implements CompilerPassInterface
      */
     private function getDefinitionId($id)
     {
+        $seen = array();
         while ($this->container->hasAlias($id)) {
+            if (isset($seen[$id])) {
+                throw new ServiceCircularReferenceException($id, array_keys($seen));
+            }
+            $seen[$id] = true;
             $id = (string) $this->container->getAlias($id);
         }
 
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraphEdge.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraphEdge.php
@@ -39,7 +39,7 @@ class ServiceReferenceGraphEdge
     }
 
     /**
-     * Returns the value of the edge
+     * Returns the value of the edge.
      *
      * @return ServiceReferenceGraphNode
      */
@@ -49,7 +49,7 @@ class ServiceReferenceGraphEdge
     }
 
     /**
-     * Returns the source node
+     * Returns the source node.
      *
      * @return ServiceReferenceGraphNode
      */
@@ -59,7 +59,7 @@ class ServiceReferenceGraphEdge
     }
 
     /**
-     * Returns the destination node
+     * Returns the destination node.
      *
      * @return ServiceReferenceGraphNode
      */
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraphNode.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraphNode.php
@@ -65,7 +65,7 @@ class ServiceReferenceGraphNode
     /**
      * Checks if the value of this node is an Alias.
      *
-     * @return bool    True if the value is an Alias instance
+     * @return bool True if the value is an Alias instance
      */
     public function isAlias()
     {
@@ -75,7 +75,7 @@ class ServiceReferenceGraphNode
     /**
      * Checks if the value of this node is a Definition.
      *
-     * @return bool    True if the value is a Definition instance
+     * @return bool True if the value is a Definition instance
      */
     public function isDefinition()
     {
@@ -113,7 +113,7 @@ class ServiceReferenceGraphNode
     }
 
     /**
-     * Returns the value of this Node
+     * Returns the value of this Node.
      *
      * @return mixed The value
      */
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Container.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Container.php
@@ -57,8 +57,6 @@ use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;
  *
  * @author Fabien Potencier <fabien@symfony.com>
  * @author Johannes M. Schmitt <schmittjoh@gmail.com>
- *
- * @api
  */
 class Container implements IntrospectableContainerInterface
 {
@@ -76,23 +74,23 @@ class Container implements IntrospectableContainerInterface
     protected $scopeStacks;
     protected $loading = array();
 
+    private $underscoreMap = array('_' => '', '.' => '_', '\\' => '_');
+
     /**
      * Constructor.
      *
      * @param ParameterBagInterface $parameterBag A ParameterBagInterface instance
-     *
-     * @api
      */
     public function __construct(ParameterBagInterface $parameterBag = null)
     {
         $this->parameterBag = null === $parameterBag ? new ParameterBag() : $parameterBag;
 
-        $this->services       = array();
-        $this->aliases        = array();
-        $this->scopes         = array();
-        $this->scopeChildren  = array();
+        $this->services = array();
+        $this->aliases = array();
+        $this->scopes = array();
+        $this->scopeChildren = array();
         $this->scopedServices = array();
-        $this->scopeStacks    = array();
+        $this->scopeStacks = array();
     }
 
     /**
@@ -102,8 +100,6 @@ class Container implements IntrospectableContainerInterface
      *
      *  * Parameter values are resolved;
      *  * The parameter bag is frozen.
-     *
-     * @api
      */
     public function compile()
     {
@@ -115,9 +111,7 @@ class Container implements IntrospectableContainerInterface
     /**
      * Returns true if the container parameter bag are frozen.
      *
-     * @return bool    true if the container parameter bag are frozen, false otherwise
-     *
-     * @api
+     * @return bool true if the container parameter bag are frozen, false otherwise
      */
     public function isFrozen()
     {
@@ -128,8 +122,6 @@ class Container implements IntrospectableContainerInterface
      * Gets the service container parameter bag.
      *
      * @return ParameterBagInterface A ParameterBagInterface instance
-     *
-     * @api
      */
     public function getParameterBag()
     {
@@ -141,11 +133,9 @@ class Container implements IntrospectableContainerInterface
      *
      * @param string $name The parameter name
      *
-     * @return mixed  The parameter value
+     * @return mixed The parameter value
      *
      * @throws InvalidArgumentException if the parameter is not defined
-     *
-     * @api
      */
     public function getParameter($name)
     {
@@ -157,9 +147,7 @@ class Container implements IntrospectableContainerInterface
      *
      * @param string $name The parameter name
      *
-     * @return bool    The presence of parameter in container
-     *
-     * @api
+     * @return bool The presence of parameter in container
      */
     public function hasParameter($name)
     {
@@ -171,8 +159,6 @@ class Container implements IntrospectableContainerInterface
      *
      * @param string $name  The parameter name
      * @param mixed  $value The parameter value
-     *
-     * @api
      */
     public function setParameter($name, $value)
     {
@@ -189,10 +175,8 @@ class Container implements IntrospectableContainerInterface
      * @param object $service The service instance
      * @param string $scope   The scope of the service
      *
-     * @throws RuntimeException When trying to set a service in an inactive scope
+     * @throws RuntimeException         When trying to set a service in an inactive scope
      * @throws InvalidArgumentException When trying to set a service in the prototype scope
-     *
-     * @api
      */
     public function set($id, $service, $scope = self::SCOPE_CONTAINER)
     {
@@ -218,7 +202,7 @@ class Container implements IntrospectableContainerInterface
 
         $this->services[$id] = $service;
 
-        if (method_exists($this, $method = 'synchronize'.strtr($id, array('_' => '', '.' => '_', '\\' => '_')).'Service')) {
+        if (method_exists($this, $method = 'synchronize'.strtr($id, $this->underscoreMap).'Service')) {
             $this->$method();
         }
 
@@ -236,23 +220,24 @@ class Container implements IntrospectableContainerInterface
      *
      * @param string $id The service identifier
      *
-     * @return bool    true if the service is defined, false otherwise
-     *
-     * @api
+     * @return bool true if the service is defined, false otherwise
      */
     public function has($id)
     {
-        $id = strtolower($id);
-
-        if ('service_container' === $id) {
-            return true;
+        for ($i = 2;;) {
+            if ('service_container' === $id
+                || isset($this->aliases[$id])
+                || isset($this->services[$id])
+                || array_key_exists($id, $this->services)
+            ) {
+                return true;
+            }
+            if (--$i && $id !== $lcId = strtolower($id)) {
+                $id = $lcId;
+            } else {
+                return method_exists($this, 'get'.strtr($id, $this->underscoreMap).'Service');
+            }
         }
-
-        return isset($this->services[$id])
-            || array_key_exists($id, $this->services)
-            || isset($this->aliases[$id])
-            || method_exists($this, 'get'.strtr($id, array('_' => '', '.' => '_', '\\' => '_')).'Service')
-        ;
     }
 
     /**
@@ -261,19 +246,16 @@ class Container implements IntrospectableContainerInterface
      * If a service is defined both through a set() method and
      * with a get{$id}Service() method, the former has always precedence.
      *
-     * @param string  $id              The service identifier
-     * @param int     $invalidBehavior The behavior when the service does not exist
+     * @param string $id              The service identifier
+     * @param int    $invalidBehavior The behavior when the service does not exist
      *
      * @return object The associated service
      *
-     * @throws InvalidArgumentException          if the service is not defined
      * @throws ServiceCircularReferenceException When a circular reference is detected
      * @throws ServiceNotFoundException          When the service is not defined
      * @throws \Exception                        if an exception has been thrown when the service has been resolved
      *
      * @see Reference
-     *
-     * @api
      */
     public function get($id, $invalidBehavior = self::EXCEPTION_ON_INVALID_REFERENCE)
     {
@@ -281,10 +263,7 @@ class Container implements IntrospectableContainerInterface
         // available services. Service IDs are case insensitive, however since
         // this method can be called thousands of times during a request, avoid
         // calling strtolower() unless necessary.
-        foreach (array(false, true) as $strtolower) {
-            if ($strtolower) {
-                $id = strtolower($id);
-            }
+        for ($i = 2;;) {
             if ('service_container' === $id) {
                 return $this;
             }
@@ -295,65 +274,68 @@ class Container implements IntrospectableContainerInterface
             if (isset($this->services[$id]) || array_key_exists($id, $this->services)) {
                 return $this->services[$id];
             }
-        }
 
-        if (isset($this->loading[$id])) {
-            throw new ServiceCircularReferenceException($id, array_keys($this->loading));
-        }
+            if (isset($this->loading[$id])) {
+                throw new ServiceCircularReferenceException($id, array_keys($this->loading));
+            }
 
-        if (isset($this->methodMap[$id])) {
-            $method = $this->methodMap[$id];
-        } elseif (method_exists($this, $method = 'get'.strtr($id, array('_' => '', '.' => '_', '\\' => '_')).'Service')) {
-            // $method is set to the right value, proceed
-        } else {
-            if (self::EXCEPTION_ON_INVALID_REFERENCE === $invalidBehavior) {
-                if (!$id) {
-                    throw new ServiceNotFoundException($id);
-                }
+            if (isset($this->methodMap[$id])) {
+                $method = $this->methodMap[$id];
+            } elseif (--$i && $id !== $lcId = strtolower($id)) {
+                $id = $lcId;
+                continue;
+            } elseif (method_exists($this, $method = 'get'.strtr($id, $this->underscoreMap).'Service')) {
+                // $method is set to the right value, proceed
+            } else {
+                if (self::EXCEPTION_ON_INVALID_REFERENCE === $invalidBehavior) {
+                    if (!$id) {
+                        throw new ServiceNotFoundException($id);
+                    }
 
-                $alternatives = array();
-                foreach (array_keys($this->services) as $key) {
-                    $lev = levenshtein($id, $key);
-                    if ($lev <= strlen($id) / 3 || false !== strpos($key, $id)) {
-                        $alternatives[] = $key;
+                    $alternatives = array();
+                    foreach ($this->services as $key => $associatedService) {
+                        $lev = levenshtein($id, $key);
+                        if ($lev <= strlen($id) / 3 || false !== strpos($key, $id)) {
+                            $alternatives[] = $key;
+                        }
                     }
+
+                    throw new ServiceNotFoundException($id, null, null, $alternatives);
                 }
 
-                throw new ServiceNotFoundException($id, null, null, $alternatives);
+                return;
             }
 
-            return;
-        }
+            $this->loading[$id] = true;
 
-        $this->loading[$id] = true;
+            try {
+                $service = $this->$method();
+            } catch (\Exception $e) {
+                unset($this->loading[$id]);
 
-        try {
-            $service = $this->$method();
-        } catch (\Exception $e) {
-            unset($this->loading[$id]);
+                if (array_key_exists($id, $this->services)) {
+                    unset($this->services[$id]);
+                }
 
-            if (array_key_exists($id, $this->services)) {
-                unset($this->services[$id]);
-            }
+                if ($e instanceof InactiveScopeException && self::EXCEPTION_ON_INVALID_REFERENCE !== $invalidBehavior) {
+                    return;
+                }
 
-            if ($e instanceof InactiveScopeException && self::EXCEPTION_ON_INVALID_REFERENCE !== $invalidBehavior) {
-                return;
+                throw $e;
             }
 
-            throw $e;
-        }
-
-        unset($this->loading[$id]);
+            unset($this->loading[$id]);
 
-        return $service;
+            return $service;
+        }
     }
 
     /**
-     * Returns true if the given service has actually been initialized
+     * Returns true if the given service has actually been initialized.
      *
      * @param string $id The service identifier
      *
-     * @return bool    true if service has already been initialized, false otherwise
+     * @return bool true if service has already been initialized, false otherwise
      */
     public function initialized($id)
     {
@@ -365,6 +347,10 @@ class Container implements IntrospectableContainerInterface
             return true;
         }
 
+        if (isset($this->aliases[$id])) {
+            $id = $this->aliases[$id];
+        }
+
         return isset($this->services[$id]) || array_key_exists($id, $this->services);
     }
 
@@ -388,14 +374,12 @@ class Container implements IntrospectableContainerInterface
     }
 
     /**
-     * This is called when you enter a scope
+     * This is called when you enter a scope.
      *
      * @param string $name
      *
      * @throws RuntimeException         When the parent scope is inactive
      * @throws InvalidArgumentException When the scope does not exist
-     *
-     * @api
      */
     public function enterScope($name)
     {
@@ -442,8 +426,6 @@ class Container implements IntrospectableContainerInterface
      * @param string $name The name of the scope to leave
      *
      * @throws InvalidArgumentException if the scope is not active
-     *
-     * @api
      */
     public function leaveScope($name)
     {
@@ -484,8 +466,6 @@ class Container implements IntrospectableContainerInterface
      * @param ScopeInterface $scope
      *
      * @throws InvalidArgumentException
-     *
-     * @api
      */
     public function addScope(ScopeInterface $scope)
     {
@@ -513,13 +493,11 @@ class Container implements IntrospectableContainerInterface
     }
 
     /**
-     * Returns whether this container has a certain scope
+     * Returns whether this container has a certain scope.
      *
      * @param string $name The name of the scope
      *
      * @return bool
-     *
-     * @api
      */
     public function hasScope($name)
     {
@@ -527,15 +505,13 @@ class Container implements IntrospectableContainerInterface
     }
 
     /**
-     * Returns whether this scope is currently active
+     * Returns whether this scope is currently active.
      *
      * This does not actually check if the passed scope actually exists.
      *
      * @param string $name
      *
      * @return bool
-     *
-     * @api
      */
     public function isScopeActive($name)
     {
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ContainerAware.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ContainerAware.php
@@ -15,24 +15,18 @@ namespace Symfony\Component\DependencyInjection;
  * A simple implementation of ContainerAwareInterface.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 abstract class ContainerAware implements ContainerAwareInterface
 {
     /**
      * @var ContainerInterface
-     *
-     * @api
      */
     protected $container;
 
     /**
-     * Sets the Container associated with this Controller.
-     *
-     * @param ContainerInterface $container A ContainerInterface instance
+     * Sets the container.
      *
-     * @api
+     * @param ContainerInterface|null $container A ContainerInterface instance or null
      */
     public function setContainer(ContainerInterface $container = null)
     {
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ContainerAwareInterface.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ContainerAwareInterface.php
@@ -15,17 +15,13 @@ namespace Symfony\Component\DependencyInjection;
  * ContainerAwareInterface should be implemented by classes that depends on a Container.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 interface ContainerAwareInterface
 {
     /**
-     * Sets the Container.
+     * Sets the container.
      *
      * @param ContainerInterface|null $container A ContainerInterface instance or null
-     *
-     * @api
      */
     public function setContainer(ContainerInterface $container = null);
 }
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ContainerBuilder.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ContainerBuilder.php
@@ -29,8 +29,6 @@ use Symfony\Component\DependencyInjection\LazyProxy\Instantiator\RealServiceInst
  * ContainerBuilder is a DI container that provides an API to easily describe services.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class ContainerBuilder extends Container implements TaggedContainerInterface
 {
@@ -84,7 +82,7 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * If you are not using the loaders and therefore don't want
      * to depend on the Config component, set this flag to false.
      *
-     * @param bool    $track true if you want to track resources, false otherwise
+     * @param bool $track true if you want to track resources, false otherwise
      */
     public function setResourceTracking($track)
     {
@@ -94,7 +92,7 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
     /**
      * Checks if resources are tracked.
      *
-     * @return bool    true if resources are tracked, false otherwise
+     * @return bool true if resources are tracked, false otherwise
      */
     public function isTrackingResources()
     {
@@ -115,8 +113,6 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * Registers an extension.
      *
      * @param ExtensionInterface $extension An extension instance
-     *
-     * @api
      */
     public function registerExtension(ExtensionInterface $extension)
     {
@@ -135,8 +131,6 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * @return ExtensionInterface An extension instance
      *
      * @throws LogicException if the extension is not registered
-     *
-     * @api
      */
     public function getExtension($name)
     {
@@ -155,8 +149,6 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * Returns all registered extensions.
      *
      * @return ExtensionInterface[] An array of ExtensionInterface
-     *
-     * @api
      */
     public function getExtensions()
     {
@@ -168,9 +160,7 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      *
      * @param string $name The name of the extension
      *
-     * @return bool    If the extension exists
-     *
-     * @api
+     * @return bool If the extension exists
      */
     public function hasExtension($name)
     {
@@ -181,8 +171,6 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * Returns an array of resources loaded to build this configuration.
      *
      * @return ResourceInterface[] An array of resources
-     *
-     * @api
      */
     public function getResources()
     {
@@ -195,8 +183,6 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * @param ResourceInterface $resource A resource instance
      *
      * @return ContainerBuilder The current instance
-     *
-     * @api
      */
     public function addResource(ResourceInterface $resource)
     {
@@ -215,8 +201,6 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * @param ResourceInterface[] $resources An array of resources
      *
      * @return ContainerBuilder The current instance
-     *
-     * @api
      */
     public function setResources(array $resources)
     {
@@ -235,8 +219,6 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * @param object $object An object instance
      *
      * @return ContainerBuilder The current instance
-     *
-     * @api
      */
     public function addObjectResource($object)
     {
@@ -274,11 +256,9 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * @param array  $values    An array of values that customizes the extension
      *
      * @return ContainerBuilder The current instance
-     * @throws BadMethodCallException When this ContainerBuilder is frozen
-     *
-     * @throws \LogicException if the container is frozen
      *
-     * @api
+     * @throws BadMethodCallException When this ContainerBuilder is frozen
+     * @throws \LogicException        if the container is frozen
      */
     public function loadFromExtension($extension, array $values = array())
     {
@@ -300,8 +280,6 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * @param string                $type The type of compiler pass
      *
      * @return ContainerBuilder The current instance
-     *
-     * @api
      */
     public function addCompilerPass(CompilerPassInterface $pass, $type = PassConfig::TYPE_BEFORE_OPTIMIZATION)
     {
@@ -320,8 +298,6 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * Returns the compiler pass config which can then be modified.
      *
      * @return PassConfig The compiler pass config
-     *
-     * @api
      */
     public function getCompilerPassConfig()
     {
@@ -336,8 +312,6 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * Returns the compiler.
      *
      * @return Compiler The compiler
-     *
-     * @api
      */
     public function getCompiler()
     {
@@ -352,8 +326,6 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * Returns all Scopes.
      *
      * @return array An array of scopes
-     *
-     * @api
      */
     public function getScopes()
     {
@@ -364,8 +336,6 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * Returns all Scope children.
      *
      * @return array An array of scope children.
-     *
-     * @api
      */
     public function getScopeChildren()
     {
@@ -380,8 +350,6 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * @param string $scope   The scope
      *
      * @throws BadMethodCallException When this ContainerBuilder is frozen
-     *
-     * @api
      */
     public function set($id, $service, $scope = self::SCOPE_CONTAINER)
     {
@@ -417,8 +385,6 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * Removes a service definition.
      *
      * @param string $id The service identifier
-     *
-     * @api
      */
     public function removeDefinition($id)
     {
@@ -430,9 +396,7 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      *
      * @param string $id The service identifier
      *
-     * @return bool    true if the service is defined, false otherwise
-     *
-     * @api
+     * @return bool true if the service is defined, false otherwise
      */
     public function has($id)
     {
@@ -444,8 +408,8 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
     /**
      * Gets a service.
      *
-     * @param string  $id              The service identifier
-     * @param int     $invalidBehavior The behavior when the service does not exist
+     * @param string $id              The service identifier
+     * @param int    $invalidBehavior The behavior when the service does not exist
      *
      * @return object The associated service
      *
@@ -455,8 +419,6 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * @throws \Exception
      *
      * @see Reference
-     *
-     * @api
      */
     public function get($id, $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE)
     {
@@ -470,7 +432,7 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
             throw new LogicException(sprintf('The service "%s" has a circular reference to itself.', $id));
         }
 
-        if (!$this->hasDefinition($id) && isset($this->aliasDefinitions[$id])) {
+        if (!array_key_exists($id, $this->definitions) && isset($this->aliasDefinitions[$id])) {
             return $this->get($this->aliasDefinitions[$id]);
         }
 
@@ -523,10 +485,7 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      *
      * @param ContainerBuilder $container The ContainerBuilder instance to merge.
      *
-     *
      * @throws BadMethodCallException When this ContainerBuilder is frozen
-     *
-     * @api
      */
     public function merge(ContainerBuilder $container)
     {
@@ -559,8 +518,6 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * @param string $name The name of the extension
      *
      * @return array An array of configuration
-     *
-     * @api
      */
     public function getExtensionConfig($name)
     {
@@ -574,8 +531,8 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
     /**
      * Prepends a config array to the configs of the given extension.
      *
-     * @param string $name    The name of the extension
-     * @param array  $config  The config to set
+     * @param string $name   The name of the extension
+     * @param array  $config The config to set
      */
     public function prependExtensionConfig($name, array $config)
     {
@@ -599,8 +556,6 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      *  * Parameter values are resolved;
      *  * The parameter bag is frozen;
      *  * Extension loading is disabled.
-     *
-     * @api
      */
     public function compile()
     {
@@ -643,8 +598,6 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * Adds the service aliases.
      *
      * @param array $aliases An array of aliases
-     *
-     * @api
      */
     public function addAliases(array $aliases)
     {
@@ -657,8 +610,6 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * Sets the service aliases.
      *
      * @param array $aliases An array of aliases
-     *
-     * @api
      */
     public function setAliases(array $aliases)
     {
@@ -669,13 +620,11 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
     /**
      * Sets an alias for an existing service.
      *
-     * @param string        $alias The alias to create
-     * @param string|Alias  $id    The service to alias
+     * @param string       $alias The alias to create
+     * @param string|Alias $id    The service to alias
      *
      * @throws InvalidArgumentException if the id is not a string or an Alias
      * @throws InvalidArgumentException if the alias is for itself
-     *
-     * @api
      */
     public function setAlias($alias, $id)
     {
@@ -687,7 +636,7 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
             throw new InvalidArgumentException('$id must be a string, or an Alias object.');
         }
 
-        if ($alias === strtolower($id)) {
+        if ($alias === (string) $id) {
             throw new InvalidArgumentException(sprintf('An alias can not reference itself, got a circular reference on "%s".', $alias));
         }
 
@@ -700,8 +649,6 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * Removes an alias.
      *
      * @param string $alias The alias to remove
-     *
-     * @api
      */
     public function removeAlias($alias)
     {
@@ -713,9 +660,7 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      *
      * @param string $id The service identifier
      *
-     * @return bool    true if the alias exists, false otherwise
-     *
-     * @api
+     * @return bool true if the alias exists, false otherwise
      */
     public function hasAlias($id)
     {
@@ -726,8 +671,6 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * Gets all defined aliases.
      *
      * @return Alias[] An array of aliases
-     *
-     * @api
      */
     public function getAliases()
     {
@@ -742,14 +685,12 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * @return Alias An Alias instance
      *
      * @throws InvalidArgumentException if the alias does not exist
-     *
-     * @api
      */
     public function getAlias($id)
     {
         $id = strtolower($id);
 
-        if (!$this->hasAlias($id)) {
+        if (!isset($this->aliasDefinitions[$id])) {
             throw new InvalidArgumentException(sprintf('The service alias "%s" does not exist.', $id));
         }
 
@@ -766,20 +707,16 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * @param string $class The service class
      *
      * @return Definition A Definition instance
-     *
-     * @api
      */
     public function register($id, $class = null)
     {
-        return $this->setDefinition(strtolower($id), new Definition($class));
+        return $this->setDefinition($id, new Definition($class));
     }
 
     /**
      * Adds the service definitions.
      *
      * @param Definition[] $definitions An array of service definitions
-     *
-     * @api
      */
     public function addDefinitions(array $definitions)
     {
@@ -792,8 +729,6 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * Sets the service definitions.
      *
      * @param Definition[] $definitions An array of service definitions
-     *
-     * @api
      */
     public function setDefinitions(array $definitions)
     {
@@ -805,8 +740,6 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * Gets all service definitions.
      *
      * @return Definition[] An array of Definition instances
-     *
-     * @api
      */
     public function getDefinitions()
     {
@@ -822,8 +755,6 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * @return Definition the service definition
      *
      * @throws BadMethodCallException When this ContainerBuilder is frozen
-     *
-     * @api
      */
     public function setDefinition($id, Definition $definition)
     {
@@ -843,9 +774,7 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      *
      * @param string $id The service identifier
      *
-     * @return bool    true if the service definition exists, false otherwise
-     *
-     * @api
+     * @return bool true if the service definition exists, false otherwise
      */
     public function hasDefinition($id)
     {
@@ -860,14 +789,12 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * @return Definition A Definition instance
      *
      * @throws InvalidArgumentException if the service definition does not exist
-     *
-     * @api
      */
     public function getDefinition($id)
     {
         $id = strtolower($id);
 
-        if (!$this->hasDefinition($id)) {
+        if (!array_key_exists($id, $this->definitions)) {
             throw new InvalidArgumentException(sprintf('The service definition "%s" does not exist.', $id));
         }
 
@@ -884,13 +811,13 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * @return Definition A Definition instance
      *
      * @throws InvalidArgumentException if the service definition does not exist
-     *
-     * @api
      */
     public function findDefinition($id)
     {
-        while ($this->hasAlias($id)) {
-            $id = (string) $this->getAlias($id);
+        $id = strtolower($id);
+
+        while (isset($this->aliasDefinitions[$id])) {
+            $id = (string) $this->aliasDefinitions[$id];
         }
 
         return $this->getDefinition($id);
@@ -905,9 +832,9 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      *
      * @return object The service described by the service definition
      *
-     * @throws RuntimeException When the scope is inactive
-     * @throws RuntimeException When the factory definition is incomplete
-     * @throws RuntimeException When the service is a synthetic service
+     * @throws RuntimeException         When the scope is inactive
+     * @throws RuntimeException         When the factory definition is incomplete
+     * @throws RuntimeException         When the service is a synthetic service
      * @throws InvalidArgumentException When configure callable is not callable
      *
      * @internal this method is public because of PHP 5.3 limitations, do not use it explicitly in your code
@@ -968,7 +895,7 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
             $this->callMethod($service, $call);
         }
 
-        $properties = $this->resolveServices($parameterBag->resolveValue($definition->getProperties()));
+        $properties = $this->resolveServices($parameterBag->unescapeValue($parameterBag->resolveValue($definition->getProperties())));
         foreach ($properties as $name => $value) {
             $service->$name = $value;
         }
@@ -998,8 +925,8 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
     public function resolveServices($value)
     {
         if (is_array($value)) {
-            foreach ($value as &$v) {
-                $v = $this->resolveServices($v);
+            foreach ($value as $k => $v) {
+                $value[$k] = $this->resolveServices($v);
             }
         } elseif ($value instanceof Reference) {
             $value = $this->get((string) $value, $value->getInvalidBehavior());
@@ -1027,8 +954,6 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * @param string $name The tag name
      *
      * @return array An array of tags with the tagged service as key, holding a list of attribute arrays.
-     *
-     * @api
      */
     public function findTaggedServiceIds($name)
     {
@@ -1129,11 +1054,11 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
             }
         }
 
-        call_user_func_array(array($service, $call[0]), $this->resolveServices($this->getParameterBag()->resolveValue($call[1])));
+        call_user_func_array(array($service, $call[0]), $this->resolveServices($this->getParameterBag()->unescapeValue($this->getParameterBag()->resolveValue($call[1]))));
     }
 
     /**
-     * Shares a given service in the container
+     * Shares a given service in the container.
      *
      * @param Definition $definition
      * @param mixed      $service
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ContainerInterface.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ContainerInterface.php
@@ -20,16 +20,14 @@ use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
  *
  * @author Fabien Potencier <fabien@symfony.com>
  * @author Johannes M. Schmitt <schmittjoh@gmail.com>
- *
- * @api
  */
 interface ContainerInterface
 {
     const EXCEPTION_ON_INVALID_REFERENCE = 1;
-    const NULL_ON_INVALID_REFERENCE      = 2;
-    const IGNORE_ON_INVALID_REFERENCE    = 3;
-    const SCOPE_CONTAINER                = 'container';
-    const SCOPE_PROTOTYPE                = 'prototype';
+    const NULL_ON_INVALID_REFERENCE = 2;
+    const IGNORE_ON_INVALID_REFERENCE = 3;
+    const SCOPE_CONTAINER = 'container';
+    const SCOPE_PROTOTYPE = 'prototype';
 
     /**
      * Sets a service.
@@ -37,8 +35,6 @@ interface ContainerInterface
      * @param string $id      The service identifier
      * @param object $service The service instance
      * @param string $scope   The scope of the service
-     *
-     * @api
      */
     public function set($id, $service, $scope = self::SCOPE_CONTAINER);
 
@@ -50,13 +46,10 @@ interface ContainerInterface
      *
      * @return object The associated service
      *
-     * @throws InvalidArgumentException if the service is not defined
      * @throws ServiceCircularReferenceException When a circular reference is detected
-     * @throws ServiceNotFoundException When the service is not defined
+     * @throws ServiceNotFoundException          When the service is not defined
      *
      * @see Reference
-     *
-     * @api
      */
     public function get($id, $invalidBehavior = self::EXCEPTION_ON_INVALID_REFERENCE);
 
@@ -65,9 +58,7 @@ interface ContainerInterface
      *
      * @param string $id The service identifier
      *
-     * @return bool    true if the service is defined, false otherwise
-     *
-     * @api
+     * @return bool true if the service is defined, false otherwise
      */
     public function has($id);
 
@@ -76,11 +67,9 @@ interface ContainerInterface
      *
      * @param string $name The parameter name
      *
-     * @return mixed  The parameter value
+     * @return mixed The parameter value
      *
      * @throws InvalidArgumentException if the parameter is not defined
-     *
-     * @api
      */
     public function getParameter($name);
 
@@ -89,9 +78,7 @@ interface ContainerInterface
      *
      * @param string $name The parameter name
      *
-     * @return bool    The presence of parameter in container
-     *
-     * @api
+     * @return bool The presence of parameter in container
      */
     public function hasParameter($name);
 
@@ -100,46 +87,36 @@ interface ContainerInterface
      *
      * @param string $name  The parameter name
      * @param mixed  $value The parameter value
-     *
-     * @api
      */
     public function setParameter($name, $value);
 
     /**
-     * Enters the given scope
+     * Enters the given scope.
      *
      * @param string $name
-     *
-     * @api
      */
     public function enterScope($name);
 
     /**
-     * Leaves the current scope, and re-enters the parent scope
+     * Leaves the current scope, and re-enters the parent scope.
      *
      * @param string $name
-     *
-     * @api
      */
     public function leaveScope($name);
 
     /**
-     * Adds a scope to the container
+     * Adds a scope to the container.
      *
      * @param ScopeInterface $scope
-     *
-     * @api
      */
     public function addScope(ScopeInterface $scope);
 
     /**
-     * Whether this container has the given scope
+     * Whether this container has the given scope.
      *
      * @param string $name
      *
      * @return bool
-     *
-     * @api
      */
     public function hasScope($name);
 
@@ -151,8 +128,6 @@ interface ContainerInterface
      * @param string $name
      *
      * @return bool
-     *
-     * @api
      */
     public function isScopeActive($name);
 }
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Definition.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Definition.php
@@ -18,8 +18,6 @@ use Symfony\Component\DependencyInjection\Exception\OutOfBoundsException;
  * Definition represents a service definition.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class Definition
 {
@@ -46,8 +44,6 @@ class Definition
      *
      * @param string $class     The service class
      * @param array  $arguments An array of arguments to pass to the service constructor
-     *
-     * @api
      */
     public function __construct($class = null, array $arguments = array())
     {
@@ -71,8 +67,6 @@ class Definition
      * @param string $factoryClass The factory class name
      *
      * @return Definition The current instance
-     *
-     * @api
      */
     public function setFactoryClass($factoryClass)
     {
@@ -85,8 +79,6 @@ class Definition
      * Gets the factory class.
      *
      * @return string The factory class name
-     *
-     * @api
      */
     public function getFactoryClass()
     {
@@ -99,8 +91,6 @@ class Definition
      * @param string $factoryMethod The factory method name
      *
      * @return Definition The current instance
-     *
-     * @api
      */
     public function setFactoryMethod($factoryMethod)
     {
@@ -113,8 +103,6 @@ class Definition
      * Gets the factory method.
      *
      * @return string The factory method name
-     *
-     * @api
      */
     public function getFactoryMethod()
     {
@@ -127,8 +115,6 @@ class Definition
      * @param string $factoryService The factory service id
      *
      * @return Definition The current instance
-     *
-     * @api
      */
     public function setFactoryService($factoryService)
     {
@@ -141,8 +127,6 @@ class Definition
      * Gets the factory service id.
      *
      * @return string The factory service id
-     *
-     * @api
      */
     public function getFactoryService()
     {
@@ -155,8 +139,6 @@ class Definition
      * @param string $class The service class
      *
      * @return Definition The current instance
-     *
-     * @api
      */
     public function setClass($class)
     {
@@ -169,8 +151,6 @@ class Definition
      * Gets the service class.
      *
      * @return string The service class
-     *
-     * @api
      */
     public function getClass()
     {
@@ -183,8 +163,6 @@ class Definition
      * @param array $arguments An array of arguments
      *
      * @return Definition The current instance
-     *
-     * @api
      */
     public function setArguments(array $arguments)
     {
@@ -193,9 +171,6 @@ class Definition
         return $this;
     }
 
-    /**
-     * @api
-     */
     public function setProperties(array $properties)
     {
         $this->properties = $properties;
@@ -203,17 +178,11 @@ class Definition
         return $this;
     }
 
-    /**
-     * @api
-     */
     public function getProperties()
     {
         return $this->properties;
     }
 
-    /**
-     * @api
-     */
     public function setProperty($name, $value)
     {
         $this->properties[$name] = $value;
@@ -227,8 +196,6 @@ class Definition
      * @param mixed $argument An argument
      *
      * @return Definition The current instance
-     *
-     * @api
      */
     public function addArgument($argument)
     {
@@ -238,16 +205,14 @@ class Definition
     }
 
     /**
-     * Sets a specific argument
+     * Sets a specific argument.
      *
-     * @param int     $index
-     * @param mixed   $argument
+     * @param int   $index
+     * @param mixed $argument
      *
      * @return Definition The current instance
      *
      * @throws OutOfBoundsException When the replaced argument does not exist
-     *
-     * @api
      */
     public function replaceArgument($index, $argument)
     {
@@ -264,8 +229,6 @@ class Definition
      * Gets the arguments to pass to the service constructor/factory method.
      *
      * @return array The array of arguments
-     *
-     * @api
      */
     public function getArguments()
     {
@@ -275,13 +238,11 @@ class Definition
     /**
      * Gets an argument to pass to the service constructor/factory method.
      *
-     * @param int     $index
+     * @param int $index
      *
      * @return mixed The argument value
      *
      * @throws OutOfBoundsException When the argument does not exist
-     *
-     * @api
      */
     public function getArgument($index)
     {
@@ -298,8 +259,6 @@ class Definition
      * @param array $calls An array of method calls
      *
      * @return Definition The current instance
-     *
-     * @api
      */
     public function setMethodCalls(array $calls = array())
     {
@@ -320,8 +279,6 @@ class Definition
      * @return Definition The current instance
      *
      * @throws InvalidArgumentException on empty $method param
-     *
-     * @api
      */
     public function addMethodCall($method, array $arguments = array())
     {
@@ -339,8 +296,6 @@ class Definition
      * @param string $method The method name to remove
      *
      * @return Definition The current instance
-     *
-     * @api
      */
     public function removeMethodCall($method)
     {
@@ -360,8 +315,6 @@ class Definition
      * @param string $method The method name to search for
      *
      * @return bool
-     *
-     * @api
      */
     public function hasMethodCall($method)
     {
@@ -378,8 +331,6 @@ class Definition
      * Gets the methods to call after service initialization.
      *
      * @return array An array of method calls
-     *
-     * @api
      */
     public function getMethodCalls()
     {
@@ -387,13 +338,11 @@ class Definition
     }
 
     /**
-     * Sets tags for this definition
+     * Sets tags for this definition.
      *
      * @param array $tags
      *
      * @return Definition the current instance
-     *
-     * @api
      */
     public function setTags(array $tags)
     {
@@ -406,8 +355,6 @@ class Definition
      * Returns all tags.
      *
      * @return array An array of tags
-     *
-     * @api
      */
     public function getTags()
     {
@@ -420,8 +367,6 @@ class Definition
      * @param string $name The tag name
      *
      * @return array An array of attributes
-     *
-     * @api
      */
     public function getTag($name)
     {
@@ -435,8 +380,6 @@ class Definition
      * @param array  $attributes An array of attributes
      *
      * @return Definition The current instance
-     *
-     * @api
      */
     public function addTag($name, array $attributes = array())
     {
@@ -446,13 +389,11 @@ class Definition
     }
 
     /**
-     * Whether this definition has a tag with the given name
+     * Whether this definition has a tag with the given name.
      *
      * @param string $name
      *
      * @return bool
-     *
-     * @api
      */
     public function hasTag($name)
     {
@@ -479,8 +420,6 @@ class Definition
      * Clears the tags for this definition.
      *
      * @return Definition The current instance
-     *
-     * @api
      */
     public function clearTags()
     {
@@ -495,8 +434,6 @@ class Definition
      * @param string $file A full pathname to include
      *
      * @return Definition The current instance
-     *
-     * @api
      */
     public function setFile($file)
     {
@@ -509,8 +446,6 @@ class Definition
      * Gets the file to require before creating the service.
      *
      * @return string The full pathname to include
-     *
-     * @api
      */
     public function getFile()
     {
@@ -518,13 +453,11 @@ class Definition
     }
 
     /**
-     * Sets the scope of the service
+     * Sets the scope of the service.
      *
      * @param string $scope Whether the service must be shared or not
      *
      * @return Definition The current instance
-     *
-     * @api
      */
     public function setScope($scope)
     {
@@ -534,11 +467,9 @@ class Definition
     }
 
     /**
-     * Returns the scope of the service
+     * Returns the scope of the service.
      *
      * @return string
-     *
-     * @api
      */
     public function getScope()
     {
@@ -548,11 +479,9 @@ class Definition
     /**
      * Sets the visibility of this service.
      *
-     * @param bool    $boolean
+     * @param bool $boolean
      *
      * @return Definition The current instance
-     *
-     * @api
      */
     public function setPublic($boolean)
     {
@@ -562,11 +491,9 @@ class Definition
     }
 
     /**
-     * Whether this service is public facing
+     * Whether this service is public facing.
      *
      * @return bool
-     *
-     * @api
      */
     public function isPublic()
     {
@@ -576,11 +503,9 @@ class Definition
     /**
      * Sets the synchronized flag of this service.
      *
-     * @param bool    $boolean
+     * @param bool $boolean
      *
      * @return Definition The current instance
-     *
-     * @api
      */
     public function setSynchronized($boolean)
     {
@@ -593,8 +518,6 @@ class Definition
      * Whether this service is synchronized.
      *
      * @return bool
-     *
-     * @api
      */
     public function isSynchronized()
     {
@@ -604,7 +527,7 @@ class Definition
     /**
      * Sets the lazy flag of this service.
      *
-     * @param bool    $lazy
+     * @param bool $lazy
      *
      * @return Definition The current instance
      */
@@ -629,11 +552,9 @@ class Definition
      * Sets whether this definition is synthetic, that is not constructed by the
      * container, but dynamically injected.
      *
-     * @param bool    $boolean
+     * @param bool $boolean
      *
      * @return Definition the current instance
-     *
-     * @api
      */
     public function setSynthetic($boolean)
     {
@@ -647,8 +568,6 @@ class Definition
      * container, but dynamically injected.
      *
      * @return bool
-     *
-     * @api
      */
     public function isSynthetic()
     {
@@ -659,11 +578,9 @@ class Definition
      * Whether this definition is abstract, that means it merely serves as a
      * template for other definitions.
      *
-     * @param bool    $boolean
+     * @param bool $boolean
      *
      * @return Definition the current instance
-     *
-     * @api
      */
     public function setAbstract($boolean)
     {
@@ -677,8 +594,6 @@ class Definition
      * template for other definitions.
      *
      * @return bool
-     *
-     * @api
      */
     public function isAbstract()
     {
@@ -691,8 +606,6 @@ class Definition
      * @param callable $callable A PHP callable
      *
      * @return Definition The current instance
-     *
-     * @api
      */
     public function setConfigurator($callable)
     {
@@ -705,8 +618,6 @@ class Definition
      * Gets the configurator to call after the service is fully initialized.
      *
      * @return callable The PHP callable to call
-     *
-     * @api
      */
     public function getConfigurator()
     {
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/DefinitionDecorator.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/DefinitionDecorator.php
@@ -18,8 +18,6 @@ use Symfony\Component\DependencyInjection\Exception\OutOfBoundsException;
  * This definition decorates another definition.
  *
  * @author Johannes M. Schmitt <schmittjoh@gmail.com>
- *
- * @api
  */
 class DefinitionDecorator extends Definition
 {
@@ -30,8 +28,6 @@ class DefinitionDecorator extends Definition
      * Constructor.
      *
      * @param string $parent The id of Definition instance to decorate.
-     *
-     * @api
      */
     public function __construct($parent)
     {
@@ -45,8 +41,6 @@ class DefinitionDecorator extends Definition
      * Returns the Definition being decorated.
      *
      * @return string
-     *
-     * @api
      */
     public function getParent()
     {
@@ -57,8 +51,6 @@ class DefinitionDecorator extends Definition
      * Returns all changes tracked for the Definition object.
      *
      * @return array An array of changes for this Definition
-     *
-     * @api
      */
     public function getChanges()
     {
@@ -67,8 +59,6 @@ class DefinitionDecorator extends Definition
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function setClass($class)
     {
@@ -79,8 +69,6 @@ class DefinitionDecorator extends Definition
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function setFactoryClass($class)
     {
@@ -91,8 +79,6 @@ class DefinitionDecorator extends Definition
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function setFactoryMethod($method)
     {
@@ -103,8 +89,6 @@ class DefinitionDecorator extends Definition
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function setFactoryService($service)
     {
@@ -115,8 +99,6 @@ class DefinitionDecorator extends Definition
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function setConfigurator($callable)
     {
@@ -127,8 +109,6 @@ class DefinitionDecorator extends Definition
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function setFile($file)
     {
@@ -139,8 +119,6 @@ class DefinitionDecorator extends Definition
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function setPublic($boolean)
     {
@@ -151,8 +129,6 @@ class DefinitionDecorator extends Definition
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function setLazy($boolean)
     {
@@ -167,13 +143,11 @@ class DefinitionDecorator extends Definition
      * If replaceArgument() has been used to replace an argument, this method
      * will return the replacement value.
      *
-     * @param int     $index
+     * @param int $index
      *
      * @return mixed The argument value
      *
      * @throws OutOfBoundsException When the argument does not exist
-     *
-     * @api
      */
     public function getArgument($index)
     {
@@ -198,13 +172,12 @@ class DefinitionDecorator extends Definition
      * certain conventions when you want to overwrite the arguments of the
      * parent definition, otherwise your arguments will only be appended.
      *
-     * @param int     $index
-     * @param mixed   $value
+     * @param int   $index
+     * @param mixed $value
      *
      * @return DefinitionDecorator the current instance
-     * @throws InvalidArgumentException when $index isn't an integer
      *
-     * @api
+     * @throws InvalidArgumentException when $index isn't an integer
      */
     public function replaceArgument($index, $value)
     {
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/Dumper.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/Dumper.php
@@ -17,8 +17,6 @@ use Symfony\Component\DependencyInjection\ContainerBuilder;
  * Dumper is the abstract class for all built-in dumpers.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 abstract class Dumper implements DumperInterface
 {
@@ -28,8 +26,6 @@ abstract class Dumper implements DumperInterface
      * Constructor.
      *
      * @param ContainerBuilder $container The service container to dump
-     *
-     * @api
      */
     public function __construct(ContainerBuilder $container)
     {
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/DumperInterface.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/DumperInterface.php
@@ -15,8 +15,6 @@ namespace Symfony\Component\DependencyInjection\Dumper;
  * DumperInterface is the interface implemented by service container dumper classes.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 interface DumperInterface
 {
@@ -26,8 +24,6 @@ interface DumperInterface
      * @param array $options An array of options
      *
      * @return string The representation of the service container
-     *
-     * @api
      */
     public function dump(array $options = array());
 }
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/GraphvizDumper.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/GraphvizDumper.php
@@ -34,8 +34,8 @@ class GraphvizDumper extends Dumper
     private $edges;
     private $options = array(
             'graph' => array('ratio' => 'compress'),
-            'node'  => array('fontsize' => 11, 'fontname' => 'Arial', 'shape' => 'record'),
-            'edge'  => array('fontsize' => 9, 'fontname' => 'Arial', 'color' => 'grey', 'arrowhead' => 'open', 'arrowsize' => 0.5),
+            'node' => array('fontsize' => 11, 'fontname' => 'Arial', 'shape' => 'record'),
+            'edge' => array('fontsize' => 9, 'fontname' => 'Arial', 'color' => 'grey', 'arrowhead' => 'open', 'arrowsize' => 0.5),
             'node.instance' => array('fillcolor' => '#9999ff', 'style' => 'filled'),
             'node.definition' => array('fillcolor' => '#eeeeee'),
             'node.missing' => array('fillcolor' => '#ff9999', 'style' => 'filled'),
@@ -122,10 +122,10 @@ class GraphvizDumper extends Dumper
     /**
      * Finds all edges belonging to a specific service id.
      *
-     * @param string  $id        The service id used to find edges
-     * @param array   $arguments An array of arguments
-     * @param bool    $required
-     * @param string  $name
+     * @param string $id        The service id used to find edges
+     * @param array  $arguments An array of arguments
+     * @param bool   $required
+     * @param string $name
      *
      * @return array An array of edges
      */
@@ -165,7 +165,13 @@ class GraphvizDumper extends Dumper
         $container = $this->cloneContainer();
 
         foreach ($container->getDefinitions() as $id => $definition) {
-            $nodes[$id] = array('class' => str_replace('\\', '\\\\', $this->container->getParameterBag()->resolveValue($definition->getClass())), 'attributes' => array_merge($this->options['node.definition'], array('style' => ContainerInterface::SCOPE_PROTOTYPE !== $definition->getScope() ? 'filled' : 'dotted')));
+            $class = $definition->getClass();
+
+            if ('\\' === substr($class, 0, 1)) {
+                $class = substr($class, 1);
+            }
+
+            $nodes[$id] = array('class' => str_replace('\\', '\\\\', $this->container->getParameterBag()->resolveValue($class)), 'attributes' => array_merge($this->options['node.definition'], array('style' => ContainerInterface::SCOPE_PROTOTYPE !== $definition->getScope() ? 'filled' : 'dotted')));
 
             $container->setDefinition($id, new Definition('stdClass'));
         }
@@ -173,7 +179,7 @@ class GraphvizDumper extends Dumper
         foreach ($container->getServiceIds() as $id) {
             $service = $container->get($id);
 
-            if (in_array($id, array_keys($container->getAliases()))) {
+            if (array_key_exists($id, $container->getAliases())) {
                 continue;
             }
 
@@ -229,7 +235,7 @@ class GraphvizDumper extends Dumper
     }
 
     /**
-     * Adds attributes
+     * Adds attributes.
      *
      * @param array $attributes An array of attributes
      *
@@ -246,7 +252,7 @@ class GraphvizDumper extends Dumper
     }
 
     /**
-     * Adds options
+     * Adds options.
      *
      * @param array $options An array of options
      *
@@ -271,7 +277,7 @@ class GraphvizDumper extends Dumper
      */
     private function dotize($id)
     {
-        return strtolower(preg_replace('/[^\w]/i', '_', $id));
+        return strtolower(preg_replace('/\W/i', '_', $id));
     }
 
     /**
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php
@@ -29,19 +29,19 @@ use Symfony\Component\DependencyInjection\LazyProxy\PhpDumper\NullDumper;
  *
  * @author Fabien Potencier <fabien@symfony.com>
  * @author Johannes M. Schmitt <schmittjoh@gmail.com>
- *
- * @api
  */
 class PhpDumper extends Dumper
 {
     /**
-     * Characters that might appear in the generated variable name as first character
+     * Characters that might appear in the generated variable name as first character.
+     *
      * @var string
      */
     const FIRST_CHARS = 'abcdefghijklmnopqrstuvwxyz';
 
     /**
-     * Characters that might appear in the generated variable name as any but the first character
+     * Characters that might appear in the generated variable name as any but the first character.
+     *
      * @var string
      */
     const NON_FIRST_CHARS = 'abcdefghijklmnopqrstuvwxyz0123456789_';
@@ -51,6 +51,8 @@ class PhpDumper extends Dumper
     private $referenceVariables;
     private $variableCount;
     private $reservedVariables = array('instance', 'class');
+    private $targetDirRegex;
+    private $targetDirMaxMatches;
 
     /**
      * @var \Symfony\Component\DependencyInjection\LazyProxy\PhpDumper\DumperInterface
@@ -59,8 +61,6 @@ class PhpDumper extends Dumper
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function __construct(ContainerBuilder $container)
     {
@@ -90,16 +90,40 @@ class PhpDumper extends Dumper
      * @param array $options An array of options
      *
      * @return string A PHP class representing of the service container
-     *
-     * @api
      */
     public function dump(array $options = array())
     {
+        $this->targetDirRegex = null;
         $options = array_merge(array(
-            'class'      => 'ProjectServiceContainer',
+            'class' => 'ProjectServiceContainer',
             'base_class' => 'Container',
         ), $options);
 
+        if (!empty($options['file']) && is_dir($dir = dirname($options['file']))) {
+            // Build a regexp where the first root dirs are mandatory,
+            // but every other sub-dir is optional up to the full path in $dir
+            // Mandate at least 2 root dirs and not more that 5 optional dirs.
+
+            $dir = explode(DIRECTORY_SEPARATOR, realpath($dir));
+            $i = count($dir);
+
+            if (3 <= $i) {
+                $regex = '';
+                $lastOptionalDir = $i > 8 ? $i - 5 : 3;
+                $this->targetDirMaxMatches = $i - $lastOptionalDir;
+
+                while (--$i >= $lastOptionalDir) {
+                    $regex = sprintf('(%s%s)?', preg_quote(DIRECTORY_SEPARATOR.$dir[$i], '#'), $regex);
+                }
+
+                do {
+                    $regex = preg_quote(DIRECTORY_SEPARATOR.$dir[$i], '#').$regex;
+                } while (0 < --$i);
+
+                $this->targetDirRegex = '#'.preg_quote($dir[0], '#').$regex.'#';
+            }
+        }
+
         $code = $this->startClass($options['class'], $options['base_class']);
 
         if ($this->container->isFrozen()) {
@@ -114,6 +138,7 @@ class PhpDumper extends Dumper
             $this->endClass().
             $this->addProxyClasses()
         ;
+        $this->targetDirRegex = null;
 
         return $code;
     }
@@ -182,7 +207,7 @@ class PhpDumper extends Dumper
     }
 
     /**
-     * Generates code for the proxies to be attached after the container class
+     * Generates code for the proxies to be attached after the container class.
      *
      * @return string
      */
@@ -240,7 +265,7 @@ class PhpDumper extends Dumper
      *
      * @return string
      *
-     * @throws RuntimeException When the factory definition is incomplete
+     * @throws RuntimeException                  When the factory definition is incomplete
      * @throws ServiceCircularReferenceException When a circular reference is detected
      */
     private function addServiceInlinedDefinitions($id, $definition)
@@ -327,15 +352,21 @@ class PhpDumper extends Dumper
      */
     private function addServiceInstance($id, $definition)
     {
-        $class = $this->dumpValue($definition->getClass());
+        $class = $definition->getClass();
+
+        if ('\\' === substr($class, 0, 1)) {
+            $class = substr($class, 1);
+        }
+
+        $class = $this->dumpValue($class);
 
         if (0 === strpos($class, "'") && !preg_match('/^\'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(\\\{2}[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)*\'$/', $class)) {
             throw new InvalidArgumentException(sprintf('"%s" is not a valid class name for the "%s" service.', $class, $id));
         }
 
-        $simple           = $this->isSimpleInstance($id, $definition);
+        $simple = $this->isSimpleInstance($id, $definition);
         $isProxyCandidate = $this->getProxyDumper()->isProxyCandidate($definition);
-        $instantiation    = '';
+        $instantiation = '';
 
         if (!$isProxyCandidate && ContainerInterface::SCOPE_CONTAINER === $definition->getScope()) {
             $instantiation = "\$this->services['$id'] = ".($simple ? '' : '$instance');
@@ -464,7 +495,7 @@ class PhpDumper extends Dumper
     }
 
     /**
-     * Adds configurator definition
+     * Adds configurator definition.
      *
      * @param string     $id
      * @param Definition $definition
@@ -490,7 +521,7 @@ class PhpDumper extends Dumper
     }
 
     /**
-     * Adds a service
+     * Adds a service.
      *
      * @param string     $id
      * @param Definition $definition
@@ -508,7 +539,7 @@ class PhpDumper extends Dumper
         if ($definition->isSynthetic()) {
             $return[] = '@throws RuntimeException always since this service is expected to be injected dynamically';
         } elseif ($class = $definition->getClass()) {
-            $return[] = sprintf("@return %s A %s instance.", 0 === strpos($class, '%') ? 'object' : "\\".$class, $class);
+            $return[] = sprintf('@return %s A %s instance.', 0 === strpos($class, '%') ? 'object' : '\\'.ltrim($class, '\\'), ltrim($class, '\\'));
         } elseif ($definition->getFactoryClass()) {
             $return[] = sprintf('@return object An instance returned by %s::%s().', $definition->getFactoryClass(), $definition->getFactoryMethod());
         } elseif ($definition->getFactoryService()) {
@@ -546,17 +577,17 @@ EOF;
         }
 
         if ($definition->isLazy()) {
-            $lazyInitialization    = '$lazyLoad = true';
+            $lazyInitialization = '$lazyLoad = true';
             $lazyInitializationDoc = "\n     * @param bool    \$lazyLoad whether to try lazy-loading the service with a proxy\n     *";
         } else {
-            $lazyInitialization    = '';
+            $lazyInitialization = '';
             $lazyInitializationDoc = '';
         }
 
         // with proxies, for 5.3.3 compatibility, the getter must be public to be accessible to the initializer
         $isProxyCandidate = $this->getProxyDumper()->isProxyCandidate($definition);
-        $visibility       = $isProxyCandidate ? 'public' : 'protected';
-        $code             = <<<EOF
+        $visibility = $isProxyCandidate ? 'public' : 'protected';
+        $code = <<<EOF
 
     /**
      * Gets the '$id' service.$doc
@@ -603,7 +634,7 @@ EOF;
     }
 
     /**
-     * Adds multiple services
+     * Adds multiple services.
      *
      * @return string
      */
@@ -730,13 +761,16 @@ use Symfony\Component\DependencyInjection\Exception\RuntimeException;
 $bagClass
 
 /**
- * $class
+ * $class.
  *
  * This class has been auto-generated
  * by the Symfony Dependency Injection Component.
  */
 class $class extends $baseClass
 {
+    private \$parameters;
+    private \$targetDirs = array();
+
 EOF;
     }
 
@@ -747,6 +781,7 @@ EOF;
      */
     private function addConstructor()
     {
+        $targetDirs = $this->exportTargetDirs();
         $arguments = $this->container->getParameterBag()->all() ? 'new ParameterBag($this->getDefaultParameters())' : null;
 
         $code = <<<EOF
@@ -755,15 +790,15 @@ EOF;
      * Constructor.
      */
     public function __construct()
-    {
+    {{$targetDirs}
         parent::__construct($arguments);
 
 EOF;
 
         if (count($scopes = $this->container->getScopes()) > 0) {
             $code .= "\n";
-            $code .= "        \$this->scopes = ".$this->dumpValue($scopes).";\n";
-            $code .= "        \$this->scopeChildren = ".$this->dumpValue($this->container->getScopeChildren()).";\n";
+            $code .= '        $this->scopes = '.$this->dumpValue($scopes).";\n";
+            $code .= '        $this->scopeChildren = '.$this->dumpValue($this->container->getScopeChildren()).";\n";
         }
 
         $code .= $this->addMethodMap();
@@ -784,13 +819,15 @@ EOF;
      */
     private function addFrozenConstructor()
     {
+        $targetDirs = $this->exportTargetDirs();
+
         $code = <<<EOF
 
     /**
      * Constructor.
      */
     public function __construct()
-    {
+    {{$targetDirs}
 EOF;
 
         if ($this->container->getParameterBag()->all()) {
@@ -802,15 +839,12 @@ EOF;
         \$this->services =
         \$this->scopedServices =
         \$this->scopeStacks = array();
-
-        \$this->set('service_container', \$this);
-
 EOF;
 
         $code .= "\n";
         if (count($scopes = $this->container->getScopes()) > 0) {
-            $code .= "        \$this->scopes = ".$this->dumpValue($scopes).";\n";
-            $code .= "        \$this->scopeChildren = ".$this->dumpValue($this->container->getScopeChildren()).";\n";
+            $code .= '        $this->scopes = '.$this->dumpValue($scopes).";\n";
+            $code .= '        $this->scopeChildren = '.$this->dumpValue($this->container->getScopeChildren()).";\n";
         } else {
             $code .= "        \$this->scopes = array();\n";
             $code .= "        \$this->scopeChildren = array();\n";
@@ -828,7 +862,7 @@ EOF;
     }
 
     /**
-     * Adds the methodMap property definition
+     * Adds the methodMap property definition.
      *
      * @return string
      */
@@ -848,7 +882,7 @@ EOF;
     }
 
     /**
-     * Adds the aliases property definition
+     * Adds the aliases property definition.
      *
      * @return string
      */
@@ -958,9 +992,9 @@ EOF;
     /**
      * Exports parameters.
      *
-     * @param array   $parameters
-     * @param string  $path
-     * @param int     $indent
+     * @param array  $parameters
+     * @param string $path
+     * @param int    $indent
      *
      * @return string
      *
@@ -979,7 +1013,7 @@ EOF;
             } elseif ($value instanceof Reference) {
                 throw new InvalidArgumentException(sprintf('You cannot dump a container with parameters that contain references to other services (reference to service "%s" found in "%s").', $value, $path.'/'.$key));
             } else {
-                $value = var_export($value, true);
+                $value = $this->export($value);
             }
 
             $php[] = sprintf('%s%s => %s,', str_repeat(' ', $indent), var_export($key, true), $value);
@@ -1029,9 +1063,9 @@ EOF;
     /**
      * Builds service calls from arguments.
      *
-     * @param array  $arguments
-     * @param array  &$calls    By reference
-     * @param array  &$behavior By reference
+     * @param array $arguments
+     * @param array &$calls    By reference
+     * @param array &$behavior By reference
      */
     private function getServiceCallsFromArguments(array $arguments, array &$calls, array &$behavior)
     {
@@ -1050,7 +1084,7 @@ EOF;
                     $behavior[$id] = $argument->getInvalidBehavior();
                 }
 
-                $calls[$id] += 1;
+                ++$calls[$id];
             }
         }
     }
@@ -1107,14 +1141,14 @@ EOF;
     /**
      * Checks if a service id has a reference.
      *
-     * @param string  $id
-     * @param array   $arguments
-     * @param bool    $deep
-     * @param array   $visited
+     * @param string $id
+     * @param array  $arguments
+     * @param bool   $deep
+     * @param array  $visited
      *
      * @return bool
      */
-    private function hasReference($id, array $arguments, $deep = false, $visited = array())
+    private function hasReference($id, array $arguments, $deep = false, &$visited = array())
     {
         foreach ($arguments as $argument) {
             if (is_array($argument)) {
@@ -1145,8 +1179,8 @@ EOF;
     /**
      * Dumps values.
      *
-     * @param array   $value
-     * @param bool    $interpolate
+     * @param array $value
+     * @param bool  $interpolate
      *
      * @return string
      *
@@ -1176,23 +1210,29 @@ EOF;
             foreach ($value->getArguments() as $argument) {
                 $arguments[] = $this->dumpValue($argument);
             }
-            $class = $this->dumpValue($value->getClass());
-
-            if (false !== strpos($class, '$')) {
-                throw new RuntimeException('Cannot dump definitions which have a variable class name.');
-            }
 
             if (null !== $value->getFactoryMethod()) {
                 if (null !== $value->getFactoryClass()) {
                     return sprintf("call_user_func(array(%s, '%s')%s)", $this->dumpValue($value->getFactoryClass()), $value->getFactoryMethod(), count($arguments) > 0 ? ', '.implode(', ', $arguments) : '');
                 } elseif (null !== $value->getFactoryService()) {
-                    return sprintf("%s->%s(%s)", $this->getServiceCall($value->getFactoryService()), $value->getFactoryMethod(), implode(', ', $arguments));
+                    $service = $this->dumpValue($value->getFactoryService());
+
+                    return sprintf('%s->%s(%s)', 0 === strpos($service, '$') ? sprintf('$this->get(%s)', $service) : $this->getServiceCall($value->getFactoryService()), $value->getFactoryMethod(), implode(', ', $arguments));
                 } else {
                     throw new RuntimeException('Cannot dump definitions which have factory method without factory service or factory class.');
                 }
             }
 
-            return sprintf("new \\%s(%s)", substr(str_replace('\\\\', '\\', $class), 1, -1), implode(', ', $arguments));
+            $class = $value->getClass();
+            if (null === $class) {
+                throw new RuntimeException('Cannot dump definitions which have no class nor factory.');
+            }
+            $class = $this->dumpValue($class);
+            if (false !== strpos($class, '$')) {
+                throw new RuntimeException('Cannot dump definitions which have a variable class name.');
+            }
+
+            return sprintf('new \\%s(%s)', substr(str_replace('\\\\', '\\', $class), 1, -1), implode(', ', $arguments));
         } elseif ($value instanceof Variable) {
             return '$'.$value;
         } elseif ($value instanceof Reference) {
@@ -1214,19 +1254,19 @@ EOF;
                     return "'.".$that->dumpParameter(strtolower($match[2])).".'";
                 };
 
-                $code = str_replace('%%', '%', preg_replace_callback('/(?<!%)(%)([^%]+)\1/', $replaceParameters, var_export($value, true)));
+                $code = str_replace('%%', '%', preg_replace_callback('/(?<!%)(%)([^%]+)\1/', $replaceParameters, $this->export($value)));
 
                 return $code;
             }
         } elseif (is_object($value) || is_resource($value)) {
             throw new RuntimeException('Unable to dump a service container if a parameter is an object or a resource.');
         } else {
-            return var_export($value, true);
+            return $this->export($value);
         }
     }
 
     /**
-     * Dumps a parameter
+     * Dumps a parameter.
      *
      * @param string $name
      *
@@ -1242,7 +1282,7 @@ EOF;
     }
 
     /**
-     * Gets a service call
+     * Gets a service call.
      *
      * @param string    $id
      * @param Reference $reference
@@ -1287,7 +1327,7 @@ EOF;
     }
 
     /**
-     * Returns the next name to use
+     * Returns the next name to use.
      *
      * @return string
      */
@@ -1303,17 +1343,17 @@ EOF;
             $i = $this->variableCount;
 
             if ('' === $name) {
-                $name .= $firstChars[$i%$firstCharsLength];
-                $i = intval($i/$firstCharsLength);
+                $name .= $firstChars[$i % $firstCharsLength];
+                $i = (int) ($i / $firstCharsLength);
             }
 
             while ($i > 0) {
-                $i -= 1;
-                $name .= $nonFirstChars[$i%$nonFirstCharsLength];
-                $i = intval($i/$nonFirstCharsLength);
+                --$i;
+                $name .= $nonFirstChars[$i % $nonFirstCharsLength];
+                $i = (int) ($i / $nonFirstCharsLength);
             }
 
-            $this->variableCount += 1;
+            ++$this->variableCount;
 
             // check that the name is not reserved
             if (in_array($name, $this->reservedVariables, true)) {
@@ -1323,4 +1363,37 @@ EOF;
             return $name;
         }
     }
+
+    private function exportTargetDirs()
+    {
+        return null === $this->targetDirRegex ? '' : <<<EOF
+
+        \$dir = __DIR__;
+        for (\$i = 1; \$i <= {$this->targetDirMaxMatches}; ++\$i) {
+            \$this->targetDirs[\$i] = \$dir = dirname(\$dir);
+        }
+EOF;
+    }
+
+    private function export($value)
+    {
+        if (null !== $this->targetDirRegex && is_string($value) && preg_match($this->targetDirRegex, $value, $matches, PREG_OFFSET_CAPTURE)) {
+            $prefix = $matches[0][1] ? var_export(substr($value, 0, $matches[0][1]), true).'.' : '';
+            $suffix = $matches[0][1] + strlen($matches[0][0]);
+            $suffix = isset($value[$suffix]) ? '.'.var_export(substr($value, $suffix), true) : '';
+            $dirname = '__DIR__';
+
+            if (0 < $offset = 1 + $this->targetDirMaxMatches - count($matches)) {
+                $dirname = sprintf('$this->targetDirs[%d]', $offset);
+            }
+
+            if ($prefix || $suffix) {
+                return sprintf('(%s%s%s)', $prefix, $dirname, $suffix);
+            }
+
+            return $dirname;
+        }
+
+        return var_export($value, true);
+    }
 }
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php
@@ -23,8 +23,6 @@ use Symfony\Component\DependencyInjection\Exception\RuntimeException;
  *
  * @author Fabien Potencier <fabien@symfony.com>
  * @author Martin Hasoň <martin.hason@gmail.com>
- *
- * @api
  */
 class XmlDumper extends Dumper
 {
@@ -39,8 +37,6 @@ class XmlDumper extends Dumper
      * @param array $options An array of options
      *
      * @return string An xml string representing of the service container
-     *
-     * @api
      */
     public function dump(array $options = array())
     {
@@ -113,8 +109,12 @@ class XmlDumper extends Dumper
         if (null !== $id) {
             $service->setAttribute('id', $id);
         }
-        if ($definition->getClass()) {
-            $service->setAttribute('class', $definition->getClass());
+        if ($class = $definition->getClass()) {
+            if ('\\' === substr($class, 0, 1)) {
+                $class = substr($class, 1);
+            }
+
+            $service->setAttribute('class', $class);
         }
         if ($definition->getFactoryMethod()) {
             $service->setAttribute('factory-method', $definition->getFactoryMethod());
@@ -274,7 +274,7 @@ class XmlDumper extends Dumper
     }
 
     /**
-     * Escapes arguments
+     * Escapes arguments.
      *
      * @param array $arguments
      *
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php
@@ -18,49 +18,38 @@ use Symfony\Component\DependencyInjection\Definition;
 use Symfony\Component\DependencyInjection\Parameter;
 use Symfony\Component\DependencyInjection\Reference;
 use Symfony\Component\DependencyInjection\Exception\RuntimeException;
-use Symfony\Component\DependencyInjection\ContainerBuilder;
 
 /**
  * YamlDumper dumps a service container as a YAML string.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class YamlDumper extends Dumper
 {
     private $dumper;
 
     /**
-     * Constructor.
-     *
-     * @param ContainerBuilder $container The service container to dump
-     *
-     * @api
-     */
-    public function __construct(ContainerBuilder $container)
-    {
-        parent::__construct($container);
-
-        $this->dumper = new YmlDumper();
-    }
-
-    /**
      * Dumps the service container as an YAML string.
      *
      * @param array $options An array of options
      *
      * @return string A YAML string representing of the service container
-     *
-     * @api
      */
     public function dump(array $options = array())
     {
+        if (!class_exists('Symfony\Component\Yaml\Dumper')) {
+            throw new RuntimeException('Unable to dump the container as the Symfony Yaml Component is not installed.');
+        }
+
+        if (null === $this->dumper) {
+            $this->dumper = new YmlDumper();
+        }
+
         return $this->addParameters()."\n".$this->addServices();
     }
 
     /**
-     * Adds a service
+     * Adds a service.
      *
      * @param string     $id
      * @param Definition $definition
@@ -70,8 +59,12 @@ class YamlDumper extends Dumper
     private function addService($id, $definition)
     {
         $code = "    $id:\n";
-        if ($definition->getClass()) {
-            $code .= sprintf("        class: %s\n", $definition->getClass());
+        if ($class = $definition->getClass()) {
+            if ('\\' === substr($class, 0, 1)) {
+                $class = substr($class, 1);
+            }
+
+            $code .= sprintf("        class: %s\n", $class);
         }
 
         if (!$definition->isPublic()) {
@@ -85,7 +78,7 @@ class YamlDumper extends Dumper
                 foreach ($attributes as $key => $value) {
                     $att[] = sprintf('%s: %s', $this->dumper->dump($key), $this->dumper->dump($value));
                 }
-                $att = $att ? ', '.implode(' ', $att) : '';
+                $att = $att ? ', '.implode(', ', $att) : '';
 
                 $tagsCode .= sprintf("            - { name: %s%s }\n", $this->dumper->dump($name), $att);
             }
@@ -154,7 +147,7 @@ class YamlDumper extends Dumper
     }
 
     /**
-     * Adds a service alias
+     * Adds a service alias.
      *
      * @param string $alias
      * @param Alias  $id
@@ -164,14 +157,14 @@ class YamlDumper extends Dumper
     private function addServiceAlias($alias, $id)
     {
         if ($id->isPublic()) {
-            return sprintf("    %s: @%s\n", $alias, $id);
-        } else {
-            return sprintf("    %s:\n        alias: %s\n        public: false", $alias, $id);
+            return sprintf("    %s: '@%s'\n", $alias, $id);
         }
+
+        return sprintf("    %s:\n        alias: %s\n        public: false", $alias, $id);
     }
 
     /**
-     * Adds services
+     * Adds services.
      *
      * @return string
      */
@@ -198,7 +191,7 @@ class YamlDumper extends Dumper
     }
 
     /**
-     * Adds parameters
+     * Adds parameters.
      *
      * @return string
      */
@@ -214,7 +207,7 @@ class YamlDumper extends Dumper
     }
 
     /**
-     * Dumps the value to YAML format
+     * Dumps the value to YAML format.
      *
      * @param mixed $value
      *
@@ -274,8 +267,8 @@ class YamlDumper extends Dumper
     /**
      * Prepares parameters.
      *
-     * @param array   $parameters
-     * @param bool    $escape
+     * @param array $parameters
+     * @param bool  $escape
      *
      * @return array
      */
@@ -296,7 +289,7 @@ class YamlDumper extends Dumper
     }
 
     /**
-     * Escapes arguments
+     * Escapes arguments.
      *
      * @param array $arguments
      *
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Extension/ConfigurationExtensionInterface.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Extension/ConfigurationExtensionInterface.php
@@ -22,7 +22,7 @@ use Symfony\Component\Config\Definition\ConfigurationInterface;
 interface ConfigurationExtensionInterface
 {
     /**
-     * Returns extension configuration
+     * Returns extension configuration.
      *
      * @param array            $config    An array of configuration values
      * @param ContainerBuilder $container A ContainerBuilder instance
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Extension/Extension.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Extension/Extension.php
@@ -109,7 +109,7 @@ abstract class Extension implements ExtensionInterface, ConfigurationExtensionIn
      * @param ContainerBuilder $container
      * @param array            $config
      *
-     * @return bool    Whether the configuration is enabled
+     * @return bool Whether the configuration is enabled
      *
      * @throws InvalidArgumentException When the config is not enableable
      */
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Extension/ExtensionInterface.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Extension/ExtensionInterface.php
@@ -17,8 +17,6 @@ use Symfony\Component\DependencyInjection\ContainerBuilder;
  * ExtensionInterface is the interface implemented by container extension classes.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 interface ExtensionInterface
 {
@@ -29,8 +27,6 @@ interface ExtensionInterface
      * @param ContainerBuilder $container A ContainerBuilder instance
      *
      * @throws \InvalidArgumentException When provided tag is not defined in this extension
-     *
-     * @api
      */
     public function load(array $config, ContainerBuilder $container);
 
@@ -38,8 +34,6 @@ interface ExtensionInterface
      * Returns the namespace to be used for this extension (XML namespace).
      *
      * @return string The XML namespace
-     *
-     * @api
      */
     public function getNamespace();
 
@@ -47,8 +41,6 @@ interface ExtensionInterface
      * Returns the base path for the XSD files.
      *
      * @return string The XSD base path
-     *
-     * @api
      */
     public function getXsdValidationBasePath();
 
@@ -58,8 +50,6 @@ interface ExtensionInterface
      * This alias is also the mandatory prefix to use when using YAML.
      *
      * @return string The alias
-     *
-     * @api
      */
     public function getAlias();
 }
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/IntrospectableContainerInterface.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/IntrospectableContainerInterface.php
@@ -16,7 +16,6 @@ namespace Symfony\Component\DependencyInjection;
  * for containers, allowing logic to be implemented based on a Container's state.
  *
  * @author Evan Villemez <evillemez@gmail.com>
- *
  */
 interface IntrospectableContainerInterface extends ContainerInterface
 {
@@ -25,8 +24,7 @@ interface IntrospectableContainerInterface extends ContainerInterface
      *
      * @param string $id
      *
-     * @return bool    true if the service has been initialized, false otherwise
-     *
+     * @return bool true if the service has been initialized, false otherwise
      */
     public function initialized($id);
 }
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/LICENSE
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2014 Fabien Potencier
+Copyright (c) 2004-2015 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
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/ClosureLoader.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/ClosureLoader.php
@@ -36,23 +36,15 @@ class ClosureLoader extends Loader
     }
 
     /**
-     * Loads a Closure.
-     *
-     * @param \Closure $closure The resource
-     * @param string   $type    The resource type
+     * {@inheritdoc}
      */
-    public function load($closure, $type = null)
+    public function load($resource, $type = null)
     {
-        call_user_func($closure, $this->container);
+        call_user_func($resource, $this->container);
     }
 
     /**
-     * Returns true if this class supports the given resource.
-     *
-     * @param mixed  $resource A resource
-     * @param string $type     The resource type
-     *
-     * @return bool    true if this class supports the given resource, false otherwise
+     * {@inheritdoc}
      */
     public function supports($resource, $type = null)
     {
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/FileLoader.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/FileLoader.php
@@ -27,8 +27,8 @@ abstract class FileLoader extends BaseFileLoader
     /**
      * Constructor.
      *
-     * @param ContainerBuilder $container A ContainerBuilder instance
-     * @param FileLocatorInterface      $locator   A FileLocator instance
+     * @param ContainerBuilder     $container A ContainerBuilder instance
+     * @param FileLocatorInterface $locator   A FileLocator instance
      */
     public function __construct(ContainerBuilder $container, FileLocatorInterface $locator)
     {
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/IniFileLoader.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/IniFileLoader.php
@@ -22,22 +22,17 @@ use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
 class IniFileLoader extends FileLoader
 {
     /**
-     * Loads a resource.
-     *
-     * @param mixed  $file The resource
-     * @param string $type The resource type
-     *
-     * @throws InvalidArgumentException When ini file is not valid
+     * {@inheritdoc}
      */
-    public function load($file, $type = null)
+    public function load($resource, $type = null)
     {
-        $path = $this->locator->locate($file);
+        $path = $this->locator->locate($resource);
 
         $this->container->addResource(new FileResource($path));
 
         $result = parse_ini_file($path, true);
         if (false === $result || array() === $result) {
-            throw new InvalidArgumentException(sprintf('The "%s" file is not valid.', $file));
+            throw new InvalidArgumentException(sprintf('The "%s" file is not valid.', $resource));
         }
 
         if (isset($result['parameters']) && is_array($result['parameters'])) {
@@ -48,12 +43,7 @@ class IniFileLoader extends FileLoader
     }
 
     /**
-     * Returns true if this class supports the given resource.
-     *
-     * @param mixed  $resource A resource
-     * @param string $type     The resource type
-     *
-     * @return bool    true if this class supports the given resource, false otherwise
+     * {@inheritdoc}
      */
     public function supports($resource, $type = null)
     {
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/PhpFileLoader.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/PhpFileLoader.php
@@ -24,18 +24,15 @@ use Symfony\Component\Config\Resource\FileResource;
 class PhpFileLoader extends FileLoader
 {
     /**
-     * Loads a PHP file.
-     *
-     * @param mixed  $file The resource
-     * @param string $type The resource type
+     * {@inheritdoc}
      */
-    public function load($file, $type = null)
+    public function load($resource, $type = null)
     {
         // the container and loader variables are exposed to the included file below
         $container = $this->container;
         $loader = $this;
 
-        $path = $this->locator->locate($file);
+        $path = $this->locator->locate($resource);
         $this->setCurrentDir(dirname($path));
         $this->container->addResource(new FileResource($path));
 
@@ -43,12 +40,7 @@ class PhpFileLoader extends FileLoader
     }
 
     /**
-     * Returns true if this class supports the given resource.
-     *
-     * @param mixed  $resource A resource
-     * @param string $type     The resource type
-     *
-     * @return bool    true if this class supports the given resource, false otherwise
+     * {@inheritdoc}
      */
     public function supports($resource, $type = null)
     {
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php
@@ -30,14 +30,11 @@ use Symfony\Component\DependencyInjection\Exception\RuntimeException;
 class XmlFileLoader extends FileLoader
 {
     /**
-     * Loads an XML file.
-     *
-     * @param mixed  $file The resource
-     * @param string $type The resource type
+     * {@inheritdoc}
      */
-    public function load($file, $type = null)
+    public function load($resource, $type = null)
     {
-        $path = $this->locator->locate($file);
+        $path = $this->locator->locate($resource);
 
         $xml = $this->parseFile($path);
         $xml->registerXPathNamespace('container', 'http://symfony.com/schema/dic/services');
@@ -51,7 +48,7 @@ class XmlFileLoader extends FileLoader
         $this->parseImports($xml, $path);
 
         // parameters
-        $this->parseParameters($xml, $path);
+        $this->parseParameters($xml);
 
         // extensions
         $this->loadFromExtensions($xml);
@@ -61,12 +58,7 @@ class XmlFileLoader extends FileLoader
     }
 
     /**
-     * Returns true if this class supports the given resource.
-     *
-     * @param mixed  $resource A resource
-     * @param string $type     The resource type
-     *
-     * @return bool    true if this class supports the given resource, false otherwise
+     * {@inheritdoc}
      */
     public function supports($resource, $type = null)
     {
@@ -74,12 +66,11 @@ class XmlFileLoader extends FileLoader
     }
 
     /**
-     * Parses parameters
+     * Parses parameters.
      *
      * @param SimpleXMLElement $xml
-     * @param string           $file
      */
-    private function parseParameters(SimpleXMLElement $xml, $file)
+    private function parseParameters(SimpleXMLElement $xml)
     {
         if (!$xml->parameters) {
             return;
@@ -89,7 +80,7 @@ class XmlFileLoader extends FileLoader
     }
 
     /**
-     * Parses imports
+     * Parses imports.
      *
      * @param SimpleXMLElement $xml
      * @param string           $file
@@ -107,7 +98,7 @@ class XmlFileLoader extends FileLoader
     }
 
     /**
-     * Parses multiple definitions
+     * Parses multiple definitions.
      *
      * @param SimpleXMLElement $xml
      * @param string           $file
@@ -124,7 +115,7 @@ class XmlFileLoader extends FileLoader
     }
 
     /**
-     * Parses an individual Definition
+     * Parses an individual Definition.
      *
      * @param string           $id
      * @param SimpleXMLElement $service
@@ -223,7 +214,7 @@ class XmlFileLoader extends FileLoader
     }
 
     /**
-     * Processes anonymous services
+     * Processes anonymous services.
      *
      * @param SimpleXMLElement $xml
      * @param string           $file
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php
@@ -17,7 +17,9 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\DependencyInjection\Definition;
 use Symfony\Component\DependencyInjection\Reference;
 use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
 use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Yaml\Exception\ParseException;
 use Symfony\Component\Yaml\Parser as YamlParser;
 
 /**
@@ -32,14 +34,11 @@ class YamlFileLoader extends FileLoader
     private $yamlParser;
 
     /**
-     * Loads a Yaml file.
-     *
-     * @param mixed  $file The resource
-     * @param string $type The resource type
+     * {@inheritdoc}
      */
-    public function load($file, $type = null)
+    public function load($resource, $type = null)
     {
-        $path = $this->locator->locate($file);
+        $path = $this->locator->locate($resource);
 
         $content = $this->loadFile($path);
 
@@ -56,7 +55,7 @@ class YamlFileLoader extends FileLoader
         // parameters
         if (isset($content['parameters'])) {
             if (!is_array($content['parameters'])) {
-                throw new InvalidArgumentException(sprintf('The "parameters" key should contain an array in %s. Check your YAML syntax.', $file));
+                throw new InvalidArgumentException(sprintf('The "parameters" key should contain an array in %s. Check your YAML syntax.', $resource));
             }
 
             foreach ($content['parameters'] as $key => $value) {
@@ -68,24 +67,19 @@ class YamlFileLoader extends FileLoader
         $this->loadFromExtensions($content);
 
         // services
-        $this->parseDefinitions($content, $file);
+        $this->parseDefinitions($content, $resource);
     }
 
     /**
-     * Returns true if this class supports the given resource.
-     *
-     * @param mixed  $resource A resource
-     * @param string $type     The resource type
-     *
-     * @return bool    true if this class supports the given resource, false otherwise
+     * {@inheritdoc}
      */
     public function supports($resource, $type = null)
     {
-        return is_string($resource) && 'yml' === pathinfo($resource, PATHINFO_EXTENSION);
+        return is_string($resource) && in_array(pathinfo($resource, PATHINFO_EXTENSION), array('yml', 'yaml'), true);
     }
 
     /**
-     * Parses all imports
+     * Parses all imports.
      *
      * @param array  $content
      * @param string $file
@@ -111,7 +105,7 @@ class YamlFileLoader extends FileLoader
     }
 
     /**
-     * Parses definitions
+     * Parses definitions.
      *
      * @param array  $content
      * @param string $file
@@ -277,6 +271,10 @@ class YamlFileLoader extends FileLoader
      */
     protected function loadFile($file)
     {
+        if (!class_exists('Symfony\Component\Yaml\Parser')) {
+            throw new RuntimeException('Unable to load YAML config files as the Symfony Yaml Component is not installed.');
+        }
+
         if (!stream_is_local($file)) {
             throw new InvalidArgumentException(sprintf('This is not a local file "%s".', $file));
         }
@@ -289,7 +287,13 @@ class YamlFileLoader extends FileLoader
             $this->yamlParser = new YamlParser();
         }
 
-        return $this->validate($this->yamlParser->parse(file_get_contents($file)), $file);
+        try {
+            $configuration = $this->yamlParser->parse(file_get_contents($file));
+        } catch (ParseException $e) {
+            throw new InvalidArgumentException(sprintf('The file "%s" does not contain valid YAML.', $file), 0, $e);
+        }
+
+        return $this->validate($configuration, $file);
     }
 
     /**
@@ -312,7 +316,7 @@ class YamlFileLoader extends FileLoader
             throw new InvalidArgumentException(sprintf('The service file "%s" is not valid. It should contain an array. Check your YAML syntax.', $file));
         }
 
-        foreach (array_keys($content) as $namespace) {
+        foreach ($content as $namespace => $data) {
             if (in_array($namespace, array('imports', 'parameters', 'services'))) {
                 continue;
             }
@@ -371,7 +375,7 @@ class YamlFileLoader extends FileLoader
     }
 
     /**
-     * Loads from Extensions
+     * Loads from Extensions.
      *
      * @param array $content
      */
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Parameter.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Parameter.php
@@ -15,8 +15,6 @@ namespace Symfony\Component\DependencyInjection;
  * Parameter represents a parameter reference.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class Parameter
 {
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ParameterBag/FrozenParameterBag.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ParameterBag/FrozenParameterBag.php
@@ -17,8 +17,6 @@ use Symfony\Component\DependencyInjection\Exception\LogicException;
  * Holds read-only parameters.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class FrozenParameterBag extends ParameterBag
 {
@@ -31,8 +29,6 @@ class FrozenParameterBag extends ParameterBag
      * This is always the case when used internally.
      *
      * @param array $parameters An array of parameters
-     *
-     * @api
      */
     public function __construct(array $parameters = array())
     {
@@ -42,8 +38,6 @@ class FrozenParameterBag extends ParameterBag
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function clear()
     {
@@ -52,8 +46,6 @@ class FrozenParameterBag extends ParameterBag
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function add(array $parameters)
     {
@@ -62,11 +54,17 @@ class FrozenParameterBag extends ParameterBag
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function set($name, $value)
     {
         throw new LogicException('Impossible to call set() on a frozen ParameterBag.');
     }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function remove($name)
+    {
+        throw new LogicException('Impossible to call remove() on a frozen ParameterBag.');
+    }
 }
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ParameterBag/ParameterBag.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ParameterBag/ParameterBag.php
@@ -19,8 +19,6 @@ use Symfony\Component\DependencyInjection\Exception\RuntimeException;
  * Holds parameters.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class ParameterBag implements ParameterBagInterface
 {
@@ -31,8 +29,6 @@ class ParameterBag implements ParameterBagInterface
      * Constructor.
      *
      * @param array $parameters An array of parameters
-     *
-     * @api
      */
     public function __construct(array $parameters = array())
     {
@@ -43,8 +39,6 @@ class ParameterBag implements ParameterBagInterface
 
     /**
      * Clears all parameters.
-     *
-     * @api
      */
     public function clear()
     {
@@ -55,8 +49,6 @@ class ParameterBag implements ParameterBagInterface
      * Adds parameters to the service container parameters.
      *
      * @param array $parameters An array of parameters
-     *
-     * @api
      */
     public function add(array $parameters)
     {
@@ -69,8 +61,6 @@ class ParameterBag implements ParameterBagInterface
      * Gets the service container parameters.
      *
      * @return array An array of parameters
-     *
-     * @api
      */
     public function all()
     {
@@ -82,11 +72,9 @@ class ParameterBag implements ParameterBagInterface
      *
      * @param string $name The parameter name
      *
-     * @return mixed  The parameter value
+     * @return mixed The parameter value
      *
      * @throws ParameterNotFoundException if the parameter is not defined
-     *
-     * @api
      */
     public function get($name)
     {
@@ -98,7 +86,7 @@ class ParameterBag implements ParameterBagInterface
             }
 
             $alternatives = array();
-            foreach (array_keys($this->parameters) as $key) {
+            foreach ($this->parameters as $key => $parameterValue) {
                 $lev = levenshtein($name, $key);
                 if ($lev <= strlen($name) / 3 || false !== strpos($key, $name)) {
                     $alternatives[] = $key;
@@ -116,8 +104,6 @@ class ParameterBag implements ParameterBagInterface
      *
      * @param string $name  The parameter name
      * @param mixed  $value The parameter value
-     *
-     * @api
      */
     public function set($name, $value)
     {
@@ -129,9 +115,7 @@ class ParameterBag implements ParameterBagInterface
      *
      * @param string $name The parameter name
      *
-     * @return bool    true if the parameter name is defined, false otherwise
-     *
-     * @api
+     * @return bool true if the parameter name is defined, false otherwise
      */
     public function has($name)
     {
@@ -142,8 +126,6 @@ class ParameterBag implements ParameterBagInterface
      * Removes a parameter.
      *
      * @param string $name The parameter name
-     *
-     * @api
      */
     public function remove($name)
     {
@@ -183,9 +165,9 @@ class ParameterBag implements ParameterBagInterface
      *
      * @return mixed The resolved value
      *
-     * @throws ParameterNotFoundException if a placeholder references a parameter that does not exist
+     * @throws ParameterNotFoundException          if a placeholder references a parameter that does not exist
      * @throws ParameterCircularReferenceException if a circular reference if detected
-     * @throws RuntimeException when a given parameter has a type problem.
+     * @throws RuntimeException                    when a given parameter has a type problem.
      */
     public function resolveValue($value, array $resolving = array())
     {
@@ -206,16 +188,16 @@ class ParameterBag implements ParameterBagInterface
     }
 
     /**
-     * Resolves parameters inside a string
+     * Resolves parameters inside a string.
      *
      * @param string $value     The string to resolve
      * @param array  $resolving An array of keys that are being resolved (used internally to detect circular references)
      *
      * @return string The resolved string
      *
-     * @throws ParameterNotFoundException if a placeholder references a parameter that does not exist
+     * @throws ParameterNotFoundException          if a placeholder references a parameter that does not exist
      * @throws ParameterCircularReferenceException if a circular reference if detected
-     * @throws RuntimeException when a given parameter has a type problem.
+     * @throws RuntimeException                    when a given parameter has a type problem.
      */
     public function resolveString($value, array $resolving = array())
     {
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ParameterBag/ParameterBagInterface.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ParameterBag/ParameterBagInterface.php
@@ -11,21 +11,20 @@
 
 namespace Symfony\Component\DependencyInjection\ParameterBag;
 
+use Symfony\Component\DependencyInjection\Exception\LogicException;
 use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
 
 /**
  * ParameterBagInterface.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 interface ParameterBagInterface
 {
     /**
      * Clears all parameters.
      *
-     * @api
+     * @throws LogicException if the ParameterBagInterface can not be cleared
      */
     public function clear();
 
@@ -34,7 +33,7 @@ interface ParameterBagInterface
      *
      * @param array $parameters An array of parameters
      *
-     * @api
+     * @throws LogicException if the parameter can not be added
      */
     public function add(array $parameters);
 
@@ -42,8 +41,6 @@ interface ParameterBagInterface
      * Gets the service container parameters.
      *
      * @return array An array of parameters
-     *
-     * @api
      */
     public function all();
 
@@ -52,11 +49,9 @@ interface ParameterBagInterface
      *
      * @param string $name The parameter name
      *
-     * @return mixed  The parameter value
+     * @return mixed The parameter value
      *
      * @throws ParameterNotFoundException if the parameter is not defined
-     *
-     * @api
      */
     public function get($name);
 
@@ -66,7 +61,7 @@ interface ParameterBagInterface
      * @param string $name  The parameter name
      * @param mixed  $value The parameter value
      *
-     * @api
+     * @throws LogicException if the parameter can not be set
      */
     public function set($name, $value);
 
@@ -75,9 +70,7 @@ interface ParameterBagInterface
      *
      * @param string $name The parameter name
      *
-     * @return bool    true if the parameter name is defined, false otherwise
-     *
-     * @api
+     * @return bool true if the parameter name is defined, false otherwise
      */
     public function has($name);
 
@@ -96,7 +89,7 @@ interface ParameterBagInterface
     public function resolveValue($value);
 
     /**
-     * Escape parameter placeholders %
+     * Escape parameter placeholders %.
      *
      * @param mixed $value
      *
@@ -105,7 +98,7 @@ interface ParameterBagInterface
     public function escapeValue($value);
 
     /**
-     * Unescape parameter placeholders %
+     * Unescape parameter placeholders %.
      *
      * @param mixed $value
      *
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Reference.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Reference.php
@@ -15,8 +15,6 @@ namespace Symfony\Component\DependencyInjection;
  * Reference represents a service reference.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class Reference
 {
@@ -27,9 +25,9 @@ class Reference
     /**
      * Constructor.
      *
-     * @param string  $id              The service identifier
-     * @param int     $invalidBehavior The behavior when the service does not exist
-     * @param bool    $strict          Sets how this reference is validated
+     * @param string $id              The service identifier
+     * @param int    $invalidBehavior The behavior when the service does not exist
+     * @param bool   $strict          Sets how this reference is validated
      *
      * @see Container
      */
@@ -61,7 +59,7 @@ class Reference
     }
 
     /**
-     * Returns true when this Reference is strict
+     * Returns true when this Reference is strict.
      *
      * @return bool
      */
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Scope.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Scope.php
@@ -15,34 +15,23 @@ namespace Symfony\Component\DependencyInjection;
  * Scope class.
  *
  * @author Johannes M. Schmitt <schmittjoh@gmail.com>
- *
- * @api
  */
 class Scope implements ScopeInterface
 {
     private $name;
     private $parentName;
 
-    /**
-     * @api
-     */
     public function __construct($name, $parentName = ContainerInterface::SCOPE_CONTAINER)
     {
         $this->name = $name;
         $this->parentName = $parentName;
     }
 
-    /**
-     * @api
-     */
     public function getName()
     {
         return $this->name;
     }
 
-    /**
-     * @api
-     */
     public function getParentName()
     {
         return $this->parentName;
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ScopeInterface.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/ScopeInterface.php
@@ -15,18 +15,10 @@ namespace Symfony\Component\DependencyInjection;
  * Scope Interface.
  *
  * @author Johannes M. Schmitt <schmittjoh@gmail.com>
- *
- * @api
  */
 interface ScopeInterface
 {
-    /**
-     * @api
-     */
     public function getName();
 
-    /**
-     * @api
-     */
     public function getParentName();
 }
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/SimpleXMLElement.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/SimpleXMLElement.php
@@ -35,8 +35,8 @@ class SimpleXMLElement extends \SimpleXMLElement
     /**
      * Returns arguments as valid PHP types.
      *
-     * @param string  $name
-     * @param bool    $lowercase
+     * @param string $name
+     * @param bool   $lowercase
      *
      * @return mixed
      */
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/TaggedContainerInterface.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/TaggedContainerInterface.php
@@ -15,8 +15,6 @@ namespace Symfony\Component\DependencyInjection;
  * TaggedContainerInterface is the interface implemented when a container knows how to deals with tags.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 interface TaggedContainerInterface extends ContainerInterface
 {
@@ -26,8 +24,6 @@ interface TaggedContainerInterface extends ContainerInterface
      * @param string $name The tag name
      *
      * @return array An array of tags
-     *
-     * @api
      */
     public function findTaggedServiceIds($name);
 }
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Variable.php
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Variable.php
@@ -29,7 +29,7 @@ class Variable
     private $name;
 
     /**
-     * Constructor
+     * Constructor.
      *
      * @param string $name
      */
@@ -39,7 +39,7 @@ class Variable
     }
 
     /**
-     * Converts the object to a string
+     * Converts the object to a string.
      *
      * @return string
      */
--- a/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/composer.json
+++ b/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/composer.json
@@ -3,7 +3,7 @@
     "type": "library",
     "description": "Symfony DependencyInjection Component",
     "keywords": [],
-    "homepage": "http://symfony.com",
+    "homepage": "https://symfony.com",
     "license": "MIT",
     "authors": [
         {
@@ -12,14 +12,14 @@
         },
         {
             "name": "Symfony Community",
-            "homepage": "http://symfony.com/contributors"
+            "homepage": "https://symfony.com/contributors"
         }
     ],
     "require": {
         "php": ">=5.3.3"
     },
     "require-dev": {
-        "symfony/yaml": "~2.0",
+        "symfony/yaml": "~2.1",
         "symfony/config": "~2.2"
     },
     "suggest": {
@@ -28,7 +28,10 @@
         "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them"
     },
     "autoload": {
-        "psr-0": { "Symfony\\Component\\DependencyInjection\\": "" }
+        "psr-0": { "Symfony\\Component\\DependencyInjection\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
     },
     "target-dir": "Symfony/Component/DependencyInjection",
     "minimum-stability": "dev",
--- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php
+++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php
@@ -15,7 +15,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Lazily loads listeners and subscribers from the dependency injection
- * container
+ * container.
  *
  * @author Fabien Potencier <fabien@symfony.com>
  * @author Bernhard Schussek <bschussek@gmail.com>
@@ -24,19 +24,22 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
 class ContainerAwareEventDispatcher extends EventDispatcher
 {
     /**
-     * The container from where services are loaded
+     * The container from where services are loaded.
+     *
      * @var ContainerInterface
      */
     private $container;
 
     /**
-     * The service IDs of the event listeners and subscribers
+     * The service IDs of the event listeners and subscribers.
+     *
      * @var array
      */
     private $listenerIds = array();
 
     /**
-     * The services registered as listeners
+     * The services registered as listeners.
+     *
      * @var array
      */
     private $listeners = array();
@@ -52,14 +55,14 @@ class ContainerAwareEventDispatcher extends EventDispatcher
     }
 
     /**
-     * Adds a service as event listener
+     * Adds a service as event listener.
      *
      * @param string $eventName Event for which the listener is added
      * @param array  $callback  The service ID of the listener service & the method
-     *                            name that has to be called
-     * @param int     $priority The higher this value, the earlier an event listener
-     *                            will be triggered in the chain.
-     *                            Defaults to 0.
+     *                          name that has to be called
+     * @param int    $priority  The higher this value, the earlier an event listener
+     *                          will be triggered in the chain.
+     *                          Defaults to 0.
      *
      * @throws \InvalidArgumentException
      */
@@ -100,7 +103,7 @@ class ContainerAwareEventDispatcher extends EventDispatcher
     }
 
     /**
-     * @see EventDispatcherInterface::hasListeners
+     * {@inheritdoc}
      */
     public function hasListeners($eventName = null)
     {
@@ -116,12 +119,12 @@ class ContainerAwareEventDispatcher extends EventDispatcher
     }
 
     /**
-     * @see EventDispatcherInterface::getListeners
+     * {@inheritdoc}
      */
     public function getListeners($eventName = null)
     {
         if (null === $eventName) {
-            foreach (array_keys($this->listenerIds) as $serviceEventName) {
+            foreach ($this->listenerIds as $serviceEventName => $args) {
                 $this->lazyLoad($serviceEventName);
             }
         } else {
@@ -132,7 +135,7 @@ class ContainerAwareEventDispatcher extends EventDispatcher
     }
 
     /**
-     * Adds a service as event subscriber
+     * Adds a service as event subscriber.
      *
      * @param string $serviceId The service ID of the subscriber service
      * @param string $class     The service's class name (which must implement EventSubscriberInterface)
@@ -152,21 +155,6 @@ class ContainerAwareEventDispatcher extends EventDispatcher
         }
     }
 
-    /**
-     * {@inheritdoc}
-     *
-     * Lazily loads listeners for this event from the dependency injection
-     * container.
-     *
-     * @throws \InvalidArgumentException if the service is not defined
-     */
-    public function dispatch($eventName, Event $event = null)
-    {
-        $this->lazyLoad($eventName);
-
-        return parent::dispatch($eventName, $event);
-    }
-
     public function getContainer()
     {
         return $this->container;
--- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Event.php
+++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Event.php
@@ -20,17 +20,15 @@ namespace Symfony\Component\EventDispatcher;
  * You can call the method stopPropagation() to abort the execution of
  * further listeners in your event listener.
  *
- * @author  Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author  Jonathan Wage <jonwage@gmail.com>
- * @author  Roman Borschel <roman@code-factory.org>
- * @author  Bernhard Schussek <bschussek@gmail.com>
- *
- * @api
+ * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
+ * @author Jonathan Wage <jonwage@gmail.com>
+ * @author Roman Borschel <roman@code-factory.org>
+ * @author Bernhard Schussek <bschussek@gmail.com>
  */
 class Event
 {
     /**
-     * @var bool    Whether no further event listeners should be triggered
+     * @var bool Whether no further event listeners should be triggered
      */
     private $propagationStopped = false;
 
@@ -47,10 +45,9 @@ class Event
     /**
      * Returns whether further event listeners should be triggered.
      *
-     * @see Event::stopPropagation
-     * @return bool    Whether propagation was already stopped for this event.
+     * @see Event::stopPropagation()
      *
-     * @api
+     * @return bool Whether propagation was already stopped for this event.
      */
     public function isPropagationStopped()
     {
@@ -63,8 +60,6 @@ class Event
      * If multiple event listeners are connected to the same event, no
      * further event listener will be triggered once any trigger calls
      * stopPropagation().
-     *
-     * @api
      */
     public function stopPropagation()
     {
@@ -72,11 +67,9 @@ class Event
     }
 
     /**
-     * Stores the EventDispatcher that dispatches this Event
+     * Stores the EventDispatcher that dispatches this Event.
      *
      * @param EventDispatcherInterface $dispatcher
-     *
-     * @api
      */
     public function setDispatcher(EventDispatcherInterface $dispatcher)
     {
@@ -84,11 +77,9 @@ class Event
     }
 
     /**
-     * Returns the EventDispatcher that dispatches this Event
+     * Returns the EventDispatcher that dispatches this Event.
      *
      * @return EventDispatcherInterface
-     *
-     * @api
      */
     public function getDispatcher()
     {
@@ -99,8 +90,6 @@ class Event
      * Gets the event's name.
      *
      * @return string
-     *
-     * @api
      */
     public function getName()
     {
@@ -111,8 +100,6 @@ class Event
      * Sets the event's name property.
      *
      * @param string $name The event name.
-     *
-     * @api
      */
     public function setName($name)
     {
--- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcher.php
+++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcher.php
@@ -17,15 +17,13 @@ namespace Symfony\Component\EventDispatcher;
  * Listeners are registered on the manager and events are dispatched through the
  * manager.
  *
- * @author  Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author  Jonathan Wage <jonwage@gmail.com>
- * @author  Roman Borschel <roman@code-factory.org>
- * @author  Bernhard Schussek <bschussek@gmail.com>
- * @author  Fabien Potencier <fabien@symfony.com>
- * @author  Jordi Boggiano <j.boggiano@seld.be>
- * @author  Jordan Alliot <jordan.alliot@gmail.com>
- *
- * @api
+ * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
+ * @author Jonathan Wage <jonwage@gmail.com>
+ * @author Roman Borschel <roman@code-factory.org>
+ * @author Bernhard Schussek <bschussek@gmail.com>
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @author Jordan Alliot <jordan.alliot@gmail.com>
  */
 class EventDispatcher implements EventDispatcherInterface
 {
@@ -33,9 +31,7 @@ class EventDispatcher implements EventDispatcherInterface
     private $sorted = array();
 
     /**
-     * @see EventDispatcherInterface::dispatch
-     *
-     * @api
+     * {@inheritdoc}
      */
     public function dispatch($eventName, Event $event = null)
     {
@@ -46,21 +42,23 @@ class EventDispatcher implements EventDispatcherInterface
         $event->setDispatcher($this);
         $event->setName($eventName);
 
-        if (!isset($this->listeners[$eventName])) {
-            return $event;
+        if ($listeners = $this->getListeners($eventName)) {
+            $this->doDispatch($listeners, $eventName, $event);
         }
 
-        $this->doDispatch($this->getListeners($eventName), $eventName, $event);
-
         return $event;
     }
 
     /**
-     * @see EventDispatcherInterface::getListeners
+     * {@inheritdoc}
      */
     public function getListeners($eventName = null)
     {
         if (null !== $eventName) {
+            if (!isset($this->listeners[$eventName])) {
+                return array();
+            }
+
             if (!isset($this->sorted[$eventName])) {
                 $this->sortListeners($eventName);
             }
@@ -68,7 +66,7 @@ class EventDispatcher implements EventDispatcherInterface
             return $this->sorted[$eventName];
         }
 
-        foreach (array_keys($this->listeners) as $eventName) {
+        foreach ($this->listeners as $eventName => $eventListeners) {
             if (!isset($this->sorted[$eventName])) {
                 $this->sortListeners($eventName);
             }
@@ -78,7 +76,7 @@ class EventDispatcher implements EventDispatcherInterface
     }
 
     /**
-     * @see EventDispatcherInterface::hasListeners
+     * {@inheritdoc}
      */
     public function hasListeners($eventName = null)
     {
@@ -86,9 +84,7 @@ class EventDispatcher implements EventDispatcherInterface
     }
 
     /**
-     * @see EventDispatcherInterface::addListener
-     *
-     * @api
+     * {@inheritdoc}
      */
     public function addListener($eventName, $listener, $priority = 0)
     {
@@ -97,7 +93,7 @@ class EventDispatcher implements EventDispatcherInterface
     }
 
     /**
-     * @see EventDispatcherInterface::removeListener
+     * {@inheritdoc}
      */
     public function removeListener($eventName, $listener)
     {
@@ -113,9 +109,7 @@ class EventDispatcher implements EventDispatcherInterface
     }
 
     /**
-     * @see EventDispatcherInterface::addSubscriber
-     *
-     * @api
+     * {@inheritdoc}
      */
     public function addSubscriber(EventSubscriberInterface $subscriber)
     {
@@ -133,7 +127,7 @@ class EventDispatcher implements EventDispatcherInterface
     }
 
     /**
-     * @see EventDispatcherInterface::removeSubscriber
+     * {@inheritdoc}
      */
     public function removeSubscriber(EventSubscriberInterface $subscriber)
     {
@@ -177,9 +171,7 @@ class EventDispatcher implements EventDispatcherInterface
     {
         $this->sorted[$eventName] = array();
 
-        if (isset($this->listeners[$eventName])) {
-            krsort($this->listeners[$eventName]);
-            $this->sorted[$eventName] = call_user_func_array('array_merge', $this->listeners[$eventName]);
-        }
+        krsort($this->listeners[$eventName]);
+        $this->sorted[$eventName] = call_user_func_array('array_merge', $this->listeners[$eventName]);
     }
 }
--- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcherInterface.php
+++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcherInterface.php
@@ -17,8 +17,6 @@ namespace Symfony\Component\EventDispatcher;
  * manager.
  *
  * @author Bernhard Schussek <bschussek@gmail.com>
- *
- * @api
  */
 interface EventDispatcherInterface
 {
@@ -28,12 +26,10 @@ interface EventDispatcherInterface
      * @param string $eventName The name of the event to dispatch. The name of
      *                          the event is the name of the method that is
      *                          invoked on listeners.
-     * @param Event $event The event to pass to the event handlers/listeners.
+     * @param Event  $event     The event to pass to the event handlers/listeners.
      *                          If not supplied, an empty Event instance is created.
      *
      * @return Event
-     *
-     * @api
      */
     public function dispatch($eventName, Event $event = null);
 
@@ -44,8 +40,6 @@ interface EventDispatcherInterface
      * @param callable $listener  The listener
      * @param int      $priority  The higher this value, the earlier an event
      *                            listener will be triggered in the chain (defaults to 0)
-     *
-     * @api
      */
     public function addListener($eventName, $listener, $priority = 0);
 
@@ -56,8 +50,6 @@ interface EventDispatcherInterface
      * interested in and added as a listener for these events.
      *
      * @param EventSubscriberInterface $subscriber The subscriber.
-     *
-     * @api
      */
     public function addSubscriber(EventSubscriberInterface $subscriber);
 
@@ -77,7 +69,7 @@ interface EventDispatcherInterface
     public function removeSubscriber(EventSubscriberInterface $subscriber);
 
     /**
-     * Gets the listeners of a specific event or all listeners.
+     * Gets the listeners of a specific event or all listeners sorted by descending priority.
      *
      * @param string $eventName The name of the event
      *
@@ -90,7 +82,7 @@ interface EventDispatcherInterface
      *
      * @param string $eventName The name of the event
      *
-     * @return bool    true if the specified event has any listeners, false otherwise
+     * @return bool true if the specified event has any listeners, false otherwise
      */
     public function hasListeners($eventName = null);
 }
--- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventSubscriberInterface.php
+++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventSubscriberInterface.php
@@ -17,12 +17,10 @@ namespace Symfony\Component\EventDispatcher;
  * {@link getSubscribedEvents} and registers the subscriber as a listener for all
  * returned events.
  *
- * @author  Guilherme Blanco <guilhermeblanco@hotmail.com>
- * @author  Jonathan Wage <jonwage@gmail.com>
- * @author  Roman Borschel <roman@code-factory.org>
- * @author  Bernhard Schussek <bschussek@gmail.com>
- *
- * @api
+ * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
+ * @author Jonathan Wage <jonwage@gmail.com>
+ * @author Roman Borschel <roman@code-factory.org>
+ * @author Bernhard Schussek <bschussek@gmail.com>
  */
 interface EventSubscriberInterface
 {
@@ -43,8 +41,6 @@ interface EventSubscriberInterface
      *  * array('eventName' => array(array('methodName1', $priority), array('methodName2'))
      *
      * @return array The event names to listen to
-     *
-     * @api
      */
     public static function getSubscribedEvents();
 }
--- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/GenericEvent.php
+++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/GenericEvent.php
@@ -175,7 +175,7 @@ class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate
     }
 
     /**
-     * IteratorAggregate for iterating over the object like an array
+     * IteratorAggregate for iterating over the object like an array.
      *
      * @return \ArrayIterator
      */
--- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ImmutableEventDispatcher.php
+++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ImmutableEventDispatcher.php
@@ -20,6 +20,7 @@ class ImmutableEventDispatcher implements EventDispatcherInterface
 {
     /**
      * The proxied dispatcher.
+     *
      * @var EventDispatcherInterface
      */
     private $dispatcher;
--- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/LICENSE
+++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2014 Fabien Potencier
+Copyright (c) 2004-2015 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
--- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/composer.json
+++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/composer.json
@@ -3,7 +3,7 @@
     "type": "library",
     "description": "Symfony EventDispatcher Component",
     "keywords": [],
-    "homepage": "http://symfony.com",
+    "homepage": "https://symfony.com",
     "license": "MIT",
     "authors": [
         {
@@ -12,21 +12,24 @@
         },
         {
             "name": "Symfony Community",
-            "homepage": "http://symfony.com/contributors"
+            "homepage": "https://symfony.com/contributors"
         }
     ],
     "require": {
         "php": ">=5.3.3"
     },
     "require-dev": {
-        "symfony/dependency-injection": "~2.0"
+        "symfony/dependency-injection": "~2.0,>=2.0.5"
     },
     "suggest": {
         "symfony/dependency-injection": "",
         "symfony/http-kernel": ""
     },
     "autoload": {
-        "psr-0": { "Symfony\\Component\\EventDispatcher\\": "" }
+        "psr-0": { "Symfony\\Component\\EventDispatcher\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
     },
     "target-dir": "Symfony/Component/EventDispatcher",
     "minimum-stability": "dev",
--- a/vendor/symfony/filesystem/Symfony/Component/Filesystem/Exception/ExceptionInterface.php
+++ b/vendor/symfony/filesystem/Symfony/Component/Filesystem/Exception/ExceptionInterface.php
@@ -15,8 +15,6 @@ namespace Symfony\Component\Filesystem\Exception;
  * Exception interface for all exceptions thrown by the component.
  *
  * @author Romain Neutron <imprec@gmail.com>
- *
- * @api
  */
 interface ExceptionInterface
 {
--- a/vendor/symfony/filesystem/Symfony/Component/Filesystem/Exception/IOException.php
+++ b/vendor/symfony/filesystem/Symfony/Component/Filesystem/Exception/IOException.php
@@ -12,11 +12,9 @@
 namespace Symfony\Component\Filesystem\Exception;
 
 /**
- * Exception class thrown when a filesystem operation failure happens
+ * Exception class thrown when a filesystem operation failure happens.
  *
  * @author Romain Neutron <imprec@gmail.com>
- *
- * @api
  */
 class IOException extends \RuntimeException implements ExceptionInterface
 {
--- a/vendor/symfony/filesystem/Symfony/Component/Filesystem/Filesystem.php
+++ b/vendor/symfony/filesystem/Symfony/Component/Filesystem/Filesystem.php
@@ -27,9 +27,9 @@ class Filesystem
      *
      * By default, if the target already exists, it is not overridden.
      *
-     * @param string  $originFile The original filename
-     * @param string  $targetFile The target filename
-     * @param bool    $override   Whether to override an existing file or not
+     * @param string $originFile The original filename
+     * @param string $targetFile The target filename
+     * @param bool   $override   Whether to override an existing file or not
      *
      * @throws IOException When copy fails
      */
@@ -41,10 +41,9 @@ class Filesystem
 
         $this->mkdir(dirname($targetFile));
 
-        if (!$override && is_file($targetFile) && null === parse_url($originFile, PHP_URL_HOST)) {
+        $doCopy = true;
+        if (!$override && null === parse_url($originFile, PHP_URL_HOST) && is_file($targetFile)) {
             $doCopy = filemtime($originFile) > filemtime($targetFile);
-        } else {
-            $doCopy = true;
         }
 
         if ($doCopy) {
@@ -96,7 +95,7 @@ class Filesystem
      *
      * @param string|array|\Traversable $files A filename, an array of files, or a \Traversable instance to check
      *
-     * @return bool    true if the file exists, false otherwise
+     * @return bool true if the file exists, false otherwise
      */
     public function exists($files)
     {
@@ -152,7 +151,7 @@ class Filesystem
                 }
             } else {
                 // https://bugs.php.net/bug.php?id=52176
-                if (defined('PHP_WINDOWS_VERSION_MAJOR') && is_dir($file)) {
+                if ('\\' === DIRECTORY_SEPARATOR && is_dir($file)) {
                     if (true !== @rmdir($file)) {
                         throw new IOException(sprintf('Failed to remove file %s', $file));
                     }
@@ -188,7 +187,7 @@ class Filesystem
     }
 
     /**
-     * Change the owner of an array of files or directories
+     * Change the owner of an array of files or directories.
      *
      * @param string|array|\Traversable $files     A filename, an array of files, or a \Traversable instance to change owner
      * @param string                    $user      The new owner user name
@@ -215,7 +214,7 @@ class Filesystem
     }
 
     /**
-     * Change the group of an array of files or directories
+     * Change the group of an array of files or directories.
      *
      * @param string|array|\Traversable $files     A filename, an array of files, or a \Traversable instance to change group
      * @param string                    $group     The group name
@@ -230,7 +229,7 @@ class Filesystem
                 $this->chgrp(new \FilesystemIterator($file), $group, true);
             }
             if (is_link($file) && function_exists('lchgrp')) {
-                if (true !== @lchgrp($file, $group)) {
+                if (true !== @lchgrp($file, $group) || (defined('HHVM_VERSION') && !posix_getgrnam($group))) {
                     throw new IOException(sprintf('Failed to chgrp file %s', $file));
                 }
             } else {
@@ -244,9 +243,9 @@ class Filesystem
     /**
      * Renames a file or a directory.
      *
-     * @param string  $origin    The origin filename or directory
-     * @param string  $target    The new filename or directory
-     * @param bool    $overwrite Whether to overwrite the target if it already exists
+     * @param string $origin    The origin filename or directory
+     * @param string $target    The new filename or directory
+     * @param bool   $overwrite Whether to overwrite the target if it already exists
      *
      * @throws IOException When target file or directory already exists
      * @throws IOException When origin cannot be renamed
@@ -266,15 +265,15 @@ class Filesystem
     /**
      * Creates a symbolic link or copy a directory.
      *
-     * @param string  $originDir     The origin directory path
-     * @param string  $targetDir     The symbolic link name
-     * @param bool    $copyOnWindows Whether to copy files if on Windows
+     * @param string $originDir     The origin directory path
+     * @param string $targetDir     The symbolic link name
+     * @param bool   $copyOnWindows Whether to copy files if on Windows
      *
      * @throws IOException When symlink fails
      */
     public function symlink($originDir, $targetDir, $copyOnWindows = false)
     {
-        if (!function_exists('symlink') && $copyOnWindows) {
+        if ($copyOnWindows && !function_exists('symlink')) {
             $this->mirror($originDir, $targetDir);
 
             return;
@@ -291,21 +290,19 @@ class Filesystem
             }
         }
 
-        if (!$ok) {
-            if (true !== @symlink($originDir, $targetDir)) {
-                $report = error_get_last();
-                if (is_array($report)) {
-                    if (defined('PHP_WINDOWS_VERSION_MAJOR') && false !== strpos($report['message'], 'error code(1314)')) {
-                        throw new IOException('Unable to create symlink due to error code 1314: \'A required privilege is not held by the client\'. Do you have the required Administrator-rights?');
-                    }
+        if (!$ok && true !== @symlink($originDir, $targetDir)) {
+            $report = error_get_last();
+            if (is_array($report)) {
+                if ('\\' === DIRECTORY_SEPARATOR && false !== strpos($report['message'], 'error code(1314)')) {
+                    throw new IOException('Unable to create symlink due to error code 1314: \'A required privilege is not held by the client\'. Do you have the required Administrator-rights?');
                 }
-                throw new IOException(sprintf('Failed to create symbolic link from %s to %s', $originDir, $targetDir));
             }
+            throw new IOException(sprintf('Failed to create symbolic link from %s to %s', $originDir, $targetDir));
         }
     }
 
     /**
-     * Given an existing path, convert it to a path relative to a given starting path
+     * Given an existing path, convert it to a path relative to a given starting path.
      *
      * @param string $endPath   Absolute path of target
      * @param string $startPath Absolute path where traversal begins
@@ -315,9 +312,9 @@ class Filesystem
     public function makePathRelative($endPath, $startPath)
     {
         // Normalize separators on Windows
-        if (defined('PHP_WINDOWS_VERSION_MAJOR')) {
-            $endPath = strtr($endPath, '\\', '/');
-            $startPath = strtr($startPath, '\\', '/');
+        if ('\\' === DIRECTORY_SEPARATOR) {
+            $endPath = str_replace('\\', '/', $endPath);
+            $startPath = str_replace('\\', '/', $startPath);
         }
 
         // Split the paths into arrays
@@ -327,21 +324,26 @@ class Filesystem
         // Find for which directory the common path stops
         $index = 0;
         while (isset($startPathArr[$index]) && isset($endPathArr[$index]) && $startPathArr[$index] === $endPathArr[$index]) {
-            $index++;
+            ++$index;
         }
 
         // Determine how deep the start path is relative to the common path (ie, "web/bundles" = 2 levels)
         $depth = count($startPathArr) - $index;
 
-        // Repeated "../" for each level need to reach the common path
-        $traverser = str_repeat('../', $depth);
+        // When we need to traverse from the start, and we are starting from a root path, don't add '../'
+        if ('/' === $startPath[0] && 0 === $index && 1 === $depth) {
+            $traverser = '';
+        } else {
+            // Repeated "../" for each level need to reach the common path
+            $traverser = str_repeat('../', $depth);
+        }
 
         $endPathRemainder = implode('/', array_slice($endPathArr, $index));
 
         // Construct $endPath from traversing to the common path, then to the remaining $endPath
-        $relativePath = $traverser.(strlen($endPathRemainder) > 0 ? $endPathRemainder.'/' : '');
+        $relativePath = $traverser.('' !== $endPathRemainder ? $endPathRemainder.'/' : '');
 
-        return (strlen($relativePath) === 0) ? './' : $relativePath;
+        return '' === $relativePath ? './' : $relativePath;
     }
 
     /**
@@ -351,10 +353,10 @@ class Filesystem
      * @param string       $targetDir The target directory
      * @param \Traversable $iterator  A Traversable instance
      * @param array        $options   An array of boolean options
-     *                               Valid options are:
-     *                                 - $options['override'] Whether to override an existing file on copy or not (see copy())
-     *                                 - $options['copy_on_windows'] Whether to copy files instead of links on Windows (see symlink())
-     *                                 - $options['delete'] Whether to delete files that are not in the source directory (defaults to false)
+     *                                Valid options are:
+     *                                - $options['override'] Whether to override an existing file on copy or not (see copy())
+     *                                - $options['copy_on_windows'] Whether to copy files instead of links on Windows (see symlink())
+     *                                - $options['delete'] Whether to delete files that are not in the source directory (defaults to false)
      *
      * @throws IOException When file type is unknown
      */
@@ -388,6 +390,10 @@ class Filesystem
             $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($originDir, $flags), \RecursiveIteratorIterator::SELF_FIRST);
         }
 
+        if ($this->exists($originDir)) {
+            $this->mkdir($targetDir);
+        }
+
         foreach ($iterator as $file) {
             $target = str_replace($originDir, $targetDir, $file->getPathname());
 
@@ -422,17 +428,13 @@ class Filesystem
      */
     public function isAbsolutePath($file)
     {
-        if (strspn($file, '/\\', 0, 1)
+        return (strspn($file, '/\\', 0, 1)
             || (strlen($file) > 3 && ctype_alpha($file[0])
                 && substr($file, 1, 1) === ':'
                 && (strspn($file, '/\\', 2, 1))
             )
             || null !== parse_url($file, PHP_URL_SCHEME)
-        ) {
-            return true;
-        }
-
-        return false;
+        );
     }
 
     /**
@@ -452,11 +454,12 @@ class Filesystem
     /**
      * Atomically dumps content into a file.
      *
-     * @param  string       $filename The file to be written to.
-     * @param  string       $content  The data to write into the file.
-     * @param  null|int     $mode     The file mode (octal). If null, file permissions are not modified
-     *                                Deprecated since version 2.3.12, to be removed in 3.0.
-     * @throws IOException            If the file cannot be written to.
+     * @param string   $filename The file to be written to.
+     * @param string   $content  The data to write into the file.
+     * @param null|int $mode     The file mode (octal). If null, file permissions are not modified
+     *                           Deprecated since version 2.3.12, to be removed in 3.0.
+     *
+     * @throws IOException If the file cannot be written to.
      */
     public function dumpFile($filename, $content, $mode = 0666)
     {
--- a/vendor/symfony/filesystem/Symfony/Component/Filesystem/LICENSE
+++ b/vendor/symfony/filesystem/Symfony/Component/Filesystem/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2014 Fabien Potencier
+Copyright (c) 2004-2015 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
--- a/vendor/symfony/filesystem/Symfony/Component/Filesystem/composer.json
+++ b/vendor/symfony/filesystem/Symfony/Component/Filesystem/composer.json
@@ -3,7 +3,7 @@
     "type": "library",
     "description": "Symfony Filesystem Component",
     "keywords": [],
-    "homepage": "http://symfony.com",
+    "homepage": "https://symfony.com",
     "license": "MIT",
     "authors": [
         {
@@ -12,14 +12,17 @@
         },
         {
             "name": "Symfony Community",
-            "homepage": "http://symfony.com/contributors"
+            "homepage": "https://symfony.com/contributors"
         }
     ],
     "require": {
         "php": ">=5.3.3"
     },
     "autoload": {
-        "psr-0": { "Symfony\\Component\\Filesystem\\": "" }
+        "psr-0": { "Symfony\\Component\\Filesystem\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
     },
     "target-dir": "Symfony/Component/Filesystem",
     "minimum-stability": "dev",
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/AcceptHeader.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/AcceptHeader.php
@@ -150,7 +150,7 @@ class AcceptHeader
     }
 
     /**
-     * Sorts items by descending quality
+     * Sorts items by descending quality.
      */
     private function sort()
     {
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/BinaryFileResponse.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/BinaryFileResponse.php
@@ -1,6 +1,6 @@
 <?php
 
-/**
+/*
  * This file is part of the Symfony package.
  *
  * (c) Fabien Potencier <fabien@symfony.com>
@@ -62,7 +62,7 @@ class BinaryFileResponse extends Response
      * @param bool                $autoEtag           Whether the ETag header should be automatically set
      * @param bool                $autoLastModified   Whether the Last-Modified header should be automatically set
      *
-     * @return BinaryResponse The created response
+     * @return BinaryFileResponse The created response
      */
     public static function create($file = null, $status = 200, $headers = array(), $public = true, $contentDisposition = null, $autoEtag = false, $autoLastModified = true)
     {
@@ -72,7 +72,7 @@ class BinaryFileResponse extends Response
     /**
      * Sets the file to stream.
      *
-     * @param \SplFileInfo|string $file The file to stream
+     * @param \SplFileInfo|string $file               The file to stream
      * @param string              $contentDisposition
      * @param bool                $autoEtag
      * @param bool                $autoLastModified
@@ -169,8 +169,11 @@ class BinaryFileResponse extends Response
     public function prepare(Request $request)
     {
         $this->headers->set('Content-Length', $this->file->getSize());
-        $this->headers->set('Accept-Ranges', 'bytes');
-        $this->headers->set('Content-Transfer-Encoding', 'binary');
+
+        if (!$this->headers->has('Accept-Ranges')) {
+            // Only accept ranges on safe HTTP methods
+            $this->headers->set('Accept-Ranges', $request->isMethodSafe() ? 'bytes' : 'none');
+        }
 
         if (!$this->headers->has('Content-Type')) {
             $this->headers->set('Content-Type', $this->file->getMimeType() ?: 'application/octet-stream');
@@ -191,12 +194,13 @@ class BinaryFileResponse extends Response
             $path = $this->file->getRealPath();
             if (strtolower($type) == 'x-accel-redirect') {
                 // Do X-Accel-Mapping substitutions.
-                foreach (explode(',', $request->headers->get('X-Accel-Mapping', ''))  as $mapping) {
+                // @link http://wiki.nginx.org/X-accel#X-Accel-Redirect
+                foreach (explode(',', $request->headers->get('X-Accel-Mapping', '')) as $mapping) {
                     $mapping = explode('=', $mapping, 2);
 
                     if (2 == count($mapping)) {
-                        $location = trim($mapping[0]);
-                        $pathPrefix = trim($mapping[1]);
+                        $pathPrefix = trim($mapping[0]);
+                        $location = trim($mapping[1]);
 
                         if (substr($path, 0, strlen($pathPrefix)) == $pathPrefix) {
                             $path = $location.substr($path, strlen($pathPrefix));
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Cookie.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Cookie.php
@@ -12,11 +12,9 @@
 namespace Symfony\Component\HttpFoundation;
 
 /**
- * Represents a cookie
+ * Represents a cookie.
  *
  * @author Johannes M. Schmitt <schmittjoh@gmail.com>
- *
- * @api
  */
 class Cookie
 {
@@ -31,17 +29,15 @@ class Cookie
     /**
      * Constructor.
      *
-     * @param string                   $name     The name of the cookie
-     * @param string                   $value    The value of the cookie
-     * @param int|string|\DateTime     $expire   The time the cookie expires
-     * @param string                   $path     The path on the server in which the cookie will be available on
-     * @param string                   $domain   The domain that the cookie is available to
-     * @param bool                     $secure   Whether the cookie should only be transmitted over a secure HTTPS connection from the client
-     * @param bool                     $httpOnly Whether the cookie will be made accessible only through the HTTP protocol
+     * @param string               $name     The name of the cookie
+     * @param string               $value    The value of the cookie
+     * @param int|string|\DateTime $expire   The time the cookie expires
+     * @param string               $path     The path on the server in which the cookie will be available on
+     * @param string               $domain   The domain that the cookie is available to
+     * @param bool                 $secure   Whether the cookie should only be transmitted over a secure HTTPS connection from the client
+     * @param bool                 $httpOnly Whether the cookie will be made accessible only through the HTTP protocol
      *
      * @throws \InvalidArgumentException
-     *
-     * @api
      */
     public function __construct($name, $value = null, $expire = 0, $path = '/', $domain = null, $secure = false, $httpOnly = true)
     {
@@ -84,12 +80,12 @@ class Cookie
         $str = urlencode($this->getName()).'=';
 
         if ('' === (string) $this->getValue()) {
-            $str .= 'deleted; expires='.gmdate("D, d-M-Y H:i:s T", time() - 31536001);
+            $str .= 'deleted; expires='.gmdate('D, d-M-Y H:i:s T', time() - 31536001);
         } else {
             $str .= urlencode($this->getValue());
 
             if ($this->getExpiresTime() !== 0) {
-                $str .= '; expires='.gmdate("D, d-M-Y H:i:s T", $this->getExpiresTime());
+                $str .= '; expires='.gmdate('D, d-M-Y H:i:s T', $this->getExpiresTime());
             }
         }
 
@@ -116,8 +112,6 @@ class Cookie
      * Gets the name of the cookie.
      *
      * @return string
-     *
-     * @api
      */
     public function getName()
     {
@@ -128,8 +122,6 @@ class Cookie
      * Gets the value of the cookie.
      *
      * @return string
-     *
-     * @api
      */
     public function getValue()
     {
@@ -140,8 +132,6 @@ class Cookie
      * Gets the domain that the cookie is available to.
      *
      * @return string
-     *
-     * @api
      */
     public function getDomain()
     {
@@ -152,8 +142,6 @@ class Cookie
      * Gets the time the cookie expires.
      *
      * @return int
-     *
-     * @api
      */
     public function getExpiresTime()
     {
@@ -164,8 +152,6 @@ class Cookie
      * Gets the path on the server in which the cookie will be available on.
      *
      * @return string
-     *
-     * @api
      */
     public function getPath()
     {
@@ -176,8 +162,6 @@ class Cookie
      * Checks whether the cookie should only be transmitted over a secure HTTPS connection from the client.
      *
      * @return bool
-     *
-     * @api
      */
     public function isSecure()
     {
@@ -188,8 +172,6 @@ class Cookie
      * Checks whether the cookie will be made accessible only through the HTTP protocol.
      *
      * @return bool
-     *
-     * @api
      */
     public function isHttpOnly()
     {
@@ -197,11 +179,9 @@ class Cookie
     }
 
     /**
-     * Whether this cookie is about to be cleared
+     * Whether this cookie is about to be cleared.
      *
      * @return bool
-     *
-     * @api
      */
     public function isCleared()
     {
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/Exception/FileException.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/Exception/FileException.php
@@ -12,7 +12,7 @@
 namespace Symfony\Component\HttpFoundation\File\Exception;
 
 /**
- * Thrown when an error occurred in the component File
+ * Thrown when an error occurred in the component File.
  *
  * @author Bernhard Schussek <bschussek@gmail.com>
  */
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/Exception/FileNotFoundException.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/Exception/FileNotFoundException.php
@@ -12,7 +12,7 @@
 namespace Symfony\Component\HttpFoundation\File\Exception;
 
 /**
- * Thrown when a file was not found
+ * Thrown when a file was not found.
  *
  * @author Bernhard Schussek <bschussek@gmail.com>
  */
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/Exception/UploadException.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/Exception/UploadException.php
@@ -12,7 +12,7 @@
 namespace Symfony\Component\HttpFoundation\File\Exception;
 
 /**
- * Thrown when an error occurred during file upload
+ * Thrown when an error occurred during file upload.
  *
  * @author Bernhard Schussek <bschussek@gmail.com>
  */
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/File.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/File.php
@@ -20,20 +20,16 @@ use Symfony\Component\HttpFoundation\File\MimeType\ExtensionGuesser;
  * A file in the file system.
  *
  * @author Bernhard Schussek <bschussek@gmail.com>
- *
- * @api
  */
 class File extends \SplFileInfo
 {
     /**
      * Constructs a new file from the given path.
      *
-     * @param string  $path      The path to the file
-     * @param bool    $checkPath Whether to check the path or not
+     * @param string $path      The path to the file
+     * @param bool   $checkPath Whether to check the path or not
      *
      * @throws FileNotFoundException If the given path is not a file
-     *
-     * @api
      */
     public function __construct($path, $checkPath = true)
     {
@@ -54,8 +50,6 @@ class File extends \SplFileInfo
      *
      * @return string|null The guessed extension or null if it cannot be guessed
      *
-     * @api
-     *
      * @see ExtensionGuesser
      * @see getMimeType()
      */
@@ -77,8 +71,6 @@ class File extends \SplFileInfo
      * @return string|null The guessed mime type (i.e. "application/pdf")
      *
      * @see MimeTypeGuesser
-     *
-     * @api
      */
     public function getMimeType()
     {
@@ -93,8 +85,6 @@ class File extends \SplFileInfo
      * \SplFileInfo::getExtension() is not available before PHP 5.3.6
      *
      * @return string The extension
-     *
-     * @api
      */
     public function getExtension()
     {
@@ -110,8 +100,6 @@ class File extends \SplFileInfo
      * @return File A File object representing the new file
      *
      * @throws FileException if the target file could not be created
-     *
-     * @api
      */
     public function move($directory, $name = null)
     {
@@ -130,7 +118,7 @@ class File extends \SplFileInfo
     protected function getTargetFile($directory, $name = null)
     {
         if (!is_dir($directory)) {
-            if (false === @mkdir($directory, 0777, true)) {
+            if (false === @mkdir($directory, 0777, true) && !is_dir($directory)) {
                 throw new FileException(sprintf('Unable to create the "%s" directory', $directory));
             }
         } elseif (!is_writable($directory)) {
@@ -139,7 +127,7 @@ class File extends \SplFileInfo
 
         $target = rtrim($directory, '/\\').DIRECTORY_SEPARATOR.(null === $name ? $this->getBasename() : $this->getName($name));
 
-        return new File($target, false);
+        return new self($target, false);
     }
 
     /**
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/ExtensionGuesser.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/ExtensionGuesser.php
@@ -26,21 +26,21 @@ namespace Symfony\Component\HttpFoundation\File\MimeType;
 class ExtensionGuesser implements ExtensionGuesserInterface
 {
     /**
-     * The singleton instance
+     * The singleton instance.
      *
      * @var ExtensionGuesser
      */
     private static $instance = null;
 
     /**
-     * All registered ExtensionGuesserInterface instances
+     * All registered ExtensionGuesserInterface instances.
      *
      * @var array
      */
     protected $guessers = array();
 
     /**
-     * Returns the singleton instance
+     * Returns the singleton instance.
      *
      * @return ExtensionGuesser
      */
@@ -54,7 +54,7 @@ class ExtensionGuesser implements ExtensionGuesserInterface
     }
 
     /**
-     * Registers all natively provided extension guessers
+     * Registers all natively provided extension guessers.
      */
     private function __construct()
     {
@@ -62,7 +62,7 @@ class ExtensionGuesser implements ExtensionGuesserInterface
     }
 
     /**
-     * Registers a new extension guesser
+     * Registers a new extension guesser.
      *
      * When guessing, this guesser is preferred over previously registered ones.
      *
@@ -74,7 +74,7 @@ class ExtensionGuesser implements ExtensionGuesserInterface
     }
 
     /**
-     * Tries to guess the extension
+     * Tries to guess the extension.
      *
      * The mime type is passed to each registered mime type guesser in reverse order
      * of their registration (last registered is queried first). Once a guesser
@@ -83,7 +83,7 @@ class ExtensionGuesser implements ExtensionGuesserInterface
      *
      * @param string $mimeType The mime type
      *
-     * @return string          The guessed extension or NULL, if none could be guessed
+     * @return string The guessed extension or NULL, if none could be guessed
      */
     public function guess($mimeType)
     {
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/ExtensionGuesserInterface.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/ExtensionGuesserInterface.php
@@ -12,15 +12,16 @@
 namespace Symfony\Component\HttpFoundation\File\MimeType;
 
 /**
- * Guesses the file extension corresponding to a given mime type
+ * Guesses the file extension corresponding to a given mime type.
  */
 interface ExtensionGuesserInterface
 {
     /**
-     * Makes a best guess for a file extension, given a mime type
+     * Makes a best guess for a file extension, given a mime type.
      *
      * @param string $mimeType The mime type
-     * @return string          The guessed extension or NULL, if none could be guessed
+     *
+     * @return string The guessed extension or NULL, if none could be guessed
      */
     public function guess($mimeType);
 }
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/FileBinaryMimeTypeGuesser.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/FileBinaryMimeTypeGuesser.php
@@ -15,7 +15,7 @@ use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
 use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;
 
 /**
- * Guesses the mime type with the binary "file" (only available on *nix)
+ * Guesses the mime type with the binary "file" (only available on *nix).
  *
  * @author Bernhard Schussek <bschussek@gmail.com>
  */
@@ -39,13 +39,13 @@ class FileBinaryMimeTypeGuesser implements MimeTypeGuesserInterface
     }
 
     /**
-     * Returns whether this guesser is supported on the current OS
+     * Returns whether this guesser is supported on the current OS.
      *
      * @return bool
      */
     public static function isSupported()
     {
-        return !defined('PHP_WINDOWS_VERSION_BUILD') && function_exists('passthru') && function_exists('escapeshellarg');
+        return '\\' !== DIRECTORY_SEPARATOR && function_exists('passthru') && function_exists('escapeshellarg');
     }
 
     /**
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/FileinfoMimeTypeGuesser.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/FileinfoMimeTypeGuesser.php
@@ -36,7 +36,7 @@ class FileinfoMimeTypeGuesser implements MimeTypeGuesserInterface
     }
 
     /**
-     * Returns whether this guesser is supported on the current OS/PHP setup
+     * Returns whether this guesser is supported on the current OS/PHP setup.
      *
      * @return bool
      */
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesser.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesser.php
@@ -40,21 +40,21 @@ use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;
 class MimeTypeGuesser implements MimeTypeGuesserInterface
 {
     /**
-     * The singleton instance
+     * The singleton instance.
      *
      * @var MimeTypeGuesser
      */
     private static $instance = null;
 
     /**
-     * All registered MimeTypeGuesserInterface instances
+     * All registered MimeTypeGuesserInterface instances.
      *
      * @var array
      */
     protected $guessers = array();
 
     /**
-     * Returns the singleton instance
+     * Returns the singleton instance.
      *
      * @return MimeTypeGuesser
      */
@@ -68,7 +68,15 @@ class MimeTypeGuesser implements MimeTypeGuesserInterface
     }
 
     /**
-     * Registers all natively provided mime type guessers
+     * Resets the singleton instance.
+     */
+    public static function reset()
+    {
+        self::$instance = null;
+    }
+
+    /**
+     * Registers all natively provided mime type guessers.
      */
     private function __construct()
     {
@@ -82,7 +90,7 @@ class MimeTypeGuesser implements MimeTypeGuesserInterface
     }
 
     /**
-     * Registers a new mime type guesser
+     * Registers a new mime type guesser.
      *
      * When guessing, this guesser is preferred over previously registered ones.
      *
@@ -94,7 +102,7 @@ class MimeTypeGuesser implements MimeTypeGuesserInterface
     }
 
     /**
-     * Tries to guess the mime type of the given file
+     * Tries to guess the mime type of the given file.
      *
      * The file is passed to each registered mime type guesser in reverse order
      * of their registration (last registered is queried first). Once a guesser
@@ -103,7 +111,7 @@ class MimeTypeGuesser implements MimeTypeGuesserInterface
      *
      * @param string $path The path to the file
      *
-     * @return string         The mime type or NULL, if none could be guessed
+     * @return string The mime type or NULL, if none could be guessed
      *
      * @throws \LogicException
      * @throws FileNotFoundException
@@ -120,7 +128,11 @@ class MimeTypeGuesser implements MimeTypeGuesserInterface
         }
 
         if (!$this->guessers) {
-            throw new \LogicException('Unable to guess the mime type as no guessers are available (Did you enable the php_fileinfo extension?)');
+            $msg = 'Unable to guess the mime type as no guessers are available';
+            if (!FileinfoMimeTypeGuesser::isSupported()) {
+                $msg .= ' (Did you enable the php_fileinfo extension?)';
+            }
+            throw new \LogicException($msg);
         }
 
         foreach ($this->guessers as $guesser) {
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesserInterface.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesserInterface.php
@@ -15,7 +15,7 @@ use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
 use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;
 
 /**
- * Guesses the mime type of a file
+ * Guesses the mime type of a file.
  *
  * @author Bernhard Schussek <bschussek@gmail.com>
  */
@@ -26,10 +26,10 @@ interface MimeTypeGuesserInterface
      *
      * @param string $path The path to the file
      *
-     * @return string         The mime type or NULL, if none could be guessed
+     * @return string The mime type or NULL, if none could be guessed
      *
-     * @throws FileNotFoundException  If the file does not exist
-     * @throws AccessDeniedException  If the file could not be read
+     * @throws FileNotFoundException If the file does not exist
+     * @throws AccessDeniedException If the file could not be read
      */
     public function guess($path);
 }
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/UploadedFile.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/UploadedFile.php
@@ -21,8 +21,6 @@ use Symfony\Component\HttpFoundation\File\MimeType\ExtensionGuesser;
  * @author Bernhard Schussek <bschussek@gmail.com>
  * @author Florian Eckerstorfer <florian@eckerstorfer.org>
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class UploadedFile extends File
 {
@@ -77,17 +75,15 @@ class UploadedFile extends File
      *
      * Calling any other method on an non-valid instance will cause an unpredictable result.
      *
-     * @param string  $path         The full temporary path to the file
-     * @param string  $originalName The original file name
-     * @param string  $mimeType     The type of the file as provided by PHP
-     * @param int     $size         The file size
-     * @param int     $error        The error constant of the upload (one of PHP's UPLOAD_ERR_XXX constants)
-     * @param bool    $test         Whether the test mode is active
+     * @param string $path         The full temporary path to the file
+     * @param string $originalName The original file name
+     * @param string $mimeType     The type of the file as provided by PHP
+     * @param int    $size         The file size
+     * @param int    $error        The error constant of the upload (one of PHP's UPLOAD_ERR_XXX constants)
+     * @param bool   $test         Whether the test mode is active
      *
      * @throws FileException         If file_uploads is disabled
      * @throws FileNotFoundException If the file does not exist
-     *
-     * @api
      */
     public function __construct($path, $originalName, $mimeType = null, $size = null, $error = null, $test = false)
     {
@@ -107,8 +103,6 @@ class UploadedFile extends File
      * Then it should not be considered as a safe value.
      *
      * @return string|null The original name
-     *
-     * @api
      */
     public function getClientOriginalName()
     {
@@ -116,7 +110,7 @@ class UploadedFile extends File
     }
 
     /**
-     * Returns the original file extension
+     * Returns the original file extension.
      *
      * It is extracted from the original file name that was uploaded.
      * Then it should not be considered as a safe value.
@@ -139,9 +133,7 @@ class UploadedFile extends File
      *
      * @return string|null The mime type
      *
-     * @see getMimeType
-     *
-     * @api
+     * @see getMimeType()
      */
     public function getClientMimeType()
     {
@@ -179,9 +171,7 @@ class UploadedFile extends File
      * It is extracted from the request from which the file has been uploaded.
      * Then it should not be considered as a safe value.
      *
-     * @return int|null     The file size
-     *
-     * @api
+     * @return int|null The file size
      */
     public function getClientSize()
     {
@@ -194,9 +184,7 @@ class UploadedFile extends File
      * If the upload was successful, the constant UPLOAD_ERR_OK is returned.
      * Otherwise one of the other UPLOAD_ERR_XXX constants is returned.
      *
-     * @return int     The upload error
-     *
-     * @api
+     * @return int The upload error
      */
     public function getError()
     {
@@ -206,9 +194,7 @@ class UploadedFile extends File
     /**
      * Returns whether the file was uploaded successfully.
      *
-     * @return bool    True if the file has been uploaded with HTTP and no error occurred.
-     *
-     * @api
+     * @return bool True if the file has been uploaded with HTTP and no error occurred.
      */
     public function isValid()
     {
@@ -226,8 +212,6 @@ class UploadedFile extends File
      * @return File A File object representing the new file
      *
      * @throws FileException if, for any reason, the file could not have been moved
-     *
-     * @api
      */
     public function move($directory, $name = null)
     {
@@ -252,7 +236,7 @@ class UploadedFile extends File
     }
 
     /**
-     * Returns the maximum size of an uploaded file as configured in php.ini
+     * Returns the maximum size of an uploaded file as configured in php.ini.
      *
      * @return int The maximum size of an uploaded file in bytes
      */
@@ -270,7 +254,7 @@ class UploadedFile extends File
         } elseif (0 === strpos($max, '0')) {
             $max = intval($max, 8);
         } else {
-            $max = intval($max);
+            $max = (int) $max;
         }
 
         switch (substr($iniMax, -1)) {
@@ -293,13 +277,13 @@ class UploadedFile extends File
     private function getErrorMessage($errorCode)
     {
         static $errors = array(
-            UPLOAD_ERR_INI_SIZE   => 'The file "%s" exceeds your upload_max_filesize ini directive (limit is %d kb).',
-            UPLOAD_ERR_FORM_SIZE  => 'The file "%s" exceeds the upload limit defined in your form.',
-            UPLOAD_ERR_PARTIAL    => 'The file "%s" was only partially uploaded.',
-            UPLOAD_ERR_NO_FILE    => 'No file was uploaded.',
+            UPLOAD_ERR_INI_SIZE => 'The file "%s" exceeds your upload_max_filesize ini directive (limit is %d kb).',
+            UPLOAD_ERR_FORM_SIZE => 'The file "%s" exceeds the upload limit defined in your form.',
+            UPLOAD_ERR_PARTIAL => 'The file "%s" was only partially uploaded.',
+            UPLOAD_ERR_NO_FILE => 'No file was uploaded.',
             UPLOAD_ERR_CANT_WRITE => 'The file "%s" could not be written on disk.',
             UPLOAD_ERR_NO_TMP_DIR => 'File could not be uploaded: missing temporary directory.',
-            UPLOAD_ERR_EXTENSION  => 'File upload was stopped by a PHP extension.',
+            UPLOAD_ERR_EXTENSION => 'File upload was stopped by a PHP extension.',
         );
 
         $maxFilesize = $errorCode === UPLOAD_ERR_INI_SIZE ? self::getMaxFilesize() / 1024 : 0;
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/FileBag.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/FileBag.php
@@ -18,8 +18,6 @@ use Symfony\Component\HttpFoundation\File\UploadedFile;
  *
  * @author Fabien Potencier <fabien@symfony.com>
  * @author Bulat Shakirzyanov <mallluhuct@gmail.com>
- *
- * @api
  */
 class FileBag extends ParameterBag
 {
@@ -29,8 +27,6 @@ class FileBag extends ParameterBag
      * Constructor.
      *
      * @param array $parameters An array of HTTP files
-     *
-     * @api
      */
     public function __construct(array $parameters = array())
     {
@@ -39,8 +35,6 @@ class FileBag extends ParameterBag
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function replace(array $files = array())
     {
@@ -50,8 +44,6 @@ class FileBag extends ParameterBag
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function set($key, $value)
     {
@@ -64,8 +56,6 @@ class FileBag extends ParameterBag
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function add(array $files = array())
     {
@@ -140,13 +130,13 @@ class FileBag extends ParameterBag
             unset($files[$k]);
         }
 
-        foreach (array_keys($data['name']) as $key) {
+        foreach ($data['name'] as $key => $name) {
             $files[$key] = $this->fixPhpFilesArray(array(
-                'error'    => $data['error'][$key],
-                'name'     => $data['name'][$key],
-                'type'     => $data['type'][$key],
+                'error' => $data['error'][$key],
+                'name' => $name,
+                'type' => $data['type'][$key],
                 'tmp_name' => $data['tmp_name'][$key],
-                'size'     => $data['size'][$key],
+                'size' => $data['size'][$key],
             ));
         }
 
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/HeaderBag.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/HeaderBag.php
@@ -15,8 +15,6 @@ namespace Symfony\Component\HttpFoundation;
  * HeaderBag is a container for HTTP headers.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class HeaderBag implements \IteratorAggregate, \Countable
 {
@@ -27,8 +25,6 @@ class HeaderBag implements \IteratorAggregate, \Countable
      * Constructor.
      *
      * @param array $headers An array of HTTP headers
-     *
-     * @api
      */
     public function __construct(array $headers = array())
     {
@@ -67,8 +63,6 @@ class HeaderBag implements \IteratorAggregate, \Countable
      * Returns the headers.
      *
      * @return array An array of headers
-     *
-     * @api
      */
     public function all()
     {
@@ -79,8 +73,6 @@ class HeaderBag implements \IteratorAggregate, \Countable
      * Returns the parameter keys.
      *
      * @return array An array of parameter keys
-     *
-     * @api
      */
     public function keys()
     {
@@ -91,8 +83,6 @@ class HeaderBag implements \IteratorAggregate, \Countable
      * Replaces the current HTTP headers by a new set.
      *
      * @param array $headers An array of HTTP headers
-     *
-     * @api
      */
     public function replace(array $headers = array())
     {
@@ -104,8 +94,6 @@ class HeaderBag implements \IteratorAggregate, \Countable
      * Adds new headers the current HTTP headers set.
      *
      * @param array $headers An array of HTTP headers
-     *
-     * @api
      */
     public function add(array $headers)
     {
@@ -117,13 +105,11 @@ class HeaderBag implements \IteratorAggregate, \Countable
     /**
      * Returns a header value by name.
      *
-     * @param string  $key     The header name
-     * @param mixed   $default The default value
-     * @param bool    $first   Whether to return the first value or all header values
+     * @param string $key     The header name
+     * @param mixed  $default The default value
+     * @param bool   $first   Whether to return the first value or all header values
      *
      * @return string|array The first header value if $first is true, an array of values otherwise
-     *
-     * @api
      */
     public function get($key, $default = null, $first = true)
     {
@@ -150,8 +136,6 @@ class HeaderBag implements \IteratorAggregate, \Countable
      * @param string       $key     The key
      * @param string|array $values  The value or an array of values
      * @param bool         $replace Whether to replace the actual value or not (true by default)
-     *
-     * @api
      */
     public function set($key, $values, $replace = true)
     {
@@ -175,9 +159,7 @@ class HeaderBag implements \IteratorAggregate, \Countable
      *
      * @param string $key The HTTP header
      *
-     * @return bool    true if the parameter exists, false otherwise
-     *
-     * @api
+     * @return bool true if the parameter exists, false otherwise
      */
     public function has($key)
     {
@@ -190,9 +172,7 @@ class HeaderBag implements \IteratorAggregate, \Countable
      * @param string $key   The HTTP header name
      * @param string $value The HTTP value
      *
-     * @return bool    true if the value is contained in the header, false otherwise
-     *
-     * @api
+     * @return bool true if the value is contained in the header, false otherwise
      */
     public function contains($key, $value)
     {
@@ -203,8 +183,6 @@ class HeaderBag implements \IteratorAggregate, \Countable
      * Removes a header.
      *
      * @param string $key The HTTP header name
-     *
-     * @api
      */
     public function remove($key)
     {
@@ -226,8 +204,6 @@ class HeaderBag implements \IteratorAggregate, \Countable
      * @return null|\DateTime The parsed DateTime or the default value if the header does not exist
      *
      * @throws \RuntimeException When the HTTP header is not parseable
-     *
-     * @api
      */
     public function getDate($key, \DateTime $default = null)
     {
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/IpUtils.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/IpUtils.php
@@ -19,19 +19,19 @@ namespace Symfony\Component\HttpFoundation;
 class IpUtils
 {
     /**
-     * This class should not be instantiated
+     * This class should not be instantiated.
      */
     private function __construct()
     {
     }
 
     /**
-     * Checks if an IPv4 or IPv6 address is contained in the list of given IPs or subnets
+     * Checks if an IPv4 or IPv6 address is contained in the list of given IPs or subnets.
      *
-     * @param string       $requestIp   IP to check
-     * @param string|array $ips         List of IPs or subnets (can be a string if only a single one)
+     * @param string       $requestIp IP to check
+     * @param string|array $ips       List of IPs or subnets (can be a string if only a single one)
      *
-     * @return bool    Whether the IP is valid
+     * @return bool Whether the IP is valid
      */
     public static function checkIp($requestIp, $ips)
     {
@@ -39,7 +39,7 @@ class IpUtils
             $ips = array($ips);
         }
 
-        $method = false !== strpos($requestIp, ':') ? 'checkIp6' : 'checkIp4';
+        $method = substr_count($requestIp, ':') > 1 ? 'checkIp6' : 'checkIp4';
 
         foreach ($ips as $ip) {
             if (self::$method($requestIp, $ip)) {
@@ -57,14 +57,19 @@ class IpUtils
      * @param string $requestIp IPv4 address to check
      * @param string $ip        IPv4 address or subnet in CIDR notation
      *
-     * @return bool    Whether the IP is valid
+     * @return bool Whether the request IP matches the IP, or whether the request IP is within the CIDR subnet.
      */
     public static function checkIp4($requestIp, $ip)
     {
         if (false !== strpos($ip, '/')) {
             list($address, $netmask) = explode('/', $ip, 2);
 
-            if ($netmask < 1 || $netmask > 32) {
+            if ($netmask === '0') {
+                // Ensure IP is valid - using ip2long below implicitly validates, but we need to do it manually here
+                return filter_var($address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4);
+            }
+
+            if ($netmask < 0 || $netmask > 32) {
                 return false;
             }
         } else {
@@ -80,12 +85,13 @@ class IpUtils
      * In case a subnet is given, it checks if it contains the request IP.
      *
      * @author David Soria Parra <dsp at php dot net>
+     *
      * @see https://github.com/dsp/v6tools
      *
      * @param string $requestIp IPv6 address to check
      * @param string $ip        IPv6 address or subnet in CIDR notation
      *
-     * @return bool    Whether the IP is valid
+     * @return bool Whether the IP is valid
      *
      * @throws \RuntimeException When IPV6 support is not enabled
      */
@@ -106,11 +112,11 @@ class IpUtils
             $netmask = 128;
         }
 
-        $bytesAddr = unpack("n*", inet_pton($address));
-        $bytesTest = unpack("n*", inet_pton($requestIp));
+        $bytesAddr = unpack('n*', inet_pton($address));
+        $bytesTest = unpack('n*', inet_pton($requestIp));
 
-        for ($i = 1, $ceil = ceil($netmask / 16); $i <= $ceil; $i++) {
-            $left = $netmask - 16 * ($i-1);
+        for ($i = 1, $ceil = ceil($netmask / 16); $i <= $ceil; ++$i) {
+            $left = $netmask - 16 * ($i - 1);
             $left = ($left <= 16) ? $left : 16;
             $mask = ~(0xffff >> $left) & 0xffff;
             if (($bytesAddr[$i] & $mask) != ($bytesTest[$i] & $mask)) {
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/JsonResponse.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/JsonResponse.php
@@ -27,12 +27,16 @@ class JsonResponse extends Response
     protected $data;
     protected $callback;
 
+    // Encode <, >, ', &, and " for RFC4627-compliant JSON, which may also be embedded into HTML.
+    // 15 === JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT
+    private $encodingOptions = 15;
+
     /**
      * Constructor.
      *
-     * @param mixed   $data    The response data
-     * @param int     $status  The response status code
-     * @param array   $headers An array of response headers
+     * @param mixed $data    The response data
+     * @param int   $status  The response status code
+     * @param array $headers An array of response headers
      */
     public function __construct($data = null, $status = 200, $headers = array())
     {
@@ -41,6 +45,7 @@ class JsonResponse extends Response
         if (null === $data) {
             $data = new \ArrayObject();
         }
+
         $this->setData($data);
     }
 
@@ -55,11 +60,11 @@ class JsonResponse extends Response
     /**
      * Sets the JSONP callback.
      *
-     * @param string $callback
+     * @param string|null $callback The JSONP callback or null to use none
      *
      * @return JsonResponse
      *
-     * @throws \InvalidArgumentException
+     * @throws \InvalidArgumentException When the callback name is not valid
      */
     public function setCallback($callback = null)
     {
@@ -80,7 +85,7 @@ class JsonResponse extends Response
     }
 
     /**
-     * Sets the data to be sent as json.
+     * Sets the data to be sent as JSON.
      *
      * @param mixed $data
      *
@@ -90,18 +95,63 @@ class JsonResponse extends Response
      */
     public function setData($data = array())
     {
-        // Encode <, >, ', &, and " for RFC4627-compliant JSON, which may also be embedded into HTML.
-        $this->data = json_encode($data, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT);
+        if (defined('HHVM_VERSION')) {
+            // HHVM does not trigger any warnings and let exceptions
+            // thrown from a JsonSerializable object pass through.
+            // If only PHP did the same...
+            $data = json_encode($data, $this->encodingOptions);
+        } else {
+            try {
+                if (PHP_VERSION_ID < 50400) {
+                    // PHP 5.3 triggers annoying warnings for some
+                    // types that can't be serialized as JSON (INF, resources, etc.)
+                    // but doesn't provide the JsonSerializable interface.
+                    set_error_handler('var_dump', 0);
+                    $data = @json_encode($data, $this->encodingOptions);
+                } else {
+                    // PHP 5.4 and up wrap exceptions thrown by JsonSerializable
+                    // objects in a new exception that needs to be removed.
+                    // Fortunately, PHP 5.5 and up do not trigger any warning anymore.
+                    if (PHP_VERSION_ID < 50500) {
+                        // Clear json_last_error()
+                        json_encode(null);
+                        $errorHandler = set_error_handler('var_dump');
+                        restore_error_handler();
+                        set_error_handler(function () use ($errorHandler) {
+                            if (JSON_ERROR_NONE === json_last_error()) {
+                                return $errorHandler && false !== call_user_func_array($errorHandler, func_get_args());
+                            }
+                        });
+                    }
+
+                    $data = json_encode($data, $this->encodingOptions);
+                }
+
+                if (PHP_VERSION_ID < 50500) {
+                    restore_error_handler();
+                }
+            } catch (\Exception $e) {
+                if (PHP_VERSION_ID < 50500) {
+                    restore_error_handler();
+                }
+                if (PHP_VERSION_ID >= 50400 && 'Exception' === get_class($e) && 0 === strpos($e->getMessage(), 'Failed calling ')) {
+                    throw $e->getPrevious() ?: $e;
+                }
+                throw $e;
+            }
+        }
 
         if (JSON_ERROR_NONE !== json_last_error()) {
             throw new \InvalidArgumentException($this->transformJsonError());
         }
 
+        $this->data = $data;
+
         return $this->update();
     }
 
     /**
-     * Updates the content and headers according to the json data and callback.
+     * Updates the content and headers according to the JSON data and callback.
      *
      * @return JsonResponse
      */
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/LICENSE
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2014 Fabien Potencier
+Copyright (c) 2004-2015 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
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/ParameterBag.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/ParameterBag.php
@@ -15,8 +15,6 @@ namespace Symfony\Component\HttpFoundation;
  * ParameterBag is a container for key/value pairs.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class ParameterBag implements \IteratorAggregate, \Countable
 {
@@ -31,8 +29,6 @@ class ParameterBag implements \IteratorAggregate, \Countable
      * Constructor.
      *
      * @param array $parameters An array of parameters
-     *
-     * @api
      */
     public function __construct(array $parameters = array())
     {
@@ -43,8 +39,6 @@ class ParameterBag implements \IteratorAggregate, \Countable
      * Returns the parameters.
      *
      * @return array An array of parameters
-     *
-     * @api
      */
     public function all()
     {
@@ -55,8 +49,6 @@ class ParameterBag implements \IteratorAggregate, \Countable
      * Returns the parameter keys.
      *
      * @return array An array of parameter keys
-     *
-     * @api
      */
     public function keys()
     {
@@ -67,8 +59,6 @@ class ParameterBag implements \IteratorAggregate, \Countable
      * Replaces the current parameters by a new set.
      *
      * @param array $parameters An array of parameters
-     *
-     * @api
      */
     public function replace(array $parameters = array())
     {
@@ -79,8 +69,6 @@ class ParameterBag implements \IteratorAggregate, \Countable
      * Adds parameters.
      *
      * @param array $parameters An array of parameters
-     *
-     * @api
      */
     public function add(array $parameters = array())
     {
@@ -90,15 +78,13 @@ class ParameterBag implements \IteratorAggregate, \Countable
     /**
      * Returns a parameter by name.
      *
-     * @param string  $path    The key
-     * @param mixed   $default The default value if the parameter key does not exist
-     * @param bool    $deep    If true, a path like foo[bar] will find deeper items
+     * @param string $path    The key
+     * @param mixed  $default The default value if the parameter key does not exist
+     * @param bool   $deep    If true, a path like foo[bar] will find deeper items
      *
      * @return mixed
      *
      * @throws \InvalidArgumentException
-     *
-     * @api
      */
     public function get($path, $default = null, $deep = false)
     {
@@ -113,7 +99,7 @@ class ParameterBag implements \IteratorAggregate, \Countable
 
         $value = $this->parameters[$root];
         $currentKey = null;
-        for ($i = $pos, $c = strlen($path); $i < $c; $i++) {
+        for ($i = $pos, $c = strlen($path); $i < $c; ++$i) {
             $char = $path[$i];
 
             if ('[' === $char) {
@@ -154,8 +140,6 @@ class ParameterBag implements \IteratorAggregate, \Countable
      *
      * @param string $key   The key
      * @param mixed  $value The value
-     *
-     * @api
      */
     public function set($key, $value)
     {
@@ -167,9 +151,7 @@ class ParameterBag implements \IteratorAggregate, \Countable
      *
      * @param string $key The key
      *
-     * @return bool    true if the parameter exists, false otherwise
-     *
-     * @api
+     * @return bool true if the parameter exists, false otherwise
      */
     public function has($key)
     {
@@ -180,8 +162,6 @@ class ParameterBag implements \IteratorAggregate, \Countable
      * Removes a parameter.
      *
      * @param string $key The key
-     *
-     * @api
      */
     public function remove($key)
     {
@@ -191,13 +171,11 @@ class ParameterBag implements \IteratorAggregate, \Countable
     /**
      * Returns the alphabetic characters of the parameter value.
      *
-     * @param string  $key     The parameter key
-     * @param mixed   $default The default value if the parameter key does not exist
-     * @param bool    $deep    If true, a path like foo[bar] will find deeper items
+     * @param string $key     The parameter key
+     * @param string $default The default value if the parameter key does not exist
+     * @param bool   $deep    If true, a path like foo[bar] will find deeper items
      *
      * @return string The filtered value
-     *
-     * @api
      */
     public function getAlpha($key, $default = '', $deep = false)
     {
@@ -207,13 +185,11 @@ class ParameterBag implements \IteratorAggregate, \Countable
     /**
      * Returns the alphabetic characters and digits of the parameter value.
      *
-     * @param string  $key     The parameter key
-     * @param mixed   $default The default value if the parameter key does not exist
-     * @param bool    $deep    If true, a path like foo[bar] will find deeper items
+     * @param string $key     The parameter key
+     * @param string $default The default value if the parameter key does not exist
+     * @param bool   $deep    If true, a path like foo[bar] will find deeper items
      *
      * @return string The filtered value
-     *
-     * @api
      */
     public function getAlnum($key, $default = '', $deep = false)
     {
@@ -223,13 +199,11 @@ class ParameterBag implements \IteratorAggregate, \Countable
     /**
      * Returns the digits of the parameter value.
      *
-     * @param string  $key     The parameter key
-     * @param mixed   $default The default value if the parameter key does not exist
-     * @param bool    $deep    If true, a path like foo[bar] will find deeper items
+     * @param string $key     The parameter key
+     * @param string $default The default value if the parameter key does not exist
+     * @param bool   $deep    If true, a path like foo[bar] will find deeper items
      *
      * @return string The filtered value
-     *
-     * @api
      */
     public function getDigits($key, $default = '', $deep = false)
     {
@@ -240,13 +214,11 @@ class ParameterBag implements \IteratorAggregate, \Countable
     /**
      * Returns the parameter value converted to integer.
      *
-     * @param string  $key     The parameter key
-     * @param mixed   $default The default value if the parameter key does not exist
-     * @param bool    $deep    If true, a path like foo[bar] will find deeper items
-     *
-     * @return int     The filtered value
+     * @param string $key     The parameter key
+     * @param int    $default The default value if the parameter key does not exist
+     * @param bool   $deep    If true, a path like foo[bar] will find deeper items
      *
-     * @api
+     * @return int The filtered value
      */
     public function getInt($key, $default = 0, $deep = false)
     {
@@ -256,11 +228,11 @@ class ParameterBag implements \IteratorAggregate, \Countable
     /**
      * Filter key.
      *
-     * @param string  $key     Key.
-     * @param mixed   $default Default = null.
-     * @param bool    $deep    Default = false.
-     * @param int     $filter  FILTER_* constant.
-     * @param mixed   $options Filter options.
+     * @param string $key     Key.
+     * @param mixed  $default Default = null.
+     * @param bool   $deep    Default = false.
+     * @param int    $filter  FILTER_* constant.
+     * @param mixed  $options Filter options.
      *
      * @see http://php.net/manual/en/function.filter-var.php
      *
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RedirectResponse.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RedirectResponse.php
@@ -15,8 +15,6 @@ namespace Symfony\Component\HttpFoundation;
  * RedirectResponse represents an HTTP response doing a redirect.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class RedirectResponse extends Response
 {
@@ -25,15 +23,13 @@ class RedirectResponse extends Response
     /**
      * Creates a redirect response so that it conforms to the rules defined for a redirect status code.
      *
-     * @param string  $url     The URL to redirect to
-     * @param int     $status  The status code (302 by default)
-     * @param array   $headers The headers (Location is always set to the given URL)
+     * @param string $url     The URL to redirect to
+     * @param int    $status  The status code (302 by default)
+     * @param array  $headers The headers (Location is always set to the given URL)
      *
      * @throws \InvalidArgumentException
      *
      * @see http://tools.ietf.org/html/rfc2616#section-10.3
-     *
-     * @api
      */
     public function __construct($url, $status = 302, $headers = array())
     {
@@ -71,7 +67,7 @@ class RedirectResponse extends Response
     /**
      * Sets the redirect target of this response.
      *
-     * @param string  $url     The URL to redirect to
+     * @param string $url The URL to redirect to
      *
      * @return RedirectResponse The current response.
      *
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php
@@ -25,15 +25,13 @@ use Symfony\Component\HttpFoundation\Session\SessionInterface;
  *   * getUriForPath
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class Request
 {
-    const HEADER_CLIENT_IP    = 'client_ip';
-    const HEADER_CLIENT_HOST  = 'client_host';
+    const HEADER_CLIENT_IP = 'client_ip';
+    const HEADER_CLIENT_HOST = 'client_host';
     const HEADER_CLIENT_PROTO = 'client_proto';
-    const HEADER_CLIENT_PORT  = 'client_port';
+    const HEADER_CLIENT_PORT = 'client_port';
 
     protected static $trustedProxies = array();
 
@@ -55,74 +53,60 @@ class Request
      * by popular reverse proxies (like Apache mod_proxy or Amazon EC2).
      */
     protected static $trustedHeaders = array(
-        self::HEADER_CLIENT_IP    => 'X_FORWARDED_FOR',
-        self::HEADER_CLIENT_HOST  => 'X_FORWARDED_HOST',
+        self::HEADER_CLIENT_IP => 'X_FORWARDED_FOR',
+        self::HEADER_CLIENT_HOST => 'X_FORWARDED_HOST',
         self::HEADER_CLIENT_PROTO => 'X_FORWARDED_PROTO',
-        self::HEADER_CLIENT_PORT  => 'X_FORWARDED_PORT',
+        self::HEADER_CLIENT_PORT => 'X_FORWARDED_PORT',
     );
 
     protected static $httpMethodParameterOverride = false;
 
     /**
-     * Custom parameters
+     * Custom parameters.
      *
      * @var \Symfony\Component\HttpFoundation\ParameterBag
-     *
-     * @api
      */
     public $attributes;
 
     /**
-     * Request body parameters ($_POST)
+     * Request body parameters ($_POST).
      *
      * @var \Symfony\Component\HttpFoundation\ParameterBag
-     *
-     * @api
      */
     public $request;
 
     /**
-     * Query string parameters ($_GET)
+     * Query string parameters ($_GET).
      *
      * @var \Symfony\Component\HttpFoundation\ParameterBag
-     *
-     * @api
      */
     public $query;
 
     /**
-     * Server and execution environment parameters ($_SERVER)
+     * Server and execution environment parameters ($_SERVER).
      *
      * @var \Symfony\Component\HttpFoundation\ServerBag
-     *
-     * @api
      */
     public $server;
 
     /**
-     * Uploaded files ($_FILES)
+     * Uploaded files ($_FILES).
      *
      * @var \Symfony\Component\HttpFoundation\FileBag
-     *
-     * @api
      */
     public $files;
 
     /**
-     * Cookies ($_COOKIE)
+     * Cookies ($_COOKIE).
      *
      * @var \Symfony\Component\HttpFoundation\ParameterBag
-     *
-     * @api
      */
     public $cookies;
 
     /**
-     * Headers (taken from the $_SERVER)
+     * Headers (taken from the $_SERVER).
      *
      * @var \Symfony\Component\HttpFoundation\HeaderBag
-     *
-     * @api
      */
     public $headers;
 
@@ -199,15 +183,13 @@ class Request
     /**
      * Constructor.
      *
-     * @param array  $query      The GET parameters
-     * @param array  $request    The POST parameters
-     * @param array  $attributes The request attributes (parameters parsed from the PATH_INFO, ...)
-     * @param array  $cookies    The COOKIE parameters
-     * @param array  $files      The FILES parameters
-     * @param array  $server     The SERVER parameters
-     * @param string $content    The raw body data
-     *
-     * @api
+     * @param array           $query      The GET parameters
+     * @param array           $request    The POST parameters
+     * @param array           $attributes The request attributes (parameters parsed from the PATH_INFO, ...)
+     * @param array           $cookies    The COOKIE parameters
+     * @param array           $files      The FILES parameters
+     * @param array           $server     The SERVER parameters
+     * @param string|resource $content    The raw body data
      */
     public function __construct(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null)
     {
@@ -219,15 +201,13 @@ class Request
      *
      * This method also re-initializes all properties.
      *
-     * @param array  $query      The GET parameters
-     * @param array  $request    The POST parameters
-     * @param array  $attributes The request attributes (parameters parsed from the PATH_INFO, ...)
-     * @param array  $cookies    The COOKIE parameters
-     * @param array  $files      The FILES parameters
-     * @param array  $server     The SERVER parameters
-     * @param string $content    The raw body data
-     *
-     * @api
+     * @param array           $query      The GET parameters
+     * @param array           $request    The POST parameters
+     * @param array           $attributes The request attributes (parameters parsed from the PATH_INFO, ...)
+     * @param array           $cookies    The COOKIE parameters
+     * @param array           $files      The FILES parameters
+     * @param array           $server     The SERVER parameters
+     * @param string|resource $content    The raw body data
      */
     public function initialize(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null)
     {
@@ -255,12 +235,23 @@ class Request
      * Creates a new request with values from PHP's super globals.
      *
      * @return Request A new request
-     *
-     * @api
      */
     public static function createFromGlobals()
     {
-        $request = new static($_GET, $_POST, array(), $_COOKIE, $_FILES, $_SERVER);
+        // With the php's bug #66606, the php's built-in web server
+        // stores the Content-Type and Content-Length header values in
+        // HTTP_CONTENT_TYPE and HTTP_CONTENT_LENGTH fields.
+        $server = $_SERVER;
+        if ('cli-server' === php_sapi_name()) {
+            if (array_key_exists('HTTP_CONTENT_LENGTH', $_SERVER)) {
+                $server['CONTENT_LENGTH'] = $_SERVER['HTTP_CONTENT_LENGTH'];
+            }
+            if (array_key_exists('HTTP_CONTENT_TYPE', $_SERVER)) {
+                $server['CONTENT_TYPE'] = $_SERVER['HTTP_CONTENT_TYPE'];
+            }
+        }
+
+        $request = new static($_GET, $_POST, array(), $_COOKIE, $_FILES, $server);
 
         if (0 === strpos($request->headers->get('CONTENT_TYPE'), 'application/x-www-form-urlencoded')
             && in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), array('PUT', 'DELETE', 'PATCH'))
@@ -287,24 +278,22 @@ class Request
      * @param string $content    The raw body data
      *
      * @return Request A Request instance
-     *
-     * @api
      */
     public static function create($uri, $method = 'GET', $parameters = array(), $cookies = array(), $files = array(), $server = array(), $content = null)
     {
         $server = array_replace(array(
-            'SERVER_NAME'          => 'localhost',
-            'SERVER_PORT'          => 80,
-            'HTTP_HOST'            => 'localhost',
-            'HTTP_USER_AGENT'      => 'Symfony/2.X',
-            'HTTP_ACCEPT'          => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
+            'SERVER_NAME' => 'localhost',
+            'SERVER_PORT' => 80,
+            'HTTP_HOST' => 'localhost',
+            'HTTP_USER_AGENT' => 'Symfony/2.X',
+            'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
             'HTTP_ACCEPT_LANGUAGE' => 'en-us,en;q=0.5',
-            'HTTP_ACCEPT_CHARSET'  => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
-            'REMOTE_ADDR'          => '127.0.0.1',
-            'SCRIPT_NAME'          => '',
-            'SCRIPT_FILENAME'      => '',
-            'SERVER_PROTOCOL'      => 'HTTP/1.1',
-            'REQUEST_TIME'         => time(),
+            'HTTP_ACCEPT_CHARSET' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
+            'REMOTE_ADDR' => '127.0.0.1',
+            'SCRIPT_NAME' => '',
+            'SCRIPT_FILENAME' => '',
+            'SERVER_PROTOCOL' => 'HTTP/1.1',
+            'REQUEST_TIME' => time(),
         ), $server);
 
         $server['PATH_INFO'] = '';
@@ -393,8 +382,6 @@ class Request
      * @param array $server     The SERVER parameters
      *
      * @return Request The duplicated request
-     *
-     * @api
      */
     public function duplicate(array $query = null, array $request = null, array $attributes = null, array $cookies = null, array $files = null, array $server = null)
     {
@@ -433,7 +420,7 @@ class Request
         }
 
         if (!$dup->getRequestFormat(null)) {
-            $dup->setRequestFormat($format = $this->getRequestFormat(null));
+            $dup->setRequestFormat($this->getRequestFormat(null));
         }
 
         return $dup;
@@ -447,13 +434,13 @@ class Request
      */
     public function __clone()
     {
-        $this->query      = clone $this->query;
-        $this->request    = clone $this->request;
+        $this->query = clone $this->query;
+        $this->request = clone $this->request;
         $this->attributes = clone $this->attributes;
-        $this->cookies    = clone $this->cookies;
-        $this->files      = clone $this->files;
-        $this->server     = clone $this->server;
-        $this->headers    = clone $this->headers;
+        $this->cookies = clone $this->cookies;
+        $this->files = clone $this->files;
+        $this->server = clone $this->server;
+        $this->headers = clone $this->headers;
     }
 
     /**
@@ -463,19 +450,23 @@ class Request
      */
     public function __toString()
     {
+        try {
+            $content = $this->getContent();
+        } catch (\LogicException $e) {
+            return trigger_error($e, E_USER_ERROR);
+        }
+
         return
             sprintf('%s %s %s', $this->getMethod(), $this->getRequestUri(), $this->server->get('SERVER_PROTOCOL'))."\r\n".
             $this->headers."\r\n".
-            $this->getContent();
+            $content;
     }
 
     /**
      * Overrides the PHP global variables according to this request instance.
      *
      * It overrides $_GET, $_POST, $_REQUEST, $_SERVER, $_COOKIE.
-     * $_FILES is never override, see rfc1867
-     *
-     * @api
+     * $_FILES is never overridden, see rfc1867
      */
     public function overrideGlobals()
     {
@@ -512,8 +503,6 @@ class Request
      * You should only list the reverse proxies that you manage directly.
      *
      * @param array $proxies A list of trusted proxies
-     *
-     * @api
      */
     public static function setTrustedProxies(array $proxies)
     {
@@ -540,7 +529,7 @@ class Request
     public static function setTrustedHosts(array $hostPatterns)
     {
         self::$trustedHostPatterns = array_map(function ($hostPattern) {
-            return sprintf('{%s}i', str_replace('}', '\\}', $hostPattern));
+            return sprintf('#%s#i', $hostPattern);
         }, $hostPatterns);
         // we need to reset trusted hosts on trusted host patterns change
         self::$trustedHosts = array();
@@ -562,8 +551,8 @@ class Request
      * The following header keys are supported:
      *
      *  * Request::HEADER_CLIENT_IP:    defaults to X-Forwarded-For   (see getClientIp())
-     *  * Request::HEADER_CLIENT_HOST:  defaults to X-Forwarded-Host  (see getClientHost())
-     *  * Request::HEADER_CLIENT_PORT:  defaults to X-Forwarded-Port  (see getClientPort())
+     *  * Request::HEADER_CLIENT_HOST:  defaults to X-Forwarded-Host  (see getHost())
+     *  * Request::HEADER_CLIENT_PORT:  defaults to X-Forwarded-Port  (see getPort())
      *  * Request::HEADER_CLIENT_PROTO: defaults to X-Forwarded-Proto (see getScheme() and isSecure())
      *
      * Setting an empty value allows to disable the trusted header for the given key.
@@ -648,6 +637,9 @@ class Request
      *
      * Be warned that enabling this feature might lead to CSRF issues in your code.
      * Check that you are using CSRF tokens when required.
+     * If the HTTP method parameter override is enabled, an html-form with method "POST" can be altered
+     * and used to send a "PUT" or "DELETE" request via the _method request parameter.
+     * If these methods are not protected against CSRF, this presents a possible vulnerability.
      *
      * The HTTP method can only be overridden when the real HTTP method is POST.
      */
@@ -659,7 +651,7 @@ class Request
     /**
      * Checks whether support for the _method request parameter is enabled.
      *
-     * @return bool    True when the _method request parameter is enabled, false otherwise
+     * @return bool True when the _method request parameter is enabled, false otherwise
      */
     public static function getHttpMethodParameterOverride()
     {
@@ -681,23 +673,33 @@ class Request
      * It is better to explicitly get request parameters from the appropriate
      * public property instead (query, attributes, request).
      *
-     * @param string  $key     the key
-     * @param mixed   $default the default value
-     * @param bool    $deep    is parameter deep in multidimensional array
+     * @param string $key     the key
+     * @param mixed  $default the default value
+     * @param bool   $deep    is parameter deep in multidimensional array
      *
      * @return mixed
      */
     public function get($key, $default = null, $deep = false)
     {
-        return $this->query->get($key, $this->attributes->get($key, $this->request->get($key, $default, $deep), $deep), $deep);
+        if ($this !== $result = $this->query->get($key, $this, $deep)) {
+            return $result;
+        }
+
+        if ($this !== $result = $this->attributes->get($key, $this, $deep)) {
+            return $result;
+        }
+
+        if ($this !== $result = $this->request->get($key, $this, $deep)) {
+            return $result;
+        }
+
+        return $default;
     }
 
     /**
      * Gets the Session.
      *
      * @return SessionInterface|null The session
-     *
-     * @api
      */
     public function getSession()
     {
@@ -709,8 +711,6 @@ class Request
      * previous requests.
      *
      * @return bool
-     *
-     * @api
      */
     public function hasPreviousSession()
     {
@@ -725,9 +725,7 @@ class Request
      * like whether the session is started or not. It is just a way to check if this Request
      * is associated with a Session instance.
      *
-     * @return bool    true when the Request contains a Session object, false otherwise
-     *
-     * @api
+     * @return bool true when the Request contains a Session object, false otherwise
      */
     public function hasSession()
     {
@@ -738,8 +736,6 @@ class Request
      * Sets the Session.
      *
      * @param SessionInterface $session The Session
-     *
-     * @api
      */
     public function setSession(SessionInterface $session)
     {
@@ -763,7 +759,7 @@ class Request
     {
         $ip = $this->server->get('REMOTE_ADDR');
 
-        if (!self::$trustedProxies) {
+        if (!$this->isFromTrustedProxy()) {
             return array($ip);
         }
 
@@ -778,6 +774,11 @@ class Request
 
         // Eliminate all IPs from the forwarded IP chain which are trusted proxies
         foreach ($clientIps as $key => $clientIp) {
+            // Remove port on IPv4 address (unfortunately, it does happen)
+            if (preg_match('{((?:\d+\.){3}\d+)\:\d+}', $clientIp, $match)) {
+                $clientIps[$key] = $clientIp = $match[1];
+            }
+
             if (IpUtils::checkIp($clientIp, self::$trustedProxies)) {
                 unset($clientIps[$key]);
             }
@@ -804,8 +805,6 @@ class Request
      *
      * @see getClientIps()
      * @see http://en.wikipedia.org/wiki/X-Forwarded-For
-     *
-     * @api
      */
     public function getClientIp()
     {
@@ -818,8 +817,6 @@ class Request
      * Returns current script name.
      *
      * @return string
-     *
-     * @api
      */
     public function getScriptName()
     {
@@ -839,8 +836,6 @@ class Request
      *  * http://localhost/mysite/about?var=1  returns '/about'
      *
      * @return string The raw path (i.e. not urldecoded)
-     *
-     * @api
      */
     public function getPathInfo()
     {
@@ -862,8 +857,6 @@ class Request
      *  * http://localhost/we%20b/index.php  returns '/we%20b'
      *
      * @return string The raw path (i.e. not urldecoded)
-     *
-     * @api
      */
     public function getBasePath()
     {
@@ -883,8 +876,6 @@ class Request
      * script filename (e.g. index.php) if one exists.
      *
      * @return string The raw URL (i.e. not urldecoded)
-     *
-     * @api
      */
     public function getBaseUrl()
     {
@@ -899,8 +890,6 @@ class Request
      * Gets the request's scheme.
      *
      * @return string
-     *
-     * @api
      */
     public function getScheme()
     {
@@ -919,12 +908,10 @@ class Request
      * configure it via "setTrustedHeaderName()" with the "client-port" key.
      *
      * @return string
-     *
-     * @api
      */
     public function getPort()
     {
-        if (self::$trustedProxies) {
+        if ($this->isFromTrustedProxy()) {
             if (self::$trustedHeaders[self::HEADER_CLIENT_PORT] && $port = $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_PORT])) {
                 return $port;
             }
@@ -942,7 +929,7 @@ class Request
             }
 
             if (false !== $pos) {
-                return intval(substr($host, $pos + 1));
+                return (int) substr($host, $pos + 1);
             }
 
             return 'https' === $this->getScheme() ? 443 : 80;
@@ -994,13 +981,11 @@ class Request
      * The port name will be appended to the host if it's non-standard.
      *
      * @return string
-     *
-     * @api
      */
     public function getHttpHost()
     {
         $scheme = $this->getScheme();
-        $port   = $this->getPort();
+        $port = $this->getPort();
 
         if (('http' == $scheme && $port == 80) || ('https' == $scheme && $port == 443)) {
             return $this->getHost();
@@ -1013,8 +998,6 @@ class Request
      * Returns the requested URI (path and query string).
      *
      * @return string The raw URI (i.e. not URI decoded)
-     *
-     * @api
      */
     public function getRequestUri()
     {
@@ -1044,8 +1027,6 @@ class Request
      * @return string A normalized URI (URL) for the Request
      *
      * @see getQueryString()
-     *
-     * @api
      */
     public function getUri()
     {
@@ -1062,8 +1043,6 @@ class Request
      * @param string $path A path to use instead of the current one
      *
      * @return string The normalized URI for the path
-     *
-     * @api
      */
     public function getUriForPath($path)
     {
@@ -1077,8 +1056,6 @@ class Request
      * and have consistent escaping.
      *
      * @return string|null A normalized query string for the Request
-     *
-     * @api
      */
     public function getQueryString()
     {
@@ -1090,7 +1067,7 @@ class Request
     /**
      * Checks whether the request is secure or not.
      *
-     * This method can read the client port from the "X-Forwarded-Proto" header
+     * This method can read the client protocol from the "X-Forwarded-Proto" header
      * when trusted proxies were set via "setTrustedProxies()".
      *
      * The "X-Forwarded-Proto" header must contain the protocol: "https" or "http".
@@ -1100,12 +1077,10 @@ class Request
      * the "client-proto" key.
      *
      * @return bool
-     *
-     * @api
      */
     public function isSecure()
     {
-        if (self::$trustedProxies && self::$trustedHeaders[self::HEADER_CLIENT_PROTO] && $proto = $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_PROTO])) {
+        if ($this->isFromTrustedProxy() && self::$trustedHeaders[self::HEADER_CLIENT_PROTO] && $proto = $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_PROTO])) {
             return in_array(strtolower(current(explode(',', $proto))), array('https', 'on', 'ssl', '1'));
         }
 
@@ -1117,7 +1092,7 @@ class Request
     /**
      * Returns the host name.
      *
-     * This method can read the client port from the "X-Forwarded-Host" header
+     * This method can read the client host name from the "X-Forwarded-Host" header
      * when trusted proxies were set via "setTrustedProxies()".
      *
      * The "X-Forwarded-Host" header must contain the client host name.
@@ -1128,12 +1103,10 @@ class Request
      * @return string
      *
      * @throws \UnexpectedValueException when the host name is invalid
-     *
-     * @api
      */
     public function getHost()
     {
-        if (self::$trustedProxies && self::$trustedHeaders[self::HEADER_CLIENT_HOST] && $host = $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_HOST])) {
+        if ($this->isFromTrustedProxy() && self::$trustedHeaders[self::HEADER_CLIENT_HOST] && $host = $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_HOST])) {
             $elements = explode(',', $host);
 
             $host = $elements[count($elements) - 1];
@@ -1179,8 +1152,6 @@ class Request
      * Sets the request method.
      *
      * @param string $method
-     *
-     * @api
      */
     public function setMethod($method)
     {
@@ -1201,9 +1172,7 @@ class Request
      *
      * @return string The request method
      *
-     * @api
-     *
-     * @see getRealMethod
+     * @see getRealMethod()
      */
     public function getMethod()
     {
@@ -1227,7 +1196,7 @@ class Request
      *
      * @return string The request method
      *
-     * @see getMethod
+     * @see getMethod()
      */
     public function getRealMethod()
     {
@@ -1240,8 +1209,6 @@ class Request
      * @param string $format The format
      *
      * @return string The associated mime type (null if not found)
-     *
-     * @api
      */
     public function getMimeType($format)
     {
@@ -1258,8 +1225,6 @@ class Request
      * @param string $mimeType The associated mime type
      *
      * @return string|null The format (null if not found)
-     *
-     * @api
      */
     public function getFormat($mimeType)
     {
@@ -1283,8 +1248,6 @@ class Request
      *
      * @param string       $format    The format
      * @param string|array $mimeTypes The associated mime types (the preferred one must be the first as it will be used as the content type)
-     *
-     * @api
      */
     public function setFormat($format, $mimeTypes)
     {
@@ -1307,8 +1270,6 @@ class Request
      * @param string $default The default format
      *
      * @return string The request format
-     *
-     * @api
      */
     public function getRequestFormat($default = 'html')
     {
@@ -1323,8 +1284,6 @@ class Request
      * Sets the request format.
      *
      * @param string $format The request format.
-     *
-     * @api
      */
     public function setRequestFormat($format)
     {
@@ -1335,8 +1294,6 @@ class Request
      * Gets the format associated with the request.
      *
      * @return string|null The format (null if no content type is present)
-     *
-     * @api
      */
     public function getContentType()
     {
@@ -1347,8 +1304,6 @@ class Request
      * Sets the default locale.
      *
      * @param string $locale
-     *
-     * @api
      */
     public function setDefaultLocale($locale)
     {
@@ -1373,8 +1328,6 @@ class Request
      * Sets the locale.
      *
      * @param string $locale
-     *
-     * @api
      */
     public function setLocale($locale)
     {
@@ -1407,8 +1360,6 @@ class Request
      * Checks whether the method is safe or not.
      *
      * @return bool
-     *
-     * @api
      */
     public function isMethodSafe()
     {
@@ -1418,7 +1369,7 @@ class Request
     /**
      * Returns the request body content.
      *
-     * @param bool    $asResource If true, a resource will be returned
+     * @param bool $asResource If true, a resource will be returned
      *
      * @return string|resource The request body content or a resource to read the body stream.
      *
@@ -1426,16 +1377,38 @@ class Request
      */
     public function getContent($asResource = false)
     {
-        if (false === $this->content || (true === $asResource && null !== $this->content)) {
-            throw new \LogicException('getContent() can only be called once when using the resource return type.');
+        $currentContentIsResource = is_resource($this->content);
+        if (PHP_VERSION_ID < 50600 && false === $this->content) {
+            throw new \LogicException('getContent() can only be called once when using the resource return type and PHP below 5.6.');
         }
 
         if (true === $asResource) {
+            if ($currentContentIsResource) {
+                rewind($this->content);
+
+                return $this->content;
+            }
+
+            // Content passed in parameter (test)
+            if (is_string($this->content)) {
+                $resource = fopen('php://temp', 'r+');
+                fwrite($resource, $this->content);
+                rewind($resource);
+
+                return $resource;
+            }
+
             $this->content = false;
 
             return fopen('php://input', 'rb');
         }
 
+        if ($currentContentIsResource) {
+            rewind($this->content);
+
+            return stream_get_contents($this->content);
+        }
+
         if (null === $this->content) {
             $this->content = file_get_contents('php://input');
         }
@@ -1467,8 +1440,6 @@ class Request
      * @param array $locales An array of ordered available locales
      *
      * @return string|null The preferred locale
-     *
-     * @api
      */
     public function getPreferredLanguage(array $locales = null)
     {
@@ -1502,8 +1473,6 @@ class Request
      * Gets a list of languages acceptable by the client browser.
      *
      * @return array Languages ordered in the user browser preferences
-     *
-     * @api
      */
     public function getLanguages()
     {
@@ -1513,10 +1482,10 @@ class Request
 
         $languages = AcceptHeader::fromString($this->headers->get('Accept-Language'))->all();
         $this->languages = array();
-        foreach (array_keys($languages) as $lang) {
-            if (strstr($lang, '-')) {
+        foreach ($languages as $lang => $acceptHeaderItem) {
+            if (false !== strpos($lang, '-')) {
                 $codes = explode('-', $lang);
-                if ($codes[0] == 'i') {
+                if ('i' === $codes[0]) {
                     // Language not listed in ISO 639 that are not variants
                     // of any listed language, which can be registered with the
                     // i-prefix, such as i-cherokee
@@ -1524,8 +1493,8 @@ class Request
                         $lang = $codes[1];
                     }
                 } else {
-                    for ($i = 0, $max = count($codes); $i < $max; $i++) {
-                        if ($i == 0) {
+                    for ($i = 0, $max = count($codes); $i < $max; ++$i) {
+                        if ($i === 0) {
                             $lang = strtolower($codes[0]);
                         } else {
                             $lang .= '_'.strtoupper($codes[$i]);
@@ -1544,8 +1513,6 @@ class Request
      * Gets a list of charsets acceptable by the client browser.
      *
      * @return array List of charsets in preferable order
-     *
-     * @api
      */
     public function getCharsets()
     {
@@ -1557,11 +1524,9 @@ class Request
     }
 
     /**
-     * Gets a list of content types acceptable by the client browser
+     * Gets a list of content types acceptable by the client browser.
      *
      * @return array List of content types in preferable order
-     *
-     * @api
      */
     public function getAcceptableContentTypes()
     {
@@ -1575,13 +1540,12 @@ class Request
     /**
      * Returns true if the request is a XMLHttpRequest.
      *
-     * It works if your JavaScript library set an X-Requested-With HTTP header.
+     * It works if your JavaScript library sets an X-Requested-With HTTP header.
      * It is known to work with common JavaScript frameworks:
-     * @link http://en.wikipedia.org/wiki/List_of_Ajax_frameworks#JavaScript
      *
-     * @return bool    true if the request is an XMLHttpRequest, false otherwise
+     * @link http://en.wikipedia.org/wiki/List_of_Ajax_frameworks#JavaScript
      *
-     * @api
+     * @return bool true if the request is an XMLHttpRequest, false otherwise
      */
     public function isXmlHttpRequest()
     {
@@ -1656,15 +1620,15 @@ class Request
         } else {
             // Backtrack up the script_filename to find the portion matching
             // php_self
-            $path    = $this->server->get('PHP_SELF', '');
-            $file    = $this->server->get('SCRIPT_FILENAME', '');
-            $segs    = explode('/', trim($file, '/'));
-            $segs    = array_reverse($segs);
-            $index   = 0;
-            $last    = count($segs);
+            $path = $this->server->get('PHP_SELF', '');
+            $file = $this->server->get('SCRIPT_FILENAME', '');
+            $segs = explode('/', trim($file, '/'));
+            $segs = array_reverse($segs);
+            $index = 0;
+            $last = count($segs);
             $baseUrl = '';
             do {
-                $seg     = $segs[$index];
+                $seg = $segs[$index];
                 $baseUrl = '/'.$seg.$baseUrl;
                 ++$index;
             } while ($last > $index && (false !== $pos = strpos($path, $baseUrl)) && 0 != $pos);
@@ -1678,9 +1642,9 @@ class Request
             return $prefix;
         }
 
-        if ($baseUrl && false !== $prefix = $this->getUrlencodedPrefix($requestUri, dirname($baseUrl))) {
+        if ($baseUrl && false !== $prefix = $this->getUrlencodedPrefix($requestUri, rtrim(dirname($baseUrl), '/'.DIRECTORY_SEPARATOR).'/')) {
             // directory portion of $baseUrl matches
-            return rtrim($prefix, '/');
+            return rtrim($prefix, '/'.DIRECTORY_SEPARATOR);
         }
 
         $truncatedRequestUri = $requestUri;
@@ -1701,7 +1665,7 @@ class Request
             $baseUrl = substr($requestUri, 0, $pos + strlen($baseUrl));
         }
 
-        return rtrim($baseUrl, '/');
+        return rtrim($baseUrl, '/'.DIRECTORY_SEPARATOR);
     }
 
     /**
@@ -1750,7 +1714,8 @@ class Request
             $requestUri = substr($requestUri, 0, $pos);
         }
 
-        if (null !== $baseUrl && false === $pathInfo = substr($requestUri, strlen($baseUrl))) {
+        $pathInfo = substr($requestUri, strlen($baseUrl));
+        if (null !== $baseUrl && (false === $pathInfo || '' === $pathInfo)) {
             // If substr() returns false then PATH_INFO is set to an empty string
             return '/';
         } elseif (null === $baseUrl) {
@@ -1767,14 +1732,14 @@ class Request
     {
         static::$formats = array(
             'html' => array('text/html', 'application/xhtml+xml'),
-            'txt'  => array('text/plain'),
-            'js'   => array('application/javascript', 'application/x-javascript', 'text/javascript'),
-            'css'  => array('text/css'),
+            'txt' => array('text/plain'),
+            'js' => array('application/javascript', 'application/x-javascript', 'text/javascript'),
+            'css' => array('text/css'),
             'json' => array('application/json', 'application/x-json'),
-            'xml'  => array('text/xml', 'application/xml', 'application/x-xml'),
-            'rdf'  => array('application/rdf+xml'),
+            'xml' => array('text/xml', 'application/xml', 'application/x-xml'),
+            'rdf' => array('application/rdf+xml'),
             'atom' => array('application/atom+xml'),
-            'rss'  => array('application/rss+xml'),
+            'rss' => array('application/rss+xml'),
         );
     }
 
@@ -1813,10 +1778,15 @@ class Request
 
         $len = strlen($prefix);
 
-        if (preg_match("#^(%[[:xdigit:]]{2}|.){{$len}}#", $string, $match)) {
+        if (preg_match(sprintf('#^(%%[[:xdigit:]]{2}|.){%d}#', $len), $string, $match)) {
             return $match[0];
         }
 
         return false;
     }
+
+    private function isFromTrustedProxy()
+    {
+        return self::$trustedProxies && IpUtils::checkIp($this->server->get('REMOTE_ADDR'), self::$trustedProxies);
+    }
 }
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RequestMatcher.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RequestMatcher.php
@@ -15,8 +15,6 @@ namespace Symfony\Component\HttpFoundation;
  * RequestMatcher compares a pre-defined set of checks against a Request instance.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class RequestMatcher implements RequestMatcherInterface
 {
@@ -126,8 +124,6 @@ class RequestMatcher implements RequestMatcherInterface
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function matches(Request $request)
     {
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RequestMatcherInterface.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RequestMatcherInterface.php
@@ -15,8 +15,6 @@ namespace Symfony\Component\HttpFoundation;
  * RequestMatcherInterface is an interface for strategies to match a Request.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 interface RequestMatcherInterface
 {
@@ -25,9 +23,7 @@ interface RequestMatcherInterface
      *
      * @param Request $request The request to check for a match
      *
-     * @return bool    true if the request matches, false otherwise
-     *
-     * @api
+     * @return bool true if the request matches, false otherwise
      */
     public function matches(Request $request);
 }
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Resources/stubs/SessionHandlerInterface.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Resources/stubs/SessionHandlerInterface.php
@@ -10,7 +10,7 @@
  */
 
 /**
- * SessionHandlerInterface for PHP < 5.4
+ * SessionHandlerInterface for PHP < 5.4.
  *
  * Extensive documentation can be found at php.net, see links:
  *
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Response.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Response.php
@@ -15,8 +15,6 @@ namespace Symfony\Component\HttpFoundation;
  * Response represents an HTTP response.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class Response
 {
@@ -127,13 +125,11 @@ class Response
     /**
      * Constructor.
      *
-     * @param string  $content The response content
-     * @param int     $status  The response status code
-     * @param array   $headers An array of response headers
+     * @param string $content The response content
+     * @param int    $status  The response status code
+     * @param array  $headers An array of response headers
      *
      * @throws \InvalidArgumentException When the HTTP status code is not valid
-     *
-     * @api
      */
     public function __construct($content = '', $status = 200, $headers = array())
     {
@@ -142,21 +138,21 @@ class Response
         $this->setStatusCode($status);
         $this->setProtocolVersion('1.0');
         if (!$this->headers->has('Date')) {
-            $this->setDate(new \DateTime(null, new \DateTimeZone('UTC')));
+            $this->setDate(\DateTime::createFromFormat('U', time(), new \DateTimeZone('UTC')));
         }
     }
 
     /**
-     * Factory method for chainability
+     * Factory method for chainability.
      *
      * Example:
      *
      *     return Response::create($body, 200)
      *         ->setSharedMaxAge(300);
      *
-     * @param string  $content The response content
-     * @param int     $status  The response status code
-     * @param array   $headers An array of response headers
+     * @param string $content The response content
+     * @param int    $status  The response status code
+     * @param array  $headers An array of response headers
      *
      * @return Response
      */
@@ -207,7 +203,7 @@ class Response
     {
         $headers = $this->headers;
 
-        if ($this->isInformational() || in_array($this->statusCode, array(204, 304))) {
+        if ($this->isInformational() || $this->isEmpty()) {
             $this->setContent(null);
             $headers->remove('Content-Type');
             $headers->remove('Content-Length');
@@ -306,8 +302,6 @@ class Response
      * Sends HTTP headers and content.
      *
      * @return Response
-     *
-     * @api
      */
     public function send()
     {
@@ -324,7 +318,7 @@ class Response
             while (($level = ob_get_level()) > 0 && $level !== $previous) {
                 $previous = $level;
                 if ($obStatus[$level - 1]) {
-                    if (version_compare(PHP_VERSION, '5.4', '>=')) {
+                    if (PHP_VERSION_ID >= 50400) {
                         if (isset($obStatus[$level - 1]['flags']) && ($obStatus[$level - 1]['flags'] & PHP_OUTPUT_HANDLER_REMOVABLE)) {
                             ob_end_flush();
                         }
@@ -351,8 +345,6 @@ class Response
      * @return Response
      *
      * @throws \UnexpectedValueException
-     *
-     * @api
      */
     public function setContent($content)
     {
@@ -369,8 +361,6 @@ class Response
      * Gets the current response content.
      *
      * @return string Content
-     *
-     * @api
      */
     public function getContent()
     {
@@ -383,8 +373,6 @@ class Response
      * @param string $version The HTTP protocol version
      *
      * @return Response
-     *
-     * @api
      */
     public function setProtocolVersion($version)
     {
@@ -397,8 +385,6 @@ class Response
      * Gets the HTTP protocol version.
      *
      * @return string The HTTP protocol version
-     *
-     * @api
      */
     public function getProtocolVersion()
     {
@@ -408,8 +394,8 @@ class Response
     /**
      * Sets the response status code.
      *
-     * @param int     $code HTTP status code
-     * @param mixed   $text HTTP status text
+     * @param int   $code HTTP status code
+     * @param mixed $text HTTP status text
      *
      * If the status text is null it will be automatically populated for the known
      * status codes and left empty otherwise.
@@ -417,8 +403,6 @@ class Response
      * @return Response
      *
      * @throws \InvalidArgumentException When the HTTP status code is not valid
-     *
-     * @api
      */
     public function setStatusCode($code, $text = null)
     {
@@ -428,7 +412,7 @@ class Response
         }
 
         if (null === $text) {
-            $this->statusText = isset(self::$statusTexts[$code]) ? self::$statusTexts[$code] : '';
+            $this->statusText = isset(self::$statusTexts[$code]) ? self::$statusTexts[$code] : 'unknown status';
 
             return $this;
         }
@@ -447,9 +431,7 @@ class Response
     /**
      * Retrieves the status code for the current web response.
      *
-     * @return int     Status code
-     *
-     * @api
+     * @return int Status code
      */
     public function getStatusCode()
     {
@@ -462,8 +444,6 @@ class Response
      * @param string $charset Character set
      *
      * @return Response
-     *
-     * @api
      */
     public function setCharset($charset)
     {
@@ -476,8 +456,6 @@ class Response
      * Retrieves the response charset.
      *
      * @return string Character set
-     *
-     * @api
      */
     public function getCharset()
     {
@@ -493,9 +471,7 @@ class Response
      * Responses with neither a freshness lifetime (Expires, max-age) nor cache
      * validator (Last-Modified, ETag) are considered uncacheable.
      *
-     * @return bool    true if the response is worth caching, false otherwise
-     *
-     * @api
+     * @return bool true if the response is worth caching, false otherwise
      */
     public function isCacheable()
     {
@@ -517,9 +493,7 @@ class Response
      * origin. A response is considered fresh when it includes a Cache-Control/max-age
      * indicator or Expires header and the calculated age is less than the freshness lifetime.
      *
-     * @return bool    true if the response is fresh, false otherwise
-     *
-     * @api
+     * @return bool true if the response is fresh, false otherwise
      */
     public function isFresh()
     {
@@ -530,9 +504,7 @@ class Response
      * Returns true if the response includes headers that can be used to validate
      * the response with the origin server using a conditional GET request.
      *
-     * @return bool    true if the response is validateable, false otherwise
-     *
-     * @api
+     * @return bool true if the response is validateable, false otherwise
      */
     public function isValidateable()
     {
@@ -545,8 +517,6 @@ class Response
      * It makes the response ineligible for serving other clients.
      *
      * @return Response
-     *
-     * @api
      */
     public function setPrivate()
     {
@@ -562,8 +532,6 @@ class Response
      * It makes the response eligible for serving other clients.
      *
      * @return Response
-     *
-     * @api
      */
     public function setPublic()
     {
@@ -581,13 +549,11 @@ class Response
      * When present, the TTL of the response should not be overridden to be
      * greater than the value provided by the origin.
      *
-     * @return bool    true if the response must be revalidated by a cache, false otherwise
-     *
-     * @api
+     * @return bool true if the response must be revalidated by a cache, false otherwise
      */
     public function mustRevalidate()
     {
-        return $this->headers->hasCacheControlDirective('must-revalidate') || $this->headers->has('proxy-revalidate');
+        return $this->headers->hasCacheControlDirective('must-revalidate') || $this->headers->hasCacheControlDirective('proxy-revalidate');
     }
 
     /**
@@ -596,8 +562,6 @@ class Response
      * @return \DateTime A \DateTime instance
      *
      * @throws \RuntimeException When the header is not parseable
-     *
-     * @api
      */
     public function getDate()
     {
@@ -610,8 +574,6 @@ class Response
      * @param \DateTime $date A \DateTime instance
      *
      * @return Response
-     *
-     * @api
      */
     public function setDate(\DateTime $date)
     {
@@ -624,7 +586,7 @@ class Response
     /**
      * Returns the age of the response.
      *
-     * @return int     The age of the response in seconds
+     * @return int The age of the response in seconds
      */
     public function getAge()
     {
@@ -639,8 +601,6 @@ class Response
      * Marks the response stale by setting the Age header to be equal to the maximum age of the response.
      *
      * @return Response
-     *
-     * @api
      */
     public function expire()
     {
@@ -655,8 +615,6 @@ class Response
      * Returns the value of the Expires header as a DateTime instance.
      *
      * @return \DateTime|null A DateTime instance or null if the header does not exist
-     *
-     * @api
      */
     public function getExpires()
     {
@@ -676,8 +634,6 @@ class Response
      * @param \DateTime|null $date A \DateTime instance or null to remove the header
      *
      * @return Response
-     *
-     * @api
      */
     public function setExpires(\DateTime $date = null)
     {
@@ -699,9 +655,7 @@ class Response
      * First, it checks for a s-maxage directive, then a max-age directive, and then it falls
      * back on an expires header. It returns null when no maximum age can be established.
      *
-     * @return int|null     Number of seconds
-     *
-     * @api
+     * @return int|null Number of seconds
      */
     public function getMaxAge()
     {
@@ -723,11 +677,9 @@ class Response
      *
      * This methods sets the Cache-Control max-age directive.
      *
-     * @param int     $value Number of seconds
+     * @param int $value Number of seconds
      *
      * @return Response
-     *
-     * @api
      */
     public function setMaxAge($value)
     {
@@ -741,11 +693,9 @@ class Response
      *
      * This methods sets the Cache-Control s-maxage directive.
      *
-     * @param int     $value Number of seconds
+     * @param int $value Number of seconds
      *
      * @return Response
-     *
-     * @api
      */
     public function setSharedMaxAge($value)
     {
@@ -763,9 +713,7 @@ class Response
      * When the responses TTL is <= 0, the response may not be served from cache without first
      * revalidating with the origin.
      *
-     * @return int|null     The TTL in seconds
-     *
-     * @api
+     * @return int|null The TTL in seconds
      */
     public function getTtl()
     {
@@ -779,11 +727,9 @@ class Response
      *
      * This method adjusts the Cache-Control/s-maxage directive.
      *
-     * @param int     $seconds Number of seconds
+     * @param int $seconds Number of seconds
      *
      * @return Response
-     *
-     * @api
      */
     public function setTtl($seconds)
     {
@@ -797,11 +743,9 @@ class Response
      *
      * This method adjusts the Cache-Control/max-age directive.
      *
-     * @param int     $seconds Number of seconds
+     * @param int $seconds Number of seconds
      *
      * @return Response
-     *
-     * @api
      */
     public function setClientTtl($seconds)
     {
@@ -816,8 +760,6 @@ class Response
      * @return \DateTime|null A DateTime instance or null if the header does not exist
      *
      * @throws \RuntimeException When the HTTP header is not parseable
-     *
-     * @api
      */
     public function getLastModified()
     {
@@ -832,8 +774,6 @@ class Response
      * @param \DateTime|null $date A \DateTime instance or null to remove the header
      *
      * @return Response
-     *
-     * @api
      */
     public function setLastModified(\DateTime $date = null)
     {
@@ -852,8 +792,6 @@ class Response
      * Returns the literal value of the ETag HTTP header.
      *
      * @return string|null The ETag HTTP header or null if it does not exist
-     *
-     * @api
      */
     public function getEtag()
     {
@@ -867,8 +805,6 @@ class Response
      * @param bool        $weak Whether you want a weak ETag or not
      *
      * @return Response
-     *
-     * @api
      */
     public function setEtag($etag = null, $weak = false)
     {
@@ -895,8 +831,6 @@ class Response
      * @return Response
      *
      * @throws \InvalidArgumentException
-     *
-     * @api
      */
     public function setCache(array $options)
     {
@@ -948,8 +882,6 @@ class Response
      * @return Response
      *
      * @see http://tools.ietf.org/html/rfc2616#section-10.3.5
-     *
-     * @api
      */
     public function setNotModified()
     {
@@ -967,9 +899,7 @@ class Response
     /**
      * Returns true if the response includes a Vary header.
      *
-     * @return bool    true if the response includes a Vary header, false otherwise
-     *
-     * @api
+     * @return bool true if the response includes a Vary header, false otherwise
      */
     public function hasVary()
     {
@@ -980,8 +910,6 @@ class Response
      * Returns an array of header names given in the Vary header.
      *
      * @return array An array of Vary names
-     *
-     * @api
      */
     public function getVary()
     {
@@ -1004,8 +932,6 @@ class Response
      * @param bool         $replace Whether to replace the actual value of not (true by default)
      *
      * @return Response
-     *
-     * @api
      */
     public function setVary($headers, $replace = true)
     {
@@ -1023,9 +949,7 @@ class Response
      *
      * @param Request $request A Request instance
      *
-     * @return bool    true if the Response validators match the Request, false otherwise
-     *
-     * @api
+     * @return bool true if the Response validators match the Request, false otherwise
      */
     public function isNotModified(Request $request)
     {
@@ -1033,11 +957,11 @@ class Response
             return false;
         }
 
-        $notModified   = false;
-        $lastModified  = $this->headers->get('Last-Modified');
+        $notModified = false;
+        $lastModified = $this->headers->get('Last-Modified');
         $modifiedSince = $request->headers->get('If-Modified-Since');
 
-        if ($etags = $request->getEtags()) {
+        if ($etags = $request->getETags()) {
             $notModified = in_array($this->getEtag(), $etags) || in_array('*', $etags);
         }
 
@@ -1057,8 +981,6 @@ class Response
      * Is response invalid?
      *
      * @return bool
-     *
-     * @api
      */
     public function isInvalid()
     {
@@ -1069,8 +991,6 @@ class Response
      * Is response informative?
      *
      * @return bool
-     *
-     * @api
      */
     public function isInformational()
     {
@@ -1081,8 +1001,6 @@ class Response
      * Is response successful?
      *
      * @return bool
-     *
-     * @api
      */
     public function isSuccessful()
     {
@@ -1093,8 +1011,6 @@ class Response
      * Is the response a redirect?
      *
      * @return bool
-     *
-     * @api
      */
     public function isRedirection()
     {
@@ -1105,8 +1021,6 @@ class Response
      * Is there a client error?
      *
      * @return bool
-     *
-     * @api
      */
     public function isClientError()
     {
@@ -1117,8 +1031,6 @@ class Response
      * Was there a server side error?
      *
      * @return bool
-     *
-     * @api
      */
     public function isServerError()
     {
@@ -1129,8 +1041,6 @@ class Response
      * Is the response OK?
      *
      * @return bool
-     *
-     * @api
      */
     public function isOk()
     {
@@ -1141,8 +1051,6 @@ class Response
      * Is the response forbidden?
      *
      * @return bool
-     *
-     * @api
      */
     public function isForbidden()
     {
@@ -1153,8 +1061,6 @@ class Response
      * Is the response a not found error?
      *
      * @return bool
-     *
-     * @api
      */
     public function isNotFound()
     {
@@ -1167,8 +1073,6 @@ class Response
      * @param string $location
      *
      * @return bool
-     *
-     * @api
      */
     public function isRedirect($location = null)
     {
@@ -1179,8 +1083,6 @@ class Response
      * Is the response empty?
      *
      * @return bool
-     *
-     * @api
      */
     public function isEmpty()
     {
@@ -1188,14 +1090,14 @@ class Response
     }
 
     /**
-     * Check if we need to remove Cache-Control for SSL encrypted downloads when using IE < 9
+     * Check if we need to remove Cache-Control for SSL encrypted downloads when using IE < 9.
      *
      * @link http://support.microsoft.com/kb/323308
      */
     protected function ensureIEOverSSLCompatibility(Request $request)
     {
         if (false !== stripos($this->headers->get('Content-Disposition'), 'attachment') && preg_match('/MSIE (.*?);/i', $request->server->get('HTTP_USER_AGENT'), $match) == 1 && true === $request->isSecure()) {
-            if (intval(preg_replace("/(MSIE )(.*?);/", "$2", $match[0])) < 9) {
+            if ((int) preg_replace('/(MSIE )(.*?);/', '$2', $match[0]) < 9) {
                 $this->headers->remove('Cache-Control');
             }
         }
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/ResponseHeaderBag.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/ResponseHeaderBag.php
@@ -15,16 +15,14 @@ namespace Symfony\Component\HttpFoundation;
  * ResponseHeaderBag is a container for Response HTTP headers.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class ResponseHeaderBag extends HeaderBag
 {
-    const COOKIES_FLAT           = 'flat';
-    const COOKIES_ARRAY          = 'array';
+    const COOKIES_FLAT = 'flat';
+    const COOKIES_ARRAY = 'array';
 
     const DISPOSITION_ATTACHMENT = 'attachment';
-    const DISPOSITION_INLINE     = 'inline';
+    const DISPOSITION_INLINE = 'inline';
 
     /**
      * @var array
@@ -34,19 +32,17 @@ class ResponseHeaderBag extends HeaderBag
     /**
      * @var array
      */
-    protected $cookies              = array();
+    protected $cookies = array();
 
     /**
      * @var array
      */
-    protected $headerNames          = array();
+    protected $headerNames = array();
 
     /**
      * Constructor.
      *
      * @param array $headers An array of HTTP headers
-     *
-     * @api
      */
     public function __construct(array $headers = array())
     {
@@ -84,8 +80,6 @@ class ResponseHeaderBag extends HeaderBag
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function replace(array $headers = array())
     {
@@ -100,8 +94,6 @@ class ResponseHeaderBag extends HeaderBag
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function set($key, $values, $replace = true)
     {
@@ -121,8 +113,6 @@ class ResponseHeaderBag extends HeaderBag
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function remove($key)
     {
@@ -156,8 +146,6 @@ class ResponseHeaderBag extends HeaderBag
      * Sets a cookie.
      *
      * @param Cookie $cookie
-     *
-     * @api
      */
     public function setCookie(Cookie $cookie)
     {
@@ -165,13 +153,11 @@ class ResponseHeaderBag extends HeaderBag
     }
 
     /**
-     * Removes a cookie from the array, but does not unset it in the browser
+     * Removes a cookie from the array, but does not unset it in the browser.
      *
      * @param string $name
      * @param string $path
      * @param string $domain
-     *
-     * @api
      */
     public function removeCookie($name, $path = '/', $domain = null)
     {
@@ -191,15 +177,13 @@ class ResponseHeaderBag extends HeaderBag
     }
 
     /**
-     * Returns an array with all cookies
+     * Returns an array with all cookies.
      *
      * @param string $format
      *
      * @throws \InvalidArgumentException When the $format is invalid
      *
      * @return array
-     *
-     * @api
      */
     public function getCookies($format = self::COOKIES_FLAT)
     {
@@ -224,13 +208,11 @@ class ResponseHeaderBag extends HeaderBag
     }
 
     /**
-     * Clears a cookie in the browser
+     * Clears a cookie in the browser.
      *
      * @param string $name
      * @param string $path
      * @param string $domain
-     *
-     * @api
      */
     public function clearCookie($name, $path = '/', $domain = null)
     {
@@ -249,6 +231,7 @@ class ResponseHeaderBag extends HeaderBag
      * @return string A string suitable for use as a Content-Disposition field-value.
      *
      * @throws \InvalidArgumentException
+     *
      * @see RFC 6266
      */
     public function makeDisposition($disposition, $filename, $filenameFallback = '')
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/ServerBag.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/ServerBag.php
@@ -75,6 +75,13 @@ class ServerBag extends ParameterBag
                     // In some circumstances PHP_AUTH_DIGEST needs to be set
                     $headers['PHP_AUTH_DIGEST'] = $authorizationHeader;
                     $this->parameters['PHP_AUTH_DIGEST'] = $authorizationHeader;
+                } elseif (0 === stripos($authorizationHeader, 'bearer ')) {
+                    /*
+                     * XXX: Since there is no PHP_AUTH_BEARER in PHP predefined variables,
+                     *      I'll just set $headers['AUTHORIZATION'] here.
+                     *      http://php.net/manual/en/reserved.variables.server.php
+                     */
+                    $headers['AUTHORIZATION'] = $authorizationHeader;
                 }
             }
         }
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBag.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBag.php
@@ -12,7 +12,7 @@
 namespace Symfony\Component\HttpFoundation\Session\Attribute;
 
 /**
- * This class relates to session attribute storage
+ * This class relates to session attribute storage.
  */
 class AttributeBag implements AttributeBagInterface, \IteratorAggregate, \Countable
 {
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBagInterface.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBagInterface.php
@@ -25,7 +25,7 @@ interface AttributeBagInterface extends SessionBagInterface
      *
      * @param string $name The attribute name
      *
-     * @return bool    true if the attribute is defined, false otherwise
+     * @return bool true if the attribute is defined, false otherwise
      */
     public function has($name);
 
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/NamespacedAttributeBag.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/NamespacedAttributeBag.php
@@ -43,6 +43,7 @@ class NamespacedAttributeBag extends AttributeBag
      */
     public function has($name)
     {
+        // reference mismatch: if fixed, re-introduced in array_key_exists; keep as it is
         $attributes = $this->resolveAttributePath($name);
         $name = $this->resolveKey($name);
 
@@ -58,6 +59,7 @@ class NamespacedAttributeBag extends AttributeBag
      */
     public function get($name, $default = null)
     {
+        // reference mismatch: if fixed, re-introduced in array_key_exists; keep as it is
         $attributes = $this->resolveAttributePath($name);
         $name = $this->resolveKey($name);
 
@@ -73,7 +75,7 @@ class NamespacedAttributeBag extends AttributeBag
      */
     public function set($name, $value)
     {
-        $attributes = & $this->resolveAttributePath($name, true);
+        $attributes = &$this->resolveAttributePath($name, true);
         $name = $this->resolveKey($name);
         $attributes[$name] = $value;
     }
@@ -84,7 +86,7 @@ class NamespacedAttributeBag extends AttributeBag
     public function remove($name)
     {
         $retval = null;
-        $attributes = & $this->resolveAttributePath($name);
+        $attributes = &$this->resolveAttributePath($name);
         $name = $this->resolveKey($name);
         if (null !== $attributes && array_key_exists($name, $attributes)) {
             $retval = $attributes[$name];
@@ -99,14 +101,14 @@ class NamespacedAttributeBag extends AttributeBag
      *
      * This method allows structured namespacing of session attributes.
      *
-     * @param string  $name         Key name
-     * @param bool    $writeContext Write context, default false
+     * @param string $name         Key name
+     * @param bool   $writeContext Write context, default false
      *
      * @return array
      */
     protected function &resolveAttributePath($name, $writeContext = false)
     {
-        $array = & $this->attributes;
+        $array = &$this->attributes;
         $name = (strpos($name, $this->namespaceCharacter) === 0) ? substr($name, 1) : $name;
 
         // Check if there is anything to do, else return
@@ -125,14 +127,14 @@ class NamespacedAttributeBag extends AttributeBag
             return $array;
         }
 
-        unset($parts[count($parts)-1]);
+        unset($parts[count($parts) - 1]);
 
         foreach ($parts as $part) {
             if (null !== $array && !array_key_exists($part, $array)) {
                 $array[$part] = $writeContext ? array() : null;
             }
 
-            $array = & $array[$part];
+            $array = &$array[$part];
         }
 
         return $array;
@@ -150,7 +152,7 @@ class NamespacedAttributeBag extends AttributeBag
     protected function resolveKey($name)
     {
         if (strpos($name, $this->namespaceCharacter) !== false) {
-            $name = substr($name, strrpos($name, $this->namespaceCharacter)+1, strlen($name));
+            $name = substr($name, strrpos($name, $this->namespaceCharacter) + 1, strlen($name));
         }
 
         return $name;
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Flash/AutoExpireFlashBag.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Flash/AutoExpireFlashBag.php
@@ -28,7 +28,7 @@ class AutoExpireFlashBag implements FlashBagInterface
     private $flashes = array();
 
     /**
-     * The storage key for flashes in the session
+     * The storage key for flashes in the session.
      *
      * @var string
      */
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Flash/FlashBag.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Flash/FlashBag.php
@@ -28,7 +28,7 @@ class FlashBag implements FlashBagInterface, \IteratorAggregate
     private $flashes = array();
 
     /**
-     * The storage key for flashes in the session
+     * The storage key for flashes in the session.
      *
      * @var string
      */
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Session.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Session.php
@@ -23,8 +23,6 @@ use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;
  *
  * @author Fabien Potencier <fabien@symfony.com>
  * @author Drak <drak@zikula.org>
- *
- * @api
  */
 class Session implements SessionInterface, \IteratorAggregate, \Countable
 {
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/SessionBagInterface.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/SessionBagInterface.php
@@ -19,14 +19,14 @@ namespace Symfony\Component\HttpFoundation\Session;
 interface SessionBagInterface
 {
     /**
-     * Gets this bag's name
+     * Gets this bag's name.
      *
      * @return string
      */
     public function getName();
 
     /**
-     * Initializes the Bag
+     * Initializes the Bag.
      *
      * @param array $array
      */
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/SessionInterface.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/SessionInterface.php
@@ -23,11 +23,9 @@ interface SessionInterface
     /**
      * Starts the session storage.
      *
-     * @return bool    True if session started.
+     * @return bool True if session started.
      *
      * @throws \RuntimeException If session fails to start.
-     *
-     * @api
      */
     public function start();
 
@@ -35,17 +33,13 @@ interface SessionInterface
      * Returns the session ID.
      *
      * @return string The session ID.
-     *
-     * @api
      */
     public function getId();
 
     /**
-     * Sets the session ID
+     * Sets the session ID.
      *
      * @param string $id
-     *
-     * @api
      */
     public function setId($id);
 
@@ -53,8 +47,6 @@ interface SessionInterface
      * Returns the session name.
      *
      * @return mixed The session name.
-     *
-     * @api
      */
     public function getName();
 
@@ -62,8 +54,6 @@ interface SessionInterface
      * Sets the session name.
      *
      * @param string $name
-     *
-     * @api
      */
     public function setName($name);
 
@@ -73,14 +63,12 @@ interface SessionInterface
      * Clears all session attributes and flashes and regenerates the
      * session and deletes the old session from persistence.
      *
-     * @param int     $lifetime Sets the cookie lifetime for the session cookie. A null value
-     *                          will leave the system settings unchanged, 0 sets the cookie
-     *                          to expire with browser session. Time is in seconds, and is
-     *                          not a Unix timestamp.
-     *
-     * @return bool    True if session invalidated, false if error.
+     * @param int $lifetime Sets the cookie lifetime for the session cookie. A null value
+     *                      will leave the system settings unchanged, 0 sets the cookie
+     *                      to expire with browser session. Time is in seconds, and is
+     *                      not a Unix timestamp.
      *
-     * @api
+     * @return bool True if session invalidated, false if error.
      */
     public function invalidate($lifetime = null);
 
@@ -88,15 +76,13 @@ interface SessionInterface
      * Migrates the current session to a new session id while maintaining all
      * session attributes.
      *
-     * @param bool    $destroy  Whether to delete the old session or leave it to garbage collection.
-     * @param int     $lifetime Sets the cookie lifetime for the session cookie. A null value
-     *                          will leave the system settings unchanged, 0 sets the cookie
-     *                          to expire with browser session. Time is in seconds, and is
-     *                          not a Unix timestamp.
-     *
-     * @return bool    True if session migrated, false if error.
+     * @param bool $destroy  Whether to delete the old session or leave it to garbage collection.
+     * @param int  $lifetime Sets the cookie lifetime for the session cookie. A null value
+     *                       will leave the system settings unchanged, 0 sets the cookie
+     *                       to expire with browser session. Time is in seconds, and is
+     *                       not a Unix timestamp.
      *
-     * @api
+     * @return bool True if session migrated, false if error.
      */
     public function migrate($destroy = false, $lifetime = null);
 
@@ -114,9 +100,7 @@ interface SessionInterface
      *
      * @param string $name The attribute name
      *
-     * @return bool    true if the attribute is defined, false otherwise
-     *
-     * @api
+     * @return bool true if the attribute is defined, false otherwise
      */
     public function has($name);
 
@@ -127,8 +111,6 @@ interface SessionInterface
      * @param mixed  $default The default value if not found.
      *
      * @return mixed
-     *
-     * @api
      */
     public function get($name, $default = null);
 
@@ -137,8 +119,6 @@ interface SessionInterface
      *
      * @param string $name
      * @param mixed  $value
-     *
-     * @api
      */
     public function set($name, $value);
 
@@ -146,8 +126,6 @@ interface SessionInterface
      * Returns attributes.
      *
      * @return array Attributes
-     *
-     * @api
      */
     public function all();
 
@@ -164,15 +142,11 @@ interface SessionInterface
      * @param string $name
      *
      * @return mixed The removed value
-     *
-     * @api
      */
     public function remove($name);
 
     /**
      * Clears all attributes.
-     *
-     * @api
      */
     public function clear();
 
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcacheSessionHandler.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcacheSessionHandler.php
@@ -24,7 +24,7 @@ class MemcacheSessionHandler implements \SessionHandlerInterface
     private $memcache;
 
     /**
-     * @var int     Time to live in seconds
+     * @var int Time to live in seconds
      */
     private $ttl;
 
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcachedSessionHandler.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcachedSessionHandler.php
@@ -29,7 +29,7 @@ class MemcachedSessionHandler implements \SessionHandlerInterface
     private $memcached;
 
     /**
-     * @var int     Time to live in seconds
+     * @var int Time to live in seconds
      */
     private $ttl;
 
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MongoDbSessionHandler.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MongoDbSessionHandler.php
@@ -12,7 +12,7 @@
 namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
 
 /**
- * MongoDB session handler
+ * MongoDB session handler.
  *
  * @author Markus Bachmann <markus.bachmann@bachi.biz>
  */
@@ -42,6 +42,24 @@ class MongoDbSessionHandler implements \SessionHandlerInterface
      *  * id_field: The field name for storing the session id [default: _id]
      *  * data_field: The field name for storing the session data [default: data]
      *  * time_field: The field name for storing the timestamp [default: time]
+     *  * expiry_field: The field name for storing the expiry-timestamp [default: expires_at]
+     *
+     * It is strongly recommended to put an index on the `expiry_field` for
+     * garbage-collection. Alternatively it's possible to automatically expire
+     * the sessions in the database as described below:
+     *
+     * A TTL collections can be used on MongoDB 2.2+ to cleanup expired sessions
+     * automatically. Such an index can for example look like this:
+     *
+     *     db.<session-collection>.ensureIndex(
+     *         { "<expiry-field>": 1 },
+     *         { "expireAfterSeconds": 0 }
+     *     )
+     *
+     * More details on: http://docs.mongodb.org/manual/tutorial/expire-data/
+     *
+     * If you use such an index, you can drop `gc_probability` to 0 since
+     * no garbage-collection is required.
      *
      * @param \Mongo|\MongoClient $mongo   A MongoClient or Mongo instance
      * @param array               $options An associative array of field options
@@ -62,9 +80,10 @@ class MongoDbSessionHandler implements \SessionHandlerInterface
         $this->mongo = $mongo;
 
         $this->options = array_merge(array(
-            'id_field'   => '_id',
+            'id_field' => '_id',
             'data_field' => 'data',
             'time_field' => 'time',
+            'expiry_field' => 'expires_at',
         ), $options);
     }
 
@@ -101,18 +120,8 @@ class MongoDbSessionHandler implements \SessionHandlerInterface
      */
     public function gc($maxlifetime)
     {
-        /* Note: MongoDB 2.2+ supports TTL collections, which may be used in
-         * place of this method by indexing the "time_field" field with an
-         * "expireAfterSeconds" option. Regardless of whether TTL collections
-         * are used, consider indexing this field to make the remove query more
-         * efficient.
-         *
-         * See: http://docs.mongodb.org/manual/tutorial/expire-data/
-         */
-        $time = new \MongoDate(time() - $maxlifetime);
-
         $this->getCollection()->remove(array(
-            $this->options['time_field'] => array('$lt' => $time),
+            $this->options['expiry_field'] => array('$lt' => new \MongoDate()),
         ));
 
         return true;
@@ -123,12 +132,17 @@ class MongoDbSessionHandler implements \SessionHandlerInterface
      */
     public function write($sessionId, $data)
     {
+        $expiry = new \MongoDate(time() + (int) ini_get('session.gc_maxlifetime'));
+
+        $fields = array(
+            $this->options['data_field'] => new \MongoBinData($data, \MongoBinData::BYTE_ARRAY),
+            $this->options['time_field'] => new \MongoDate(),
+            $this->options['expiry_field'] => $expiry,
+        );
+
         $this->getCollection()->update(
             array($this->options['id_field'] => $sessionId),
-            array('$set' => array(
-                $this->options['data_field'] => new \MongoBinData($data, \MongoBinData::BYTE_ARRAY),
-                $this->options['time_field'] => new \MongoDate(),
-            )),
+            array('$set' => $fields),
             array('upsert' => true, 'multiple' => false)
         );
 
@@ -142,13 +156,14 @@ class MongoDbSessionHandler implements \SessionHandlerInterface
     {
         $dbData = $this->getCollection()->findOne(array(
             $this->options['id_field'] => $sessionId,
+            $this->options['expiry_field'] => array('$gte' => new \MongoDate()),
         ));
 
         return null === $dbData ? '' : $dbData[$this->options['data_field']]->bin;
     }
 
     /**
-     * Return a "MongoCollection" instance
+     * Return a "MongoCollection" instance.
      *
      * @return \MongoCollection
      */
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeSessionHandler.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeSessionHandler.php
@@ -11,13 +11,9 @@
 
 namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
 
-/**
- * Adds SessionHandler functionality if available.
- *
- * @see http://php.net/sessionhandler
- */
-
-if (version_compare(phpversion(), '5.4.0', '>=')) {
+// Adds SessionHandler functionality if available.
+// @see http://php.net/sessionhandler
+if (PHP_VERSION_ID >= 50400) {
     class NativeSessionHandler extends \SessionHandler
     {
     }
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/NullSessionHandler.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/NullSessionHandler.php
@@ -17,8 +17,6 @@ namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
  * Can be used in unit testing or in a situations where persisted sessions are not desired.
  *
  * @author Drak <drak@zikula.org>
- *
- * @api
  */
 class NullSessionHandler implements \SessionHandlerInterface
 {
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php
@@ -75,7 +75,7 @@ class PdoSessionHandler implements \SessionHandlerInterface
         }
         $this->pdo = $pdo;
         $dbOptions = array_merge(array(
-            'db_id_col'   => 'sess_id',
+            'db_id_col' => 'sess_id',
             'db_data_col' => 'sess_data',
             'db_time_col' => 'sess_time',
         ), $dbOptions);
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MetadataBag.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MetadataBag.php
@@ -87,10 +87,10 @@ class MetadataBag implements SessionBagInterface
     /**
      * Stamps a new session's metadata.
      *
-     * @param int     $lifetime Sets the cookie lifetime for the session cookie. A null value
-     *                          will leave the system settings unchanged, 0 sets the cookie
-     *                          to expire with browser session. Time is in seconds, and is
-     *                          not a Unix timestamp.
+     * @param int $lifetime Sets the cookie lifetime for the session cookie. A null value
+     *                      will leave the system settings unchanged, 0 sets the cookie
+     *                      to expire with browser session. Time is in seconds, and is
+     *                      not a Unix timestamp.
      */
     public function stampNew($lifetime = null)
     {
@@ -108,7 +108,7 @@ class MetadataBag implements SessionBagInterface
     /**
      * Gets the created timestamp metadata.
      *
-     * @return int     Unix timestamp
+     * @return int Unix timestamp
      */
     public function getCreated()
     {
@@ -118,7 +118,7 @@ class MetadataBag implements SessionBagInterface
     /**
      * Gets the last used metadata.
      *
-     * @return int     Unix timestamp
+     * @return int Unix timestamp
      */
     public function getLastUsed()
     {
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MockArraySessionStorage.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MockArraySessionStorage.php
@@ -89,7 +89,7 @@ class MockArraySessionStorage implements SessionStorageInterface
      */
     public function start()
     {
-        if ($this->started && !$this->closed) {
+        if ($this->started) {
             return true;
         }
 
@@ -159,7 +159,7 @@ class MockArraySessionStorage implements SessionStorageInterface
     public function save()
     {
         if (!$this->started || $this->closed) {
-            throw new \RuntimeException("Trying to save a session that was not started yet or was already closed");
+            throw new \RuntimeException('Trying to save a session that was not started yet or was already closed');
         }
         // nothing to do since we don't persist the session data
         $this->closed = false;
@@ -249,7 +249,7 @@ class MockArraySessionStorage implements SessionStorageInterface
      */
     protected function generateId()
     {
-        return sha1(uniqid(mt_rand()));
+        return sha1(uniqid('ss_mock_', true));
     }
 
     protected function loadSession()
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MockFileSessionStorage.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MockFileSessionStorage.php
@@ -93,7 +93,7 @@ class MockFileSessionStorage extends MockArraySessionStorage
     public function save()
     {
         if (!$this->started) {
-            throw new \RuntimeException("Trying to save a session that was not started yet or was already closed");
+            throw new \RuntimeException('Trying to save a session that was not started yet or was already closed');
         }
 
         file_put_contents($this->getFilePath(), serialize($this->data));
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php
@@ -25,7 +25,7 @@ use Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy;
 class NativeSessionStorage implements SessionStorageInterface
 {
     /**
-     * Array of SessionBagInterface
+     * Array of SessionBagInterface.
      *
      * @var SessionBagInterface[]
      */
@@ -58,13 +58,14 @@ class NativeSessionStorage implements SessionStorageInterface
      * want to override this constructor entirely.
      *
      * List of options for $options array with their defaults.
+     *
      * @see http://php.net/session.configuration for options
      * but we omit 'session.' from the beginning of the keys for convenience.
      *
      * ("auto_start", is not supported as it tells PHP to start a session before
      * PHP starts to execute user-land code. Setting during runtime has no effect).
      *
-     * cache_limiter, "nocache" (use "0" to prevent headers from being sent entirely).
+     * cache_limiter, "" (use "0" to prevent headers from being sent entirely).
      * cookie_domain, ""
      * cookie_httponly, ""
      * cookie_lifetime, "0"
@@ -100,7 +101,7 @@ class NativeSessionStorage implements SessionStorageInterface
         session_cache_limiter(''); // disable by default because it's managed by HeaderBag (if used)
         ini_set('session.use_cookies', 1);
 
-        if (version_compare(phpversion(), '5.4.0', '>=')) {
+        if (PHP_VERSION_ID >= 50400) {
             session_register_shutdown();
         } else {
             register_shutdown_function('session_write_close');
@@ -126,15 +127,15 @@ class NativeSessionStorage implements SessionStorageInterface
      */
     public function start()
     {
-        if ($this->started && !$this->closed) {
+        if ($this->started) {
             return true;
         }
 
-        if (version_compare(phpversion(), '5.4.0', '>=') && \PHP_SESSION_ACTIVE === session_status()) {
+        if (PHP_VERSION_ID >= 50400 && \PHP_SESSION_ACTIVE === session_status()) {
             throw new \RuntimeException('Failed to start the session: already started by PHP.');
         }
 
-        if (version_compare(phpversion(), '5.4.0', '<') && isset($_SESSION) && session_id()) {
+        if (PHP_VERSION_ID < 50400 && !$this->closed && isset($_SESSION) && session_id()) {
             // not 100% fool-proof, but is the most reliable way to determine if a session is active in PHP 5.3
             throw new \RuntimeException('Failed to start the session: already started by PHP ($_SESSION is set).');
         }
@@ -162,10 +163,6 @@ class NativeSessionStorage implements SessionStorageInterface
      */
     public function getId()
     {
-        if (!$this->started && !$this->closed) {
-            return ''; // returning empty is consistent with session_id() behaviour
-        }
-
         return $this->saveHandler->getId();
     }
 
@@ -198,6 +195,16 @@ class NativeSessionStorage implements SessionStorageInterface
      */
     public function regenerate($destroy = false, $lifetime = null)
     {
+        // Cannot regenerate the session ID for non-active sessions.
+        if (PHP_VERSION_ID >= 50400 && \PHP_SESSION_ACTIVE !== session_status()) {
+            return false;
+        }
+
+        // Check if session ID exists in PHP 5.3
+        if (PHP_VERSION_ID < 50400 && '' === session_id()) {
+            return false;
+        }
+
         if (null !== $lifetime) {
             ini_set('session.cookie_lifetime', $lifetime);
         }
@@ -206,23 +213,13 @@ class NativeSessionStorage implements SessionStorageInterface
             $this->metadataBag->stampNew();
         }
 
-        $ret = session_regenerate_id($destroy);
+        $isRegenerated = session_regenerate_id($destroy);
 
-        // workaround for https://bugs.php.net/bug.php?id=61470 as suggested by David Grudl
-        if ('files' === $this->getSaveHandler()->getSaveHandlerName()) {
-            session_write_close();
-            if (isset($_SESSION)) {
-                $backup = $_SESSION;
-                session_start();
-                $_SESSION = $backup;
-            } else {
-                session_start();
-            }
-
-            $this->loadSession();
-        }
+        // The reference to $_SESSION in session bags is lost in PHP7 and we need to re-create it.
+        // @see https://bugs.php.net/bug.php?id=70013
+        $this->loadSession();
 
-        return $ret;
+        return $isRegenerated;
     }
 
     /**
@@ -382,13 +379,13 @@ class NativeSessionStorage implements SessionStorageInterface
         if (!$saveHandler instanceof AbstractProxy && $saveHandler instanceof \SessionHandlerInterface) {
             $saveHandler = new SessionHandlerProxy($saveHandler);
         } elseif (!$saveHandler instanceof AbstractProxy) {
-            $saveHandler = version_compare(phpversion(), '5.4.0', '>=') ?
+            $saveHandler = PHP_VERSION_ID >= 50400 ?
                 new SessionHandlerProxy(new \SessionHandler()) : new NativeProxy();
         }
         $this->saveHandler = $saveHandler;
 
         if ($this->saveHandler instanceof \SessionHandlerInterface) {
-            if (version_compare(phpversion(), '5.4.0', '>=')) {
+            if (PHP_VERSION_ID >= 50400) {
                 session_set_save_handler($this->saveHandler, false);
             } else {
                 session_set_save_handler(
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/PhpBridgeSessionStorage.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/PhpBridgeSessionStorage.php
@@ -15,7 +15,7 @@ use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy;
 use Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeSessionHandler;
 
 /**
- * Allows session to be started by PHP and managed by Symfony2
+ * Allows session to be started by PHP and managed by Symfony.
  *
  * @author Drak <drak@zikula.org>
  */
@@ -38,7 +38,7 @@ class PhpBridgeSessionStorage extends NativeSessionStorage
      */
     public function start()
     {
-        if ($this->started && !$this->closed) {
+        if ($this->started) {
             return true;
         }
 
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/AbstractProxy.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/AbstractProxy.php
@@ -72,7 +72,7 @@ abstract class AbstractProxy
      */
     public function isActive()
     {
-        if (version_compare(phpversion(), '5.4.0', '>=')) {
+        if (PHP_VERSION_ID >= 50400) {
             return $this->active = \PHP_SESSION_ACTIVE === session_status();
         }
 
@@ -87,13 +87,13 @@ abstract class AbstractProxy
      *
      * @internal
      *
-     * @param bool    $flag
+     * @param bool $flag
      *
      * @throws \LogicException
      */
     public function setActive($flag)
     {
-        if (version_compare(phpversion(), '5.4.0', '>=')) {
+        if (PHP_VERSION_ID >= 50400) {
             throw new \LogicException('This method is disabled in PHP 5.4.0+');
         }
 
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/NativeProxy.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/NativeProxy.php
@@ -32,7 +32,7 @@ class NativeProxy extends AbstractProxy
     /**
      * Returns true if this handler wraps an internal PHP session save handler using \SessionHandler.
      *
-     * @return bool    False.
+     * @return bool False.
      */
     public function isWrapper()
     {
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/SessionStorageInterface.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/SessionStorageInterface.php
@@ -18,8 +18,6 @@ use Symfony\Component\HttpFoundation\Session\SessionBagInterface;
  *
  * @author Fabien Potencier <fabien@symfony.com>
  * @author Drak <drak@zikula.org>
- *
- * @api
  */
 interface SessionStorageInterface
 {
@@ -28,52 +26,42 @@ interface SessionStorageInterface
      *
      * @throws \RuntimeException If something goes wrong starting the session.
      *
-     * @return bool    True if started.
-     *
-     * @api
+     * @return bool True if started.
      */
     public function start();
 
     /**
      * Checks if the session is started.
      *
-     * @return bool    True if started, false otherwise.
+     * @return bool True if started, false otherwise.
      */
     public function isStarted();
 
     /**
-     * Returns the session ID
+     * Returns the session ID.
      *
      * @return string The session ID or empty.
-     *
-     * @api
      */
     public function getId();
 
     /**
-     * Sets the session ID
+     * Sets the session ID.
      *
      * @param string $id
-     *
-     * @api
      */
     public function setId($id);
 
     /**
-     * Returns the session name
+     * Returns the session name.
      *
      * @return mixed The session name.
-     *
-     * @api
      */
     public function getName();
 
     /**
-     * Sets the session name
+     * Sets the session name.
      *
      * @param string $name
-     *
-     * @api
      */
     public function setName($name);
 
@@ -88,17 +76,23 @@ interface SessionStorageInterface
      * Note regenerate+destroy should not clear the session data in memory
      * only delete the session data from persistent storage.
      *
-     * @param bool    $destroy  Destroy session when regenerating?
-     * @param int     $lifetime Sets the cookie lifetime for the session cookie. A null value
-     *                          will leave the system settings unchanged, 0 sets the cookie
-     *                          to expire with browser session. Time is in seconds, and is
-     *                          not a Unix timestamp.
+     * Care: When regenerating the session ID no locking is involved in PHPs
+     * session design. See https://bugs.php.net/bug.php?id=61470 for a discussion.
+     * So you must make sure the regenerated session is saved BEFORE sending the
+     * headers with the new ID. Symfonys HttpKernel offers a listener for this.
+     * See Symfony\Component\HttpKernel\EventListener\SaveSessionListener.
+     * Otherwise session data could get lost again for concurrent requests with the
+     * new ID. One result could be that you get logged out after just logging in.
      *
-     * @return bool    True if session regenerated, false if error
+     * @param bool $destroy  Destroy session when regenerating?
+     * @param int  $lifetime Sets the cookie lifetime for the session cookie. A null value
+     *                       will leave the system settings unchanged, 0 sets the cookie
+     *                       to expire with browser session. Time is in seconds, and is
+     *                       not a Unix timestamp.
      *
-     * @throws \RuntimeException If an error occurs while regenerating this storage
+     * @return bool True if session regenerated, false if error
      *
-     * @api
+     * @throws \RuntimeException If an error occurs while regenerating this storage
      */
     public function regenerate($destroy = false, $lifetime = null);
 
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/StreamedResponse.php
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/StreamedResponse.php
@@ -23,8 +23,6 @@ namespace Symfony\Component\HttpFoundation;
  * @see flush()
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class StreamedResponse extends Response
 {
@@ -34,11 +32,9 @@ class StreamedResponse extends Response
     /**
      * Constructor.
      *
-     * @param mixed   $callback A valid PHP callback
-     * @param int     $status   The response status code
-     * @param array   $headers  An array of response headers
-     *
-     * @api
+     * @param mixed $callback A valid PHP callback
+     * @param int   $status   The response status code
+     * @param array $headers  An array of response headers
      */
     public function __construct($callback = null, $status = 200, $headers = array())
     {
--- a/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/composer.json
+++ b/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/composer.json
@@ -3,7 +3,7 @@
     "type": "library",
     "description": "Symfony HttpFoundation Component",
     "keywords": [],
-    "homepage": "http://symfony.com",
+    "homepage": "https://symfony.com",
     "license": "MIT",
     "authors": [
         {
@@ -12,7 +12,7 @@
         },
         {
             "name": "Symfony Community",
-            "homepage": "http://symfony.com/contributors"
+            "homepage": "https://symfony.com/contributors"
         }
     ],
     "require": {
@@ -20,7 +20,10 @@
     },
     "autoload": {
         "psr-0": { "Symfony\\Component\\HttpFoundation\\": "" },
-        "classmap": [ "Symfony/Component/HttpFoundation/Resources/stubs" ]
+        "classmap": [ "Symfony/Component/HttpFoundation/Resources/stubs" ],
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
     },
     "target-dir": "Symfony/Component/HttpFoundation",
     "minimum-stability": "dev",
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Bundle/Bundle.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Bundle/Bundle.php
@@ -23,8 +23,6 @@ use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
  * for DependencyInjection extensions and Console commands.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 abstract class Bundle extends ContainerAware implements BundleInterface
 {
@@ -66,8 +64,6 @@ abstract class Bundle extends ContainerAware implements BundleInterface
      * @return ExtensionInterface|null The container extension
      *
      * @throws \LogicException
-     *
-     * @api
      */
     public function getContainerExtension()
     {
@@ -78,6 +74,10 @@ abstract class Bundle extends ContainerAware implements BundleInterface
             if (class_exists($class)) {
                 $extension = new $class();
 
+                if (!$extension instanceof ExtensionInterface) {
+                    throw new \LogicException(sprintf('Extension %s must implement Symfony\Component\DependencyInjection\Extension\ExtensionInterface.', $class));
+                }
+
                 // check naming convention
                 $expectedAlias = Container::underscore($basename);
                 if ($expectedAlias != $extension->getAlias()) {
@@ -104,8 +104,6 @@ abstract class Bundle extends ContainerAware implements BundleInterface
      * Gets the Bundle namespace.
      *
      * @return string The Bundle namespace
-     *
-     * @api
      */
     public function getNamespace()
     {
@@ -120,8 +118,6 @@ abstract class Bundle extends ContainerAware implements BundleInterface
      * Gets the Bundle directory path.
      *
      * @return string The Bundle absolute path
-     *
-     * @api
      */
     public function getPath()
     {
@@ -136,8 +132,6 @@ abstract class Bundle extends ContainerAware implements BundleInterface
      * Returns the bundle parent name.
      *
      * @return string The Bundle parent name it overrides or null if no parent
-     *
-     * @api
      */
     public function getParent()
     {
@@ -147,8 +141,6 @@ abstract class Bundle extends ContainerAware implements BundleInterface
      * Returns the bundle name (the class short name).
      *
      * @return string The Bundle name
-     *
-     * @api
      */
     final public function getName()
     {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Bundle/BundleInterface.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Bundle/BundleInterface.php
@@ -19,22 +19,16 @@ use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
  * BundleInterface.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 interface BundleInterface extends ContainerAwareInterface
 {
     /**
      * Boots the Bundle.
-     *
-     * @api
      */
     public function boot();
 
     /**
      * Shutdowns the Bundle.
-     *
-     * @api
      */
     public function shutdown();
 
@@ -44,8 +38,6 @@ interface BundleInterface extends ContainerAwareInterface
      * It is only ever called once when the cache is empty.
      *
      * @param ContainerBuilder $container A ContainerBuilder instance
-     *
-     * @api
      */
     public function build(ContainerBuilder $container);
 
@@ -53,8 +45,6 @@ interface BundleInterface extends ContainerAwareInterface
      * Returns the container extension that should be implicitly loaded.
      *
      * @return ExtensionInterface|null The default extension or null if there is none
-     *
-     * @api
      */
     public function getContainerExtension();
 
@@ -66,8 +56,6 @@ interface BundleInterface extends ContainerAwareInterface
      * bundle.
      *
      * @return string The Bundle name it overrides or null if no parent
-     *
-     * @api
      */
     public function getParent();
 
@@ -75,8 +63,6 @@ interface BundleInterface extends ContainerAwareInterface
      * Returns the bundle name (the class short name).
      *
      * @return string The Bundle name
-     *
-     * @api
      */
     public function getName();
 
@@ -84,8 +70,6 @@ interface BundleInterface extends ContainerAwareInterface
      * Gets the Bundle namespace.
      *
      * @return string The Bundle namespace
-     *
-     * @api
      */
     public function getNamespace();
 
@@ -95,8 +79,6 @@ interface BundleInterface extends ContainerAwareInterface
      * The path should always be returned as a Unix path (with /).
      *
      * @return string The Bundle absolute path
-     *
-     * @api
      */
     public function getPath();
 }
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/CacheClearer/ChainCacheClearer.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/CacheClearer/ChainCacheClearer.php
@@ -19,7 +19,7 @@ namespace Symfony\Component\HttpKernel\CacheClearer;
 class ChainCacheClearer implements CacheClearerInterface
 {
     /**
-     * @var array $clearers
+     * @var array
      */
     protected $clearers;
 
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerAggregate.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerAggregate.php
@@ -51,7 +51,7 @@ class CacheWarmerAggregate implements CacheWarmerInterface
     /**
      * Checks whether this warmer is optional or not.
      *
-     * @return bool    always false
+     * @return bool always false
      */
     public function isOptional()
     {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerInterface.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerInterface.php
@@ -26,7 +26,7 @@ interface CacheWarmerInterface extends WarmableInterface
      * A warmer should return true if the cache can be
      * generated incrementally and on-demand.
      *
-     * @return bool    true if the warmer is optional, false otherwise
+     * @return bool true if the warmer is optional, false otherwise
      */
     public function isOptional();
 }
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Client.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Client.php
@@ -25,8 +25,6 @@ use Symfony\Component\HttpFoundation\Response;
  * Client simulates a browser and makes requests to a Kernel object.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class Client extends BaseClient
 {
@@ -102,10 +100,13 @@ class Client extends BaseClient
         $r = new \ReflectionClass('\\Symfony\\Component\\ClassLoader\\ClassLoader');
         $requirePath = str_replace("'", "\\'", $r->getFileName());
         $symfonyPath = str_replace("'", "\\'", realpath(__DIR__.'/../../..'));
+        $errorReporting = error_reporting();
 
         $code = <<<EOF
 <?php
 
+error_reporting($errorReporting & ~E_USER_DEPRECATED);
+
 require_once '$requirePath';
 
 \$loader = new Symfony\Component\ClassLoader\ClassLoader();
@@ -159,7 +160,7 @@ EOF;
      * If the size of a file is greater than the allowed size (from php.ini) then
      * an invalid UploadedFile is returned with an error set to UPLOAD_ERR_INI_SIZE.
      *
-     * @see Symfony\Component\HttpFoundation\File\UploadedFile
+     * @see UploadedFile
      *
      * @param array $files An array of files
      *
--- /dev/null
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Config/EnvParametersResource.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\HttpKernel\Config;
+
+use Symfony\Component\Config\Resource\ResourceInterface;
+
+/**
+ * EnvParametersResource represents resources stored in prefixed environment variables.
+ *
+ * @author Chris Wilkinson <chriswilkinson84@gmail.com>
+ */
+class EnvParametersResource implements ResourceInterface, \Serializable
+{
+    /**
+     * @var string
+     */
+    private $prefix;
+
+    /**
+     * @var string
+     */
+    private $variables;
+
+    /**
+     * Constructor.
+     *
+     * @param string $prefix
+     */
+    public function __construct($prefix)
+    {
+        $this->prefix = $prefix;
+        $this->variables = $this->findVariables();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function __toString()
+    {
+        return serialize($this->getResource());
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getResource()
+    {
+        return array('prefix' => $this->prefix, 'variables' => $this->variables);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isFresh($timestamp)
+    {
+        return $this->findVariables() === $this->variables;
+    }
+
+    public function serialize()
+    {
+        return serialize(array('prefix' => $this->prefix, 'variables' => $this->variables));
+    }
+
+    public function unserialize($serialized)
+    {
+        $unserialized = unserialize($serialized);
+
+        $this->prefix = $unserialized['prefix'];
+        $this->variables = $unserialized['variables'];
+    }
+
+    private function findVariables()
+    {
+        $variables = array();
+
+        foreach ($_SERVER as $key => $value) {
+            if (0 === strpos($key, $this->prefix)) {
+                $variables[$key] = $value;
+            }
+        }
+
+        ksort($variables);
+
+        return $variables;
+    }
+}
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Config/FileLocator.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Config/FileLocator.php
@@ -47,7 +47,7 @@ class FileLocator extends BaseFileLocator
      */
     public function locate($file, $currentPath = null, $first = true)
     {
-        if ('@' === $file[0]) {
+        if (isset($file[0]) && '@' === $file[0]) {
             return $this->kernel->locateResource($file, $this->path, $first);
         }
 
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Controller/ControllerReference.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Controller/ControllerReference.php
@@ -11,6 +11,8 @@
 
 namespace Symfony\Component\HttpKernel\Controller;
 
+use Symfony\Component\HttpKernel\Fragment\FragmentRendererInterface;
+
 /**
  * Acts as a marker and a data holder for a Controller.
  *
@@ -20,8 +22,7 @@ namespace Symfony\Component\HttpKernel\Controller;
  *
  * @author Fabien Potencier <fabien@symfony.com>
  *
- * @see Symfony\Component\HttpKernel\FragmentRenderer
- * @see Symfony\Component\HttpKernel\Fragment\FragmentRendererInterface
+ * @see FragmentRendererInterface
  */
 class ControllerReference
 {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Controller/ControllerResolver.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Controller/ControllerResolver.php
@@ -22,8 +22,6 @@ use Symfony\Component\HttpFoundation\Request;
  * the controller method arguments.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class ControllerResolver implements ControllerResolverInterface
 {
@@ -47,12 +45,10 @@ class ControllerResolver implements ControllerResolverInterface
      *
      * @param Request $request A Request instance
      *
-     * @return mixed|bool    A PHP callable representing the Controller,
-     *                       or false if this resolver is not able to determine the controller
+     * @return mixed|bool A PHP callable representing the Controller,
+     *                    or false if this resolver is not able to determine the controller
      *
      * @throws \InvalidArgumentException|\LogicException If the controller can't be found
-     *
-     * @api
      */
     public function getController(Request $request)
     {
@@ -102,8 +98,6 @@ class ControllerResolver implements ControllerResolverInterface
      * @return array
      *
      * @throws \RuntimeException When value for argument given is not provided
-     *
-     * @api
      */
     public function getArguments(Request $request, $controller)
     {
@@ -151,7 +145,7 @@ class ControllerResolver implements ControllerResolverInterface
      *
      * @param string $controller A Controller string
      *
-     * @return mixed A PHP callable
+     * @return callable A PHP callable
      *
      * @throws \InvalidArgumentException
      */
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Controller/ControllerResolverInterface.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Controller/ControllerResolverInterface.php
@@ -22,8 +22,6 @@ use Symfony\Component\HttpFoundation\Request;
  * A Controller can be any valid PHP callable.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 interface ControllerResolverInterface
 {
@@ -38,12 +36,10 @@ interface ControllerResolverInterface
      *
      * @param Request $request A Request instance
      *
-     * @return mixed|bool    A PHP callable representing the Controller,
-     *                       or false if this resolver is not able to determine the controller
+     * @return mixed|bool A PHP callable representing the Controller,
+     *                    or false if this resolver is not able to determine the controller
      *
      * @throws \InvalidArgumentException|\LogicException If the controller can't be found
-     *
-     * @api
      */
     public function getController(Request $request);
 
@@ -56,8 +52,6 @@ interface ControllerResolverInterface
      * @return array An array of arguments to pass to the controller
      *
      * @throws \RuntimeException When value for argument given is not provided
-     *
-     * @api
      */
     public function getArguments(Request $request, $controller);
 }
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/ConfigDataCollector.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/ConfigDataCollector.php
@@ -55,22 +55,22 @@ class ConfigDataCollector extends DataCollector
     public function collect(Request $request, Response $response, \Exception $exception = null)
     {
         $this->data = array(
-            'app_name'             => $this->name,
-            'app_version'          => $this->version,
-            'token'                => $response->headers->get('X-Debug-Token'),
-            'symfony_version'      => Kernel::VERSION,
-            'name'                 => isset($this->kernel) ? $this->kernel->getName() : 'n/a',
-            'env'                  => isset($this->kernel) ? $this->kernel->getEnvironment() : 'n/a',
-            'debug'                => isset($this->kernel) ? $this->kernel->isDebug() : 'n/a',
-            'php_version'          => PHP_VERSION,
-            'xdebug_enabled'       => extension_loaded('xdebug'),
-            'eaccel_enabled'       => extension_loaded('eaccelerator') && ini_get('eaccelerator.enable'),
-            'apc_enabled'          => extension_loaded('apc') && ini_get('apc.enabled'),
-            'xcache_enabled'       => extension_loaded('xcache') && ini_get('xcache.cacher'),
-            'wincache_enabled'     => extension_loaded('wincache') && ini_get('wincache.ocenabled'),
+            'app_name' => $this->name,
+            'app_version' => $this->version,
+            'token' => $response->headers->get('X-Debug-Token'),
+            'symfony_version' => Kernel::VERSION,
+            'name' => isset($this->kernel) ? $this->kernel->getName() : 'n/a',
+            'env' => isset($this->kernel) ? $this->kernel->getEnvironment() : 'n/a',
+            'debug' => isset($this->kernel) ? $this->kernel->isDebug() : 'n/a',
+            'php_version' => PHP_VERSION,
+            'xdebug_enabled' => extension_loaded('xdebug'),
+            'eaccel_enabled' => extension_loaded('eaccelerator') && ini_get('eaccelerator.enable'),
+            'apc_enabled' => extension_loaded('apc') && ini_get('apc.enabled'),
+            'xcache_enabled' => extension_loaded('xcache') && ini_get('xcache.cacher'),
+            'wincache_enabled' => extension_loaded('wincache') && ini_get('wincache.ocenabled'),
             'zend_opcache_enabled' => extension_loaded('Zend OPcache') && ini_get('opcache.enable'),
-            'bundles'              => array(),
-            'sapi_name'            => php_sapi_name(),
+            'bundles' => array(),
+            'sapi_name' => php_sapi_name(),
         );
 
         if (isset($this->kernel)) {
@@ -143,7 +143,7 @@ class ConfigDataCollector extends DataCollector
     /**
      * Returns true if the debug is enabled.
      *
-     * @return bool    true if debug is enabled, false otherwise
+     * @return bool true if debug is enabled, false otherwise
      */
     public function isDebug()
     {
@@ -153,7 +153,7 @@ class ConfigDataCollector extends DataCollector
     /**
      * Returns true if the XDebug is enabled.
      *
-     * @return bool    true if XDebug is enabled, false otherwise
+     * @return bool true if XDebug is enabled, false otherwise
      */
     public function hasXDebug()
     {
@@ -163,7 +163,7 @@ class ConfigDataCollector extends DataCollector
     /**
      * Returns true if EAccelerator is enabled.
      *
-     * @return bool    true if EAccelerator is enabled, false otherwise
+     * @return bool true if EAccelerator is enabled, false otherwise
      */
     public function hasEAccelerator()
     {
@@ -173,7 +173,7 @@ class ConfigDataCollector extends DataCollector
     /**
      * Returns true if APC is enabled.
      *
-     * @return bool    true if APC is enabled, false otherwise
+     * @return bool true if APC is enabled, false otherwise
      */
     public function hasApc()
     {
@@ -181,9 +181,9 @@ class ConfigDataCollector extends DataCollector
     }
 
     /**
-     * Returns true if Zend OPcache is enabled
+     * Returns true if Zend OPcache is enabled.
      *
-     * @return bool    true if Zend OPcache is enabled, false otherwise
+     * @return bool true if Zend OPcache is enabled, false otherwise
      */
     public function hasZendOpcache()
     {
@@ -193,7 +193,7 @@ class ConfigDataCollector extends DataCollector
     /**
      * Returns true if XCache is enabled.
      *
-     * @return bool    true if XCache is enabled, false otherwise
+     * @return bool true if XCache is enabled, false otherwise
      */
     public function hasXCache()
     {
@@ -203,7 +203,7 @@ class ConfigDataCollector extends DataCollector
     /**
      * Returns true if WinCache is enabled.
      *
-     * @return bool    true if WinCache is enabled, false otherwise
+     * @return bool true if WinCache is enabled, false otherwise
      */
     public function hasWinCache()
     {
@@ -213,7 +213,7 @@ class ConfigDataCollector extends DataCollector
     /**
      * Returns true if any accelerator is enabled.
      *
-     * @return bool    true if any accelerator is enabled, false otherwise
+     * @return bool true if any accelerator is enabled, false otherwise
      */
     public function hasAccelerator()
     {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/DataCollector.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/DataCollector.php
@@ -51,7 +51,7 @@ abstract class DataCollector implements DataCollectorInterface, \Serializable
                 $a[] = sprintf('%s => %s', $k, $this->varToString($v));
             }
 
-            return sprintf("Array(%s)", implode(', ', $a));
+            return sprintf('Array(%s)', implode(', ', $a));
         }
 
         if (is_resource($var)) {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/DataCollectorInterface.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/DataCollectorInterface.php
@@ -18,8 +18,6 @@ use Symfony\Component\HttpFoundation\Response;
  * DataCollectorInterface.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 interface DataCollectorInterface
 {
@@ -29,8 +27,6 @@ interface DataCollectorInterface
      * @param Request    $request   A Request instance
      * @param Response   $response  A Response instance
      * @param \Exception $exception An Exception instance
-     *
-     * @api
      */
     public function collect(Request $request, Response $response, \Exception $exception = null);
 
@@ -38,8 +34,6 @@ interface DataCollectorInterface
      * Returns the name of the collector.
      *
      * @return string The collector name
-     *
-     * @api
      */
     public function getName();
 }
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/EventDataCollector.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/EventDataCollector.php
@@ -28,7 +28,7 @@ class EventDataCollector extends DataCollector
     public function collect(Request $request, Response $response, \Exception $exception = null)
     {
         $this->data = array(
-            'called_listeners'     => array(),
+            'called_listeners' => array(),
             'not_called_listeners' => array(),
         );
     }
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/ExceptionDataCollector.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/ExceptionDataCollector.php
@@ -11,9 +11,9 @@
 
 namespace Symfony\Component\HttpKernel\DataCollector;
 
+use Symfony\Component\Debug\Exception\FlattenException;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\Response;
-use Symfony\Component\HttpKernel\Exception\FlattenException;
 
 /**
  * ExceptionDataCollector.
@@ -37,7 +37,7 @@ class ExceptionDataCollector extends DataCollector
     /**
      * Checks if the exception is not null.
      *
-     * @return bool    true if the exception is not null, false otherwise
+     * @return bool true if the exception is not null, false otherwise
      */
     public function hasException()
     {
@@ -67,7 +67,7 @@ class ExceptionDataCollector extends DataCollector
     /**
      * Gets the exception code.
      *
-     * @return int     The exception code
+     * @return int The exception code
      */
     public function getCode()
     {
@@ -77,7 +77,7 @@ class ExceptionDataCollector extends DataCollector
     /**
      * Gets the status code.
      *
-     * @return int     The status code
+     * @return int The status code
      */
     public function getStatusCode()
     {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/LoggerDataCollector.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/LoggerDataCollector.php
@@ -11,8 +11,8 @@
 
 namespace Symfony\Component\HttpKernel\DataCollector;
 
+use Symfony\Component\Debug\ErrorHandler;
 use Symfony\Component\HttpFoundation\Request;
-use Symfony\Component\HttpKernel\Debug\ErrorHandler;
 use Symfony\Component\HttpFoundation\Response;
 use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
 
@@ -39,8 +39,8 @@ class LoggerDataCollector extends DataCollector
     {
         if (null !== $this->logger) {
             $this->data = array(
-                'error_count'       => $this->logger->countErrors(),
-                'logs'              => $this->sanitizeLogs($this->logger->getLogs()),
+                'error_count' => $this->logger->countErrors(),
+                'logs' => $this->sanitizeLogs($this->logger->getLogs()),
                 'deprecation_count' => $this->computeDeprecationCount(),
             );
         }
@@ -116,7 +116,7 @@ class LoggerDataCollector extends DataCollector
         $count = 0;
         foreach ($this->logger->getLogs() as $log) {
             if (isset($log['context']['type']) && ErrorHandler::TYPE_DEPRECATION === $log['context']['type']) {
-                $count++;
+                ++$count;
             }
         }
 
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/MemoryDataCollector.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/MemoryDataCollector.php
@@ -24,7 +24,7 @@ class MemoryDataCollector extends DataCollector
     public function __construct()
     {
         $this->data = array(
-            'memory'       => 0,
+            'memory' => 0,
             'memory_limit' => $this->convertToBytes(ini_get('memory_limit')),
         );
     }
@@ -40,7 +40,7 @@ class MemoryDataCollector extends DataCollector
     /**
      * Gets the memory.
      *
-     * @return int     The memory
+     * @return int The memory
      */
     public function getMemory()
     {
@@ -50,7 +50,7 @@ class MemoryDataCollector extends DataCollector
     /**
      * Gets the PHP memory limit.
      *
-     * @return int     The memory limit
+     * @return int The memory limit
      */
     public function getMemoryLimit()
     {
@@ -86,7 +86,7 @@ class MemoryDataCollector extends DataCollector
         } elseif (0 === strpos($max, '0')) {
             $max = intval($max, 8);
         } else {
-            $max = intval($max);
+            $max = (int) $max;
         }
 
         switch (substr($memoryLimit, -1)) {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/RequestDataCollector.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/RequestDataCollector.php
@@ -86,24 +86,24 @@ class RequestDataCollector extends DataCollector implements EventSubscriberInter
         $statusCode = $response->getStatusCode();
 
         $this->data = array(
-            'format'             => $request->getRequestFormat(),
-            'content'            => $content,
-            'content_type'       => $response->headers->get('Content-Type') ? $response->headers->get('Content-Type') : 'text/html',
-            'status_text'        => isset(Response::$statusTexts[$statusCode]) ? Response::$statusTexts[$statusCode] : '',
-            'status_code'        => $statusCode,
-            'request_query'      => $request->query->all(),
-            'request_request'    => $request->request->all(),
-            'request_headers'    => $request->headers->all(),
-            'request_server'     => $request->server->all(),
-            'request_cookies'    => $request->cookies->all(),
+            'format' => $request->getRequestFormat(),
+            'content' => $content,
+            'content_type' => $response->headers->get('Content-Type', 'text/html'),
+            'status_text' => isset(Response::$statusTexts[$statusCode]) ? Response::$statusTexts[$statusCode] : '',
+            'status_code' => $statusCode,
+            'request_query' => $request->query->all(),
+            'request_request' => $request->request->all(),
+            'request_headers' => $request->headers->all(),
+            'request_server' => $request->server->all(),
+            'request_cookies' => $request->cookies->all(),
             'request_attributes' => $attributes,
-            'response_headers'   => $responseHeaders,
-            'session_metadata'   => $sessionMetadata,
+            'response_headers' => $responseHeaders,
+            'session_metadata' => $sessionMetadata,
             'session_attributes' => $sessionAttributes,
-            'flashes'            => $flashes,
-            'path_info'          => $request->getPathInfo(),
-            'controller'         => 'n/a',
-            'locale'             => $request->getLocale(),
+            'flashes' => $flashes,
+            'path_info' => $request->getPathInfo(),
+            'controller' => 'n/a',
+            'locale' => $request->getLocale(),
         );
 
         if (isset($this->data['request_headers']['php-auth-pw'])) {
@@ -120,29 +120,29 @@ class RequestDataCollector extends DataCollector implements EventSubscriberInter
                 try {
                     $r = new \ReflectionMethod($controller[0], $controller[1]);
                     $this->data['controller'] = array(
-                        'class'  => is_object($controller[0]) ? get_class($controller[0]) : $controller[0],
+                        'class' => is_object($controller[0]) ? get_class($controller[0]) : $controller[0],
                         'method' => $controller[1],
-                        'file'   => $r->getFilename(),
-                        'line'   => $r->getStartLine(),
+                        'file' => $r->getFileName(),
+                        'line' => $r->getStartLine(),
                     );
-                } catch (\ReflectionException $re) {
+                } catch (\ReflectionException $e) {
                     if (is_callable($controller)) {
                         // using __call or  __callStatic
                         $this->data['controller'] = array(
-                            'class'  => is_object($controller[0]) ? get_class($controller[0]) : $controller[0],
+                            'class' => is_object($controller[0]) ? get_class($controller[0]) : $controller[0],
                             'method' => $controller[1],
-                            'file'   => 'n/a',
-                            'line'   => 'n/a',
+                            'file' => 'n/a',
+                            'line' => 'n/a',
                         );
                     }
                 }
             } elseif ($controller instanceof \Closure) {
                 $r = new \ReflectionFunction($controller);
                 $this->data['controller'] = array(
-                    'class'  => $r->getName(),
+                    'class' => $r->getName(),
                     'method' => null,
-                    'file'   => $r->getFilename(),
-                    'line'   => $r->getStartLine(),
+                    'file' => $r->getFileName(),
+                    'line' => $r->getStartLine(),
                 );
             } else {
                 $this->data['controller'] = (string) $controller ?: 'n/a';
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/RouterDataCollector.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/RouterDataCollector.php
@@ -31,8 +31,8 @@ class RouterDataCollector extends DataCollector
 
         $this->data = array(
             'redirect' => false,
-            'url'      => null,
-            'route'    => null,
+            'url' => null,
+            'route' => null,
         );
     }
 
@@ -69,7 +69,7 @@ class RouterDataCollector extends DataCollector
     }
 
     /**
-     * @return bool    Whether this request will result in a redirect
+     * @return bool Whether this request will result in a redirect
      */
     public function getRedirect()
     {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/TimeDataCollector.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DataCollector/TimeDataCollector.php
@@ -42,7 +42,7 @@ class TimeDataCollector extends DataCollector
 
         $this->data = array(
             'start_time' => $startTime * 1000,
-            'events'     => array(),
+            'events' => array(),
         );
     }
 
@@ -105,7 +105,7 @@ class TimeDataCollector extends DataCollector
     /**
      * Gets the request time.
      *
-     * @return int     The time
+     * @return int The time
      */
     public function getStartTime()
     {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Debug/TraceableEventDispatcher.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Debug/TraceableEventDispatcher.php
@@ -88,6 +88,18 @@ class TraceableEventDispatcher implements EventDispatcherInterface, TraceableEve
      */
     public function removeListener($eventName, $listener)
     {
+        if (isset($this->wrappedListeners[$this->lastEventId])) {
+            foreach ($this->wrappedListeners[$this->lastEventId] as $wrappedListener) {
+                $originalListener = $this->wrappedListeners[$this->lastEventId][$wrappedListener];
+
+                if ($originalListener === $listener) {
+                    unset($this->wrappedListeners[$this->lastEventId][$wrappedListener]);
+
+                    return $this->dispatcher->removeListener($eventName, $wrappedListener);
+                }
+            }
+        }
+
         return $this->dispatcher->removeListener($eventName, $listener);
     }
 
@@ -259,7 +271,7 @@ class TraceableEventDispatcher implements EventDispatcherInterface, TraceableEve
     }
 
     /**
-     * Returns information about the listener
+     * Returns information about the listener.
      *
      * @param object   $listener  The listener
      * @param int|null $eventId   The event id
@@ -289,10 +301,10 @@ class TraceableEventDispatcher implements EventDispatcherInterface, TraceableEve
                 $line = null;
             }
             $info += array(
-                'type'  => 'Function',
+                'type' => 'Function',
                 'function' => $listener,
-                'file'  => $file,
-                'line'  => $line,
+                'file' => $file,
+                'line' => $line,
                 'pretty' => $listener,
             );
         } elseif (is_array($listener) || (is_object($listener) && is_callable($listener))) {
@@ -309,11 +321,11 @@ class TraceableEventDispatcher implements EventDispatcherInterface, TraceableEve
                 $line = null;
             }
             $info += array(
-                'type'  => 'Method',
+                'type' => 'Method',
                 'class' => $class,
                 'method' => $listener[1],
-                'file'  => $file,
-                'line'  => $line,
+                'file' => $file,
+                'line' => $line,
                 'pretty' => $class.'::'.$listener[1],
             );
         }
@@ -324,8 +336,8 @@ class TraceableEventDispatcher implements EventDispatcherInterface, TraceableEve
     /**
      * Updates the stopwatch data in the profile hierarchy.
      *
-     * @param string  $token          Profile token
-     * @param bool    $updateChildren Whether to update the children altogether
+     * @param string $token          Profile token
+     * @param bool   $updateChildren Whether to update the children altogether
      */
     private function updateProfiles($token, $updateChildren)
     {
@@ -472,9 +484,9 @@ class TraceableEventDispatcher implements EventDispatcherInterface, TraceableEve
         // get the original listener
         if (is_object($listener)) {
             if (null === $eventId) {
-                foreach (array_keys($this->wrappedListeners) as $eventId) {
-                    if (isset($this->wrappedListeners[$eventId][$listener])) {
-                        return $this->wrappedListeners[$eventId][$listener];
+                foreach ($this->wrappedListeners as $eventId => $eventListeners) {
+                    if (isset($eventListeners[$listener])) {
+                        return $eventListeners[$listener];
                     }
                 }
             } elseif (isset($this->wrappedListeners[$eventId][$listener])) {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DependencyInjection/ConfigurableExtension.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DependencyInjection/ConfigurableExtension.php
@@ -17,11 +17,11 @@ use Symfony\Component\DependencyInjection\ContainerBuilder;
  * This extension sub-class provides first-class integration with the
  * Config/Definition Component.
  *
- * You can use this as base class if you
+ * You can use this as base class if
  *
- *    a) use the Config/Definition component for configuration
- *    b) your configuration class is named "Configuration" and
- *    c) the configuration class resides in the DependencyInjection sub-folder
+ *    a) you use the Config/Definition component for configuration,
+ *    b) your configuration class is named "Configuration", and
+ *    c) the configuration class resides in the DependencyInjection sub-folder.
  *
  * @author Johannes M. Schmitt <schmittjoh@gmail.com>
  */
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DependencyInjection/RegisterListenersPass.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/DependencyInjection/RegisterListenersPass.php
@@ -91,8 +91,12 @@ class RegisterListenersPass implements CompilerPassInterface
                 throw new \InvalidArgumentException(sprintf('The service "%s" must be public as event subscribers are lazy-loaded.', $id));
             }
 
+            if ($def->isAbstract()) {
+                throw new \InvalidArgumentException(sprintf('The service "%s" must not be abstract as event subscribers are lazy-loaded.', $id));
+            }
+
             // We must assume that the class value has been correctly filled, even if the service is created by a factory
-            $class = $def->getClass();
+            $class = $container->getParameterBag()->resolveValue($def->getClass());
 
             $refClass = new \ReflectionClass($class);
             $interface = 'Symfony\Component\EventDispatcher\EventSubscriberInterface';
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Event/FilterControllerEvent.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Event/FilterControllerEvent.php
@@ -15,7 +15,7 @@ use Symfony\Component\HttpKernel\HttpKernelInterface;
 use Symfony\Component\HttpFoundation\Request;
 
 /**
- * Allows filtering of a controller callable
+ * Allows filtering of a controller callable.
  *
  * You can call getController() to retrieve the current controller. With
  * setController() you can set a new controller that is used in the processing
@@ -24,14 +24,11 @@ use Symfony\Component\HttpFoundation\Request;
  * Controllers should be callables.
  *
  * @author Bernhard Schussek <bschussek@gmail.com>
- *
- * @api
  */
 class FilterControllerEvent extends KernelEvent
 {
     /**
-     * The current controller
-     * @var callable
+     * The current controller.
      */
     private $controller;
 
@@ -43,11 +40,9 @@ class FilterControllerEvent extends KernelEvent
     }
 
     /**
-     * Returns the current controller
+     * Returns the current controller.
      *
      * @return callable
-     *
-     * @api
      */
     public function getController()
     {
@@ -55,13 +50,11 @@ class FilterControllerEvent extends KernelEvent
     }
 
     /**
-     * Sets a new controller
+     * Sets a new controller.
      *
      * @param callable $controller
      *
      * @throws \LogicException
-     *
-     * @api
      */
     public function setController($controller)
     {
@@ -85,7 +78,7 @@ class FilterControllerEvent extends KernelEvent
                 $a[] = sprintf('%s => %s', $k, $this->varToString($v));
             }
 
-            return sprintf("Array(%s)", implode(', ', $a));
+            return sprintf('Array(%s)', implode(', ', $a));
         }
 
         if (is_resource($var)) {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Event/FilterResponseEvent.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Event/FilterResponseEvent.php
@@ -16,20 +16,19 @@ use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\Response;
 
 /**
- * Allows to filter a Response object
+ * Allows to filter a Response object.
  *
  * You can call getResponse() to retrieve the current response. With
  * setResponse() you can set a new response that will be returned to the
  * browser.
  *
  * @author Bernhard Schussek <bschussek@gmail.com>
- *
- * @api
  */
 class FilterResponseEvent extends KernelEvent
 {
     /**
-     * The current response object
+     * The current response object.
+     *
      * @var Response
      */
     private $response;
@@ -42,11 +41,9 @@ class FilterResponseEvent extends KernelEvent
     }
 
     /**
-     * Returns the current response object
+     * Returns the current response object.
      *
      * @return Response
-     *
-     * @api
      */
     public function getResponse()
     {
@@ -54,11 +51,9 @@ class FilterResponseEvent extends KernelEvent
     }
 
     /**
-     * Sets a new response object
+     * Sets a new response object.
      *
      * @param Response $response
-     *
-     * @api
      */
     public function setResponse(Response $response)
     {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Event/GetResponseEvent.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Event/GetResponseEvent.php
@@ -14,30 +14,27 @@ namespace Symfony\Component\HttpKernel\Event;
 use Symfony\Component\HttpFoundation\Response;
 
 /**
- * Allows to create a response for a request
+ * Allows to create a response for a request.
  *
  * Call setResponse() to set the response that will be returned for the
  * current request. The propagation of this event is stopped as soon as a
  * response is set.
  *
  * @author Bernhard Schussek <bschussek@gmail.com>
- *
- * @api
  */
 class GetResponseEvent extends KernelEvent
 {
     /**
-     * The response object
+     * The response object.
+     *
      * @var Response
      */
     private $response;
 
     /**
-     * Returns the response object
+     * Returns the response object.
      *
      * @return Response
-     *
-     * @api
      */
     public function getResponse()
     {
@@ -45,11 +42,9 @@ class GetResponseEvent extends KernelEvent
     }
 
     /**
-     * Sets a response and stops event propagation
+     * Sets a response and stops event propagation.
      *
      * @param Response $response
-     *
-     * @api
      */
     public function setResponse(Response $response)
     {
@@ -59,11 +54,9 @@ class GetResponseEvent extends KernelEvent
     }
 
     /**
-     * Returns whether a response was set
-     *
-     * @return bool    Whether a response was set
+     * Returns whether a response was set.
      *
-     * @api
+     * @return bool Whether a response was set
      */
     public function hasResponse()
     {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Event/GetResponseForControllerResultEvent.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Event/GetResponseForControllerResultEvent.php
@@ -15,20 +15,18 @@ use Symfony\Component\HttpKernel\HttpKernelInterface;
 use Symfony\Component\HttpFoundation\Request;
 
 /**
- * Allows to create a response for the return value of a controller
+ * Allows to create a response for the return value of a controller.
  *
  * Call setResponse() to set the response that will be returned for the
  * current request. The propagation of this event is stopped as soon as a
  * response is set.
  *
  * @author Bernhard Schussek <bschussek@gmail.com>
- *
- * @api
  */
 class GetResponseForControllerResultEvent extends GetResponseEvent
 {
     /**
-     * The return value of the controller
+     * The return value of the controller.
      *
      * @var mixed
      */
@@ -45,8 +43,6 @@ class GetResponseForControllerResultEvent extends GetResponseEvent
      * Returns the return value of the controller.
      *
      * @return mixed The controller return value
-     *
-     * @api
      */
     public function getControllerResult()
     {
@@ -57,8 +53,6 @@ class GetResponseForControllerResultEvent extends GetResponseEvent
      * Assigns the return value of the controller.
      *
      * @param mixed $controllerResult The controller return value
-     *
-     * @api
      */
     public function setControllerResult($controllerResult)
     {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Event/GetResponseForExceptionEvent.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Event/GetResponseForExceptionEvent.php
@@ -15,7 +15,7 @@ use Symfony\Component\HttpKernel\HttpKernelInterface;
 use Symfony\Component\HttpFoundation\Request;
 
 /**
- * Allows to create a response for a thrown exception
+ * Allows to create a response for a thrown exception.
  *
  * Call setResponse() to set the response that will be returned for the
  * current request. The propagation of this event is stopped as soon as a
@@ -26,13 +26,12 @@ use Symfony\Component\HttpFoundation\Request;
  * event.
  *
  * @author Bernhard Schussek <bschussek@gmail.com>
- *
- * @api
  */
 class GetResponseForExceptionEvent extends GetResponseEvent
 {
     /**
-     * The exception object
+     * The exception object.
+     *
      * @var \Exception
      */
     private $exception;
@@ -45,11 +44,9 @@ class GetResponseForExceptionEvent extends GetResponseEvent
     }
 
     /**
-     * Returns the thrown exception
+     * Returns the thrown exception.
      *
-     * @return \Exception  The thrown exception
-     *
-     * @api
+     * @return \Exception The thrown exception
      */
     public function getException()
     {
@@ -57,13 +54,11 @@ class GetResponseForExceptionEvent extends GetResponseEvent
     }
 
     /**
-     * Replaces the thrown exception
+     * Replaces the thrown exception.
      *
      * This exception will be thrown if no response is set in the event.
      *
      * @param \Exception $exception The thrown exception
-     *
-     * @api
      */
     public function setException(\Exception $exception)
     {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Event/KernelEvent.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Event/KernelEvent.php
@@ -16,29 +16,30 @@ use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\EventDispatcher\Event;
 
 /**
- * Base class for events thrown in the HttpKernel component
+ * Base class for events thrown in the HttpKernel component.
  *
  * @author Bernhard Schussek <bschussek@gmail.com>
- *
- * @api
  */
 class KernelEvent extends Event
 {
     /**
-     * The kernel in which this event was thrown
+     * The kernel in which this event was thrown.
+     *
      * @var HttpKernelInterface
      */
     private $kernel;
 
     /**
-     * The request the kernel is currently processing
+     * The request the kernel is currently processing.
+     *
      * @var Request
      */
     private $request;
 
     /**
      * The request type the kernel is currently processing.  One of
-     * HttpKernelInterface::MASTER_REQUEST and HttpKernelInterface::SUB_REQUEST
+     * HttpKernelInterface::MASTER_REQUEST and HttpKernelInterface::SUB_REQUEST.
+     *
      * @var int
      */
     private $requestType;
@@ -51,11 +52,9 @@ class KernelEvent extends Event
     }
 
     /**
-     * Returns the kernel in which this event was thrown
+     * Returns the kernel in which this event was thrown.
      *
      * @return HttpKernelInterface
-     *
-     * @api
      */
     public function getKernel()
     {
@@ -63,11 +62,9 @@ class KernelEvent extends Event
     }
 
     /**
-     * Returns the request the kernel is currently processing
+     * Returns the request the kernel is currently processing.
      *
      * @return Request
-     *
-     * @api
      */
     public function getRequest()
     {
@@ -75,12 +72,10 @@ class KernelEvent extends Event
     }
 
     /**
-     * Returns the request type the kernel is currently processing
-     *
-     * @return int      One of HttpKernelInterface::MASTER_REQUEST and
-     *                  HttpKernelInterface::SUB_REQUEST
+     * Returns the request type the kernel is currently processing.
      *
-     * @api
+     * @return int One of HttpKernelInterface::MASTER_REQUEST and
+     *             HttpKernelInterface::SUB_REQUEST
      */
     public function getRequestType()
     {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Event/PostResponseEvent.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Event/PostResponseEvent.php
@@ -17,14 +17,15 @@ use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\Response;
 
 /**
- * Allows to execute logic after a response was sent
+ * Allows to execute logic after a response was sent.
  *
  * @author Jordi Boggiano <j.boggiano@seld.be>
  */
 class PostResponseEvent extends Event
 {
     /**
-     * The kernel in which this event was thrown
+     * The kernel in which this event was thrown.
+     *
      * @var HttpKernelInterface
      */
     private $kernel;
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/ErrorsLoggerListener.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/ErrorsLoggerListener.php
@@ -12,7 +12,7 @@
 namespace Symfony\Component\HttpKernel\EventListener;
 
 use Psr\Log\LoggerInterface;
-use Symfony\Component\HttpKernel\Debug\ErrorHandler;
+use Symfony\Component\Debug\ErrorHandler;
 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 use Symfony\Component\HttpKernel\KernelEvents;
 
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/ExceptionListener.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/ExceptionListener.php
@@ -12,11 +12,11 @@
 namespace Symfony\Component\HttpKernel\EventListener;
 
 use Psr\Log\LoggerInterface;
+use Symfony\Component\Debug\Exception\FlattenException;
 use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
 use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
 use Symfony\Component\HttpKernel\KernelEvents;
 use Symfony\Component\HttpKernel\HttpKernelInterface;
-use Symfony\Component\HttpKernel\Exception\FlattenException;
 use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 
@@ -38,14 +38,6 @@ class ExceptionListener implements EventSubscriberInterface
 
     public function onKernelException(GetResponseForExceptionEvent $event)
     {
-        static $handling;
-
-        if (true === $handling) {
-            return false;
-        }
-
-        $handling = true;
-
         $exception = $event->getException();
         $request = $event->getRequest();
 
@@ -53,32 +45,38 @@ class ExceptionListener implements EventSubscriberInterface
 
         $attributes = array(
             '_controller' => $this->controller,
-            'exception'   => FlattenException::create($exception),
-            'logger'      => $this->logger instanceof DebugLoggerInterface ? $this->logger : null,
+            'exception' => FlattenException::create($exception),
+            'logger' => $this->logger instanceof DebugLoggerInterface ? $this->logger : null,
             // keep for BC -- as $format can be an argument of the controller callable
             // see src/Symfony/Bundle/TwigBundle/Controller/ExceptionController.php
             // @deprecated in 2.4, to be removed in 3.0
-            'format'      => $request->getRequestFormat(),
+            'format' => $request->getRequestFormat(),
         );
 
         $request = $request->duplicate(null, null, $attributes);
         $request->setMethod('GET');
 
         try {
-            $response = $event->getKernel()->handle($request, HttpKernelInterface::SUB_REQUEST, true);
+            $response = $event->getKernel()->handle($request, HttpKernelInterface::SUB_REQUEST, false);
         } catch (\Exception $e) {
-            $this->logException($exception, sprintf('Exception thrown when handling an exception (%s: %s)', get_class($e), $e->getMessage()), false);
+            $this->logException($e, sprintf('Exception thrown when handling an exception (%s: %s at %s line %s)', get_class($e), $e->getMessage(), $e->getFile(), $e->getLine()), false);
 
-            // set handling to false otherwise it wont be able to handle further more
-            $handling = false;
+            $wrapper = $e;
 
-            // re-throw the exception from within HttpKernel as this is a catch-all
-            return;
+            while ($prev = $wrapper->getPrevious()) {
+                if ($exception === $wrapper = $prev) {
+                    throw $e;
+                }
+            }
+
+            $prev = new \ReflectionProperty('Exception', 'previous');
+            $prev->setAccessible(true);
+            $prev->setValue($wrapper, $exception);
+
+            throw $e;
         }
 
         $event->setResponse($response);
-
-        $handling = false;
     }
 
     public static function getSubscribedEvents()
@@ -91,7 +89,7 @@ class ExceptionListener implements EventSubscriberInterface
     /**
      * Logs an exception.
      *
-     * @param \Exception $exception The original \Exception instance
+     * @param \Exception $exception The \Exception instance
      * @param string     $message   The error message to log
      * @param bool       $original  False when the handling of the exception thrown another exception
      */
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/FragmentListener.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/FragmentListener.php
@@ -58,7 +58,7 @@ class FragmentListener implements EventSubscriberInterface
     {
         $request = $event->getRequest();
 
-        if ($this->fragmentPath !== rawurldecode($request->getPathInfo())) {
+        if ($request->attributes->has('_controller') || $this->fragmentPath !== rawurldecode($request->getPathInfo())) {
             return;
         }
 
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/RouterListener.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/RouterListener.php
@@ -103,12 +103,11 @@ class RouterListener implements EventSubscriberInterface
             }
 
             if (null !== $this->logger) {
-                $this->logger->info(sprintf('Matched route "%s" (parameters: %s)', $parameters['_route'], $this->parametersToString($parameters)));
+                $this->logger->info(sprintf('Matched route "%s" (parameters: %s)', isset($parameters['_route']) ? $parameters['_route'] : 'n/a', $this->parametersToString($parameters)));
             }
 
             $request->attributes->add($parameters);
-            unset($parameters['_route']);
-            unset($parameters['_controller']);
+            unset($parameters['_route'], $parameters['_controller']);
             $request->attributes->set('_route_params', $parameters);
         } catch (ResourceNotFoundException $e) {
             $message = sprintf('No route found for "%s %s"', $request->getMethod(), $request->getPathInfo());
--- /dev/null
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/EventListener/SaveSessionListener.php
@@ -0,0 +1,67 @@
+<?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\HttpKernel\EventListener;
+
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpKernel\KernelEvents;
+
+/**
+ * Saves the session, in case it is still open, before sending the response/headers.
+ *
+ * This ensures several things in case the developer did not save the session explicitly:
+ *
+ *  * If a session save handler without locking is used, it ensures the data is available
+ *    on the next request, e.g. after a redirect. PHPs auto-save at script end via
+ *    session_register_shutdown is executed after fastcgi_finish_request. So in this case
+ *    the data could be missing the next request because it might not be saved the moment
+ *    the new request is processed.
+ *  * A locking save handler (e.g. the native 'files') circumvents concurrency problems like
+ *    the one above. But by saving the session before long-running things in the terminate event,
+ *    we ensure the session is not blocked longer than needed.
+ *  * When regenerating the session ID no locking is involved in PHPs session design. See
+ *    https://bugs.php.net/bug.php?id=61470 for a discussion. So in this case, the session must
+ *    be saved anyway before sending the headers with the new session ID. Otherwise session
+ *    data could get lost again for concurrent requests with the new ID. One result could be
+ *    that you get logged out after just logging in.
+ *
+ * This listener should be executed as one of the last listeners, so that previous listeners
+ * can still operate on the open session. This prevents the overhead of restarting it.
+ * Listeners after closing the session can still work with the session as usual because
+ * Symfonys session implementation starts the session on demand. So writing to it after
+ * it is saved will just restart it.
+ *
+ * @author Tobias Schultze <http://tobion.de>
+ */
+class SaveSessionListener implements EventSubscriberInterface
+{
+    public function onKernelResponse(FilterResponseEvent $event)
+    {
+        if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
+            return;
+        }
+
+        $session = $event->getRequest()->getSession();
+        if ($session && $session->isStarted()) {
+            $session->save();
+        }
+    }
+
+    public static function getSubscribedEvents()
+    {
+        return array(
+            // low priority but higher than StreamedResponseListener
+            KernelEvents::RESPONSE => array(array('onKernelResponse', -1000)),
+        );
+    }
+}
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/BadRequestHttpException.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/BadRequestHttpException.php
@@ -21,9 +21,9 @@ class BadRequestHttpException extends HttpException
     /**
      * Constructor.
      *
-     * @param string     $message   The internal exception message
-     * @param \Exception $previous  The previous exception
-     * @param int        $code      The internal exception code
+     * @param string     $message  The internal exception message
+     * @param \Exception $previous The previous exception
+     * @param int        $code     The internal exception code
      */
     public function __construct($message = null, \Exception $previous = null, $code = 0)
     {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/ConflictHttpException.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/ConflictHttpException.php
@@ -21,9 +21,9 @@ class ConflictHttpException extends HttpException
     /**
      * Constructor.
      *
-     * @param string     $message   The internal exception message
-     * @param \Exception $previous  The previous exception
-     * @param int        $code      The internal exception code
+     * @param string     $message  The internal exception message
+     * @param \Exception $previous The previous exception
+     * @param int        $code     The internal exception code
      */
     public function __construct($message = null, \Exception $previous = null, $code = 0)
     {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/FatalErrorException.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/FatalErrorException.php
@@ -11,15 +11,11 @@
 
 namespace Symfony\Component\HttpKernel\Exception;
 
-use Symfony\Component\Debug\Exception\FatalErrorException as DebugFatalErrorException;
-
-/**
+/*
  * Fatal Error Exception.
  *
  * @author Konstanton Myakshin <koc-dp@yandex.ru>
  *
  * @deprecated Deprecated in 2.3, to be removed in 3.0. Use the same class from the Debug component instead.
  */
-class FatalErrorException extends DebugFatalErrorException
-{
-}
+class_exists('Symfony\Component\Debug\Exception\FatalErrorException');
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/FlattenException.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/FlattenException.php
@@ -11,9 +11,7 @@
 
 namespace Symfony\Component\HttpKernel\Exception;
 
-use Symfony\Component\Debug\Exception\FlattenException as DebugFlattenException;
-
-/**
+/*
  * FlattenException wraps a PHP Exception to be able to serialize it.
  *
  * Basically, this class removes all objects from the trace.
@@ -22,6 +20,4 @@ use Symfony\Component\Debug\Exception\FlattenException as DebugFlattenException;
  *
  * @deprecated Deprecated in 2.3, to be removed in 3.0. Use the same class from the Debug component instead.
  */
-class FlattenException extends DebugFlattenException
-{
-}
+class_exists('Symfony\Component\Debug\Exception\FlattenException');
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/GoneHttpException.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/GoneHttpException.php
@@ -21,9 +21,9 @@ class GoneHttpException extends HttpException
     /**
      * Constructor.
      *
-     * @param string     $message   The internal exception message
-     * @param \Exception $previous  The previous exception
-     * @param int        $code      The internal exception code
+     * @param string     $message  The internal exception message
+     * @param \Exception $previous The previous exception
+     * @param int        $code     The internal exception code
      */
     public function __construct($message = null, \Exception $previous = null, $code = 0)
     {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/HttpExceptionInterface.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/HttpExceptionInterface.php
@@ -21,7 +21,7 @@ interface HttpExceptionInterface
     /**
      * Returns the status code.
      *
-     * @return int     An HTTP response status code
+     * @return int An HTTP response status code
      */
     public function getStatusCode();
 
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/LengthRequiredHttpException.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/LengthRequiredHttpException.php
@@ -21,9 +21,9 @@ class LengthRequiredHttpException extends HttpException
     /**
      * Constructor.
      *
-     * @param string     $message   The internal exception message
-     * @param \Exception $previous  The previous exception
-     * @param int        $code      The internal exception code
+     * @param string     $message  The internal exception message
+     * @param \Exception $previous The previous exception
+     * @param int        $code     The internal exception code
      */
     public function __construct($message = null, \Exception $previous = null, $code = 0)
     {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/NotAcceptableHttpException.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/NotAcceptableHttpException.php
@@ -21,9 +21,9 @@ class NotAcceptableHttpException extends HttpException
     /**
      * Constructor.
      *
-     * @param string     $message   The internal exception message
-     * @param \Exception $previous  The previous exception
-     * @param int        $code      The internal exception code
+     * @param string     $message  The internal exception message
+     * @param \Exception $previous The previous exception
+     * @param int        $code     The internal exception code
      */
     public function __construct($message = null, \Exception $previous = null, $code = 0)
     {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/PreconditionFailedHttpException.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/PreconditionFailedHttpException.php
@@ -21,9 +21,9 @@ class PreconditionFailedHttpException extends HttpException
     /**
      * Constructor.
      *
-     * @param string     $message   The internal exception message
-     * @param \Exception $previous  The previous exception
-     * @param int        $code      The internal exception code
+     * @param string     $message  The internal exception message
+     * @param \Exception $previous The previous exception
+     * @param int        $code     The internal exception code
      */
     public function __construct($message = null, \Exception $previous = null, $code = 0)
     {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/PreconditionRequiredHttpException.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/PreconditionRequiredHttpException.php
@@ -15,6 +15,7 @@ namespace Symfony\Component\HttpKernel\Exception;
  * PreconditionRequiredHttpException.
  *
  * @author Ben Ramsey <ben@benramsey.com>
+ *
  * @see http://tools.ietf.org/html/rfc6585
  */
 class PreconditionRequiredHttpException extends HttpException
@@ -22,9 +23,9 @@ class PreconditionRequiredHttpException extends HttpException
     /**
      * Constructor.
      *
-     * @param string     $message   The internal exception message
-     * @param \Exception $previous  The previous exception
-     * @param int        $code      The internal exception code
+     * @param string     $message  The internal exception message
+     * @param \Exception $previous The previous exception
+     * @param int        $code     The internal exception code
      */
     public function __construct($message = null, \Exception $previous = null, $code = 0)
     {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/ServiceUnavailableHttpException.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/ServiceUnavailableHttpException.php
@@ -21,10 +21,10 @@ class ServiceUnavailableHttpException extends HttpException
     /**
      * Constructor.
      *
-     * @param int|string  $retryAfter The number of seconds or HTTP-date after which the request may be retried
-     * @param string      $message    The internal exception message
-     * @param \Exception  $previous   The previous exception
-     * @param int         $code       The internal exception code
+     * @param int|string $retryAfter The number of seconds or HTTP-date after which the request may be retried
+     * @param string     $message    The internal exception message
+     * @param \Exception $previous   The previous exception
+     * @param int        $code       The internal exception code
      */
     public function __construct($retryAfter = null, $message = null, \Exception $previous = null, $code = 0)
     {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/TooManyRequestsHttpException.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/TooManyRequestsHttpException.php
@@ -15,6 +15,7 @@ namespace Symfony\Component\HttpKernel\Exception;
  * TooManyRequestsHttpException.
  *
  * @author Ben Ramsey <ben@benramsey.com>
+ *
  * @see http://tools.ietf.org/html/rfc6585
  */
 class TooManyRequestsHttpException extends HttpException
@@ -22,10 +23,10 @@ class TooManyRequestsHttpException extends HttpException
     /**
      * Constructor.
      *
-     * @param int|string     $retryAfter The number of seconds or HTTP-date after which the request may be retried
-     * @param string         $message    The internal exception message
-     * @param \Exception     $previous   The previous exception
-     * @param int            $code       The internal exception code
+     * @param int|string $retryAfter The number of seconds or HTTP-date after which the request may be retried
+     * @param string     $message    The internal exception message
+     * @param \Exception $previous   The previous exception
+     * @param int        $code       The internal exception code
      */
     public function __construct($retryAfter = null, $message = null, \Exception $previous = null, $code = 0)
     {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/UnsupportedMediaTypeHttpException.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Exception/UnsupportedMediaTypeHttpException.php
@@ -21,9 +21,9 @@ class UnsupportedMediaTypeHttpException extends HttpException
     /**
      * Constructor.
      *
-     * @param string     $message   The internal exception message
-     * @param \Exception $previous  The previous exception
-     * @param int        $code      The internal exception code
+     * @param string     $message  The internal exception message
+     * @param \Exception $previous The previous exception
+     * @param int        $code     The internal exception code
      */
     public function __construct($message = null, \Exception $previous = null, $code = 0)
     {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/EsiFragmentRenderer.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/EsiFragmentRenderer.php
@@ -56,7 +56,7 @@ class EsiFragmentRenderer extends RoutableFragmentRenderer
      *  * alt: an alternative URI to render in case of an error
      *  * comment: a comment to add when returning an esi:include tag
      *
-     * @see Symfony\Component\HttpKernel\HttpCache\ESI
+     * @see Esi
      */
     public function render($uri, Request $request, array $options = array())
     {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/FragmentRendererInterface.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/FragmentRendererInterface.php
@@ -19,8 +19,6 @@ use Symfony\Component\HttpFoundation\Response;
  * Interface implemented by all rendering strategies.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @see Symfony\Component\HttpKernel\FragmentRenderer
  */
 interface FragmentRendererInterface
 {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/HIncludeFragmentRenderer.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/HIncludeFragmentRenderer.php
@@ -11,10 +11,6 @@
 
 namespace Symfony\Component\HttpKernel\Fragment;
 
-if (!defined('ENT_SUBSTITUTE')) {
-    define('ENT_SUBSTITUTE', 8);
-}
-
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\Response;
 use Symfony\Component\Templating\EngineInterface;
@@ -68,7 +64,7 @@ class HIncludeFragmentRenderer extends RoutableFragmentRenderer
     /**
      * Checks if a templating engine has been set.
      *
-     * @return bool    true if the templating engine has been set, false otherwise
+     * @return bool true if the templating engine has been set, false otherwise
      */
     public function hasTemplating()
     {
@@ -111,11 +107,16 @@ class HIncludeFragmentRenderer extends RoutableFragmentRenderer
         }
         $renderedAttributes = '';
         if (count($attributes) > 0) {
+            if (PHP_VERSION_ID >= 50400) {
+                $flags = ENT_QUOTES | ENT_SUBSTITUTE;
+            } else {
+                $flags = ENT_QUOTES;
+            }
             foreach ($attributes as $attribute => $value) {
                 $renderedAttributes .= sprintf(
                     ' %s="%s"',
-                    htmlspecialchars($attribute, ENT_QUOTES | ENT_SUBSTITUTE, $this->charset, false),
-                    htmlspecialchars($value, ENT_QUOTES | ENT_SUBSTITUTE, $this->charset, false)
+                    htmlspecialchars($attribute, $flags, $this->charset, false),
+                    htmlspecialchars($value, $flags, $this->charset, false)
                 );
             }
         }
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/RoutableFragmentRenderer.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/RoutableFragmentRenderer.php
@@ -39,9 +39,9 @@ abstract class RoutableFragmentRenderer implements FragmentRendererInterface
     /**
      * Generates a fragment URI for a given controller.
      *
-     * @param ControllerReference  $reference A ControllerReference instance
-     * @param Request              $request   A Request instance
-     * @param bool                 $absolute  Whether to generate an absolute URL or not
+     * @param ControllerReference $reference A ControllerReference instance
+     * @param Request             $request   A Request instance
+     * @param bool                $absolute  Whether to generate an absolute URL or not
      *
      * @return string A fragment URI
      */
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/Esi.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/Esi.php
@@ -29,12 +29,16 @@ use Symfony\Component\HttpKernel\HttpKernelInterface;
 class Esi
 {
     private $contentTypes;
+    private $phpEscapeMap = array(
+        array('<?', '<%', '<s', '<S'),
+        array('<?php echo "<?"; ?>', '<?php echo "<%"; ?>', '<?php echo "<s"; ?>', '<?php echo "<S"; ?>'),
+    );
 
     /**
      * Constructor.
      *
      * @param array $contentTypes An array of content-type that should be parsed for ESI information.
-     *                           (default: text/html, text/xml, application/xhtml+xml, and application/xml)
+     *                            (default: text/html, text/xml, application/xhtml+xml, and application/xml)
      */
     public function __construct(array $contentTypes = array('text/html', 'text/xml', 'application/xhtml+xml', 'application/xml'))
     {
@@ -56,7 +60,7 @@ class Esi
      *
      * @param Request $request A Request instance
      *
-     * @return bool    true if one surrogate has ESI/1.0 capability, false otherwise
+     * @return bool true if one surrogate has ESI/1.0 capability, false otherwise
      */
     public function hasSurrogateEsiCapability(Request $request)
     {
@@ -99,7 +103,7 @@ class Esi
      *
      * @param Response $response A Response instance
      *
-     * @return bool    true if the Response needs to be parsed, false otherwise
+     * @return bool true if the Response needs to be parsed, false otherwise
      */
     public function needsEsiParsing(Response $response)
     {
@@ -113,10 +117,10 @@ class Esi
     /**
      * Renders an ESI tag.
      *
-     * @param string  $uri          A URI
-     * @param string  $alt          An alternate URI
-     * @param bool    $ignoreErrors Whether to ignore errors or not
-     * @param string  $comment      A comment to add as an esi:include tag
+     * @param string $uri          A URI
+     * @param string $alt          An alternate URI
+     * @param bool   $ignoreErrors Whether to ignore errors or not
+     * @param string $comment      A comment to add as an esi:include tag
      *
      * @return string
      */
@@ -158,10 +162,34 @@ class Esi
 
         // we don't use a proper XML parser here as we can have ESI tags in a plain text response
         $content = $response->getContent();
-        $content = str_replace(array('<?', '<%'), array('<?php echo "<?"; ?>', '<?php echo "<%"; ?>'), $content);
-        $content = preg_replace_callback('#<esi\:include\s+(.*?)\s*(?:/|</esi\:include)>#', array($this, 'handleEsiIncludeTag'), $content);
-        $content = preg_replace('#<esi\:comment[^>]*(?:/|</esi\:comment)>#', '', $content);
-        $content = preg_replace('#<esi\:remove>.*?</esi\:remove>#', '', $content);
+        $content = preg_replace('#<esi\:remove>.*?</esi\:remove>#s', '', $content);
+        $content = preg_replace('#<esi\:comment[^>]+>#s', '', $content);
+
+        $chunks = preg_split('#<esi\:include\s+(.*?)\s*(?:/|</esi\:include)>#', $content, -1, PREG_SPLIT_DELIM_CAPTURE);
+        $chunks[0] = str_replace($this->phpEscapeMap[0], $this->phpEscapeMap[1], $chunks[0]);
+
+        $i = 1;
+        while (isset($chunks[$i])) {
+            $options = array();
+            preg_match_all('/(src|onerror|alt)="([^"]*?)"/', $chunks[$i], $matches, PREG_SET_ORDER);
+            foreach ($matches as $set) {
+                $options[$set[1]] = $set[2];
+            }
+
+            if (!isset($options['src'])) {
+                throw new \RuntimeException('Unable to process an ESI tag without a "src" attribute.');
+            }
+
+            $chunks[$i] = sprintf('<?php echo $this->esi->handle($this, %s, %s, %s) ?>'."\n",
+                var_export($options['src'], true),
+                var_export(isset($options['alt']) ? $options['alt'] : '', true),
+                isset($options['onerror']) && 'continue' === $options['onerror'] ? 'true' : 'false'
+            );
+            ++$i;
+            $chunks[$i] = str_replace($this->phpEscapeMap[0], $this->phpEscapeMap[1], $chunks[$i]);
+            ++$i;
+        }
+        $content = implode('', $chunks);
 
         $response->setContent($content);
         $response->headers->set('X-Body-Eval', 'ESI');
@@ -214,32 +242,4 @@ class Esi
             }
         }
     }
-
-    /**
-     * Handles an ESI include tag (called internally).
-     *
-     * @param array $attributes An array containing the attributes.
-     *
-     * @return string The response content for the include.
-     *
-     * @throws \RuntimeException
-     */
-    private function handleEsiIncludeTag($attributes)
-    {
-        $options = array();
-        preg_match_all('/(src|onerror|alt)="([^"]*?)"/', $attributes[1], $matches, PREG_SET_ORDER);
-        foreach ($matches as $set) {
-            $options[$set[1]] = $set[2];
-        }
-
-        if (!isset($options['src'])) {
-            throw new \RuntimeException('Unable to process an ESI tag without a "src" attribute.');
-        }
-
-        return sprintf('<?php echo $this->esi->handle($this, %s, %s, %s) ?>'."\n",
-            var_export($options['src'], true),
-            var_export(isset($options['alt']) ? $options['alt'] : '', true),
-            isset($options['onerror']) && 'continue' == $options['onerror'] ? 'true' : 'false'
-        );
-    }
 }
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/EsiResponseCacheStrategy.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/EsiResponseCacheStrategy.php
@@ -45,7 +45,7 @@ class EsiResponseCacheStrategy implements EsiResponseCacheStrategyInterface
             $this->maxAges[] = $response->getMaxAge();
         }
 
-        $this->embeddedResponses++;
+        ++$this->embeddedResponses;
     }
 
     /**
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/HttpCache.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/HttpCache.php
@@ -24,8 +24,6 @@ use Symfony\Component\HttpFoundation\Response;
  * Cache provides HTTP caching.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class HttpCache implements HttpKernelInterface, TerminableInterface
 {
@@ -85,13 +83,13 @@ class HttpCache implements HttpKernelInterface, TerminableInterface
         register_shutdown_function(array($this->store, 'cleanup'));
 
         $this->options = array_merge(array(
-            'debug'                  => false,
-            'default_ttl'            => 0,
-            'private_headers'        => array('Authorization', 'Cookie'),
-            'allow_reload'           => false,
-            'allow_revalidate'       => false,
+            'debug' => false,
+            'default_ttl' => 0,
+            'private_headers' => array('Authorization', 'Cookie'),
+            'allow_reload' => false,
+            'allow_revalidate' => false,
             'stale_while_revalidate' => 2,
-            'stale_if_error'         => 60,
+            'stale_if_error' => 60,
         ), $options);
         $this->esi = $esi;
         $this->traces = array();
@@ -143,7 +141,7 @@ class HttpCache implements HttpKernelInterface, TerminableInterface
     }
 
     /**
-     * Gets the Kernel instance
+     * Gets the Kernel instance.
      *
      * @return HttpKernelInterface An HttpKernelInterface instance
      */
@@ -153,7 +151,7 @@ class HttpCache implements HttpKernelInterface, TerminableInterface
     }
 
     /**
-     * Gets the Esi instance
+     * Gets the Esi instance.
      *
      * @return Esi An Esi instance
      */
@@ -164,8 +162,6 @@ class HttpCache implements HttpKernelInterface, TerminableInterface
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
     {
@@ -194,7 +190,7 @@ class HttpCache implements HttpKernelInterface, TerminableInterface
 
         $this->restoreResponseBody($request, $response);
 
-        $response->setDate(new \DateTime(null, new \DateTimeZone('UTC')));
+        $response->setDate(\DateTime::createFromFormat('U', time(), new \DateTimeZone('UTC')));
 
         if (HttpKernelInterface::MASTER_REQUEST === $type && $this->options['debug']) {
             $response->headers->set('X-Symfony-Cache', $this->getLog());
@@ -217,8 +213,6 @@ class HttpCache implements HttpKernelInterface, TerminableInterface
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function terminate(Request $request, Response $response)
     {
@@ -367,7 +361,7 @@ class HttpCache implements HttpKernelInterface, TerminableInterface
         // We keep the etags from the client to handle the case when the client
         // has a different private valid entry which is not cached here.
         $cachedEtags = $entry->getEtag() ? array($entry->getEtag()) : array();
-        $requestEtags = $request->getEtags();
+        $requestEtags = $request->getETags();
         if ($etags = array_unique(array_merge($cachedEtags, $requestEtags))) {
             $subRequest->headers->set('if_none_match', implode(', ', $etags));
         }
@@ -501,7 +495,7 @@ class HttpCache implements HttpKernelInterface, TerminableInterface
      * @param Request  $request A Request instance
      * @param Response $entry   A Response instance
      *
-     * @return bool    true if the cache entry if fresh enough, false otherwise
+     * @return bool true if the cache entry if fresh enough, false otherwise
      */
     protected function isFreshEnough(Request $request, Response $entry)
     {
@@ -522,7 +516,7 @@ class HttpCache implements HttpKernelInterface, TerminableInterface
      * @param Request  $request A Request instance
      * @param Response $entry   A Response instance
      *
-     * @return bool    true if the cache entry can be returned even if it is staled, false otherwise
+     * @return bool true if the cache entry can be returned even if it is staled, false otherwise
      */
     protected function lock(Request $request, Response $entry)
     {
@@ -654,7 +648,7 @@ class HttpCache implements HttpKernelInterface, TerminableInterface
      *
      * @param Request $request A Request instance
      *
-     * @return bool    true if the Request is private, false otherwise
+     * @return bool true if the Request is private, false otherwise
      */
     private function isPrivateRequest(Request $request)
     {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/Store.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/Store.php
@@ -32,12 +32,16 @@ class Store implements StoreInterface
      * Constructor.
      *
      * @param string $root The path to the cache directory
+     *
+     * @throws \RuntimeException
      */
     public function __construct($root)
     {
         $this->root = $root;
         if (!is_dir($this->root)) {
-            mkdir($this->root, 0777, true);
+            if (false === @mkdir($this->root, 0777, true) && !is_dir($this->root)) {
+                throw new \RuntimeException(sprintf('Unable to create the store directory (%s).', $this->root));
+            }
         }
         $this->keyCache = new \SplObjectStorage();
         $this->locks = array();
@@ -69,12 +73,12 @@ class Store implements StoreInterface
      *
      * @param Request $request A Request instance
      *
-     * @return bool|string    true if the lock is acquired, the path to the current lock otherwise
+     * @return bool|string true if the lock is acquired, the path to the current lock otherwise
      */
     public function lock(Request $request)
     {
         $path = $this->getPath($this->getCacheKey($request).'.lck');
-        if (!is_dir(dirname($path)) && false === @mkdir(dirname($path), 0777, true)) {
+        if (!is_dir(dirname($path)) && false === @mkdir(dirname($path), 0777, true) && !is_dir(dirname($path))) {
             return false;
         }
 
@@ -95,7 +99,7 @@ class Store implements StoreInterface
      *
      * @param Request $request A Request instance
      *
-     * @return bool    False if the lock file does not exist or cannot be unlocked, true otherwise
+     * @return bool False if the lock file does not exist or cannot be unlocked, true otherwise
      */
     public function unlock(Request $request)
     {
@@ -127,7 +131,7 @@ class Store implements StoreInterface
         // find a cached entry that matches the request.
         $match = null;
         foreach ($entries as $entry) {
-            if ($this->requestsMatch(isset($entry[1]['vary'][0]) ? $entry[1]['vary'][0] : '', $request->headers->all(), $entry[0])) {
+            if ($this->requestsMatch(isset($entry[1]['vary'][0]) ? implode(', ', $entry[1]['vary']) : '', $request->headers->all(), $entry[0])) {
                 $match = $entry;
 
                 break;
@@ -257,7 +261,7 @@ class Store implements StoreInterface
      * @param array  $env1 A Request HTTP header array
      * @param array  $env2 A Request HTTP header array
      *
-     * @return bool    true if the two environments match, false otherwise
+     * @return bool true if the two environments match, false otherwise
      */
     private function requestsMatch($vary, $env1, $env2)
     {
@@ -300,7 +304,7 @@ class Store implements StoreInterface
      *
      * @param string $url A URL
      *
-     * @return bool    true if the URL exists and has been purged, false otherwise
+     * @return bool true if the URL exists and has been purged, false otherwise
      */
     public function purge($url)
     {
@@ -338,7 +342,7 @@ class Store implements StoreInterface
     private function save($key, $data)
     {
         $path = $this->getPath($key);
-        if (!is_dir(dirname($path)) && false === @mkdir(dirname($path), 0777, true)) {
+        if (!is_dir(dirname($path)) && false === @mkdir(dirname($path), 0777, true) && !is_dir(dirname($path))) {
             return false;
         }
 
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/StoreInterface.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpCache/StoreInterface.php
@@ -58,7 +58,7 @@ interface StoreInterface
      *
      * @param Request $request A Request instance
      *
-     * @return bool|string    true if the lock is acquired, the path to the current lock otherwise
+     * @return bool|string true if the lock is acquired, the path to the current lock otherwise
      */
     public function lock(Request $request);
 
@@ -67,7 +67,7 @@ interface StoreInterface
      *
      * @param Request $request A Request instance
      *
-     * @return bool    False if the lock file does not exist or cannot be unlocked, true otherwise
+     * @return bool False if the lock file does not exist or cannot be unlocked, true otherwise
      */
     public function unlock(Request $request);
 
@@ -76,7 +76,7 @@ interface StoreInterface
      *
      * @param Request $request A Request instance
      *
-     * @return bool    true if lock exists, false otherwise
+     * @return bool true if lock exists, false otherwise
      */
     public function isLocked(Request $request);
 
@@ -85,7 +85,7 @@ interface StoreInterface
      *
      * @param string $url A URL
      *
-     * @return bool    true if the URL exists and has been purged, false otherwise
+     * @return bool true if the URL exists and has been purged, false otherwise
      */
     public function purge($url);
 
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpKernel.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpKernel.php
@@ -28,8 +28,6 @@ use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  * HttpKernel notifies events to convert a Request object to a Response one.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class HttpKernel implements HttpKernelInterface, TerminableInterface
 {
@@ -37,12 +35,10 @@ class HttpKernel implements HttpKernelInterface, TerminableInterface
     protected $resolver;
 
     /**
-     * Constructor
+     * Constructor.
      *
      * @param EventDispatcherInterface    $dispatcher An EventDispatcherInterface instance
      * @param ControllerResolverInterface $resolver   A ControllerResolverInterface instance
-     *
-     * @api
      */
     public function __construct(EventDispatcherInterface $dispatcher, ControllerResolverInterface $resolver)
     {
@@ -52,8 +48,6 @@ class HttpKernel implements HttpKernelInterface, TerminableInterface
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
     {
@@ -70,8 +64,6 @@ class HttpKernel implements HttpKernelInterface, TerminableInterface
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function terminate(Request $request, Response $response)
     {
@@ -88,7 +80,7 @@ class HttpKernel implements HttpKernelInterface, TerminableInterface
      *
      * @return Response A Response instance
      *
-     * @throws \LogicException If one of the listener does not behave as expected
+     * @throws \LogicException       If one of the listener does not behave as expected
      * @throws NotFoundHttpException When controller cannot be found
      */
     private function handleRaw(Request $request, $type = self::MASTER_REQUEST)
@@ -219,7 +211,7 @@ class HttpKernel implements HttpKernelInterface, TerminableInterface
                 $a[] = sprintf('%s => %s', $k, $this->varToString($v));
             }
 
-            return sprintf("Array(%s)", implode(', ', $a));
+            return sprintf('Array(%s)', implode(', ', $a));
         }
 
         if (is_resource($var)) {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpKernelInterface.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/HttpKernelInterface.php
@@ -18,8 +18,6 @@ use Symfony\Component\HttpFoundation\Response;
  * HttpKernelInterface handles a Request to convert it to a Response.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 interface HttpKernelInterface
 {
@@ -34,14 +32,12 @@ interface HttpKernelInterface
      *
      * @param Request $request A Request instance
      * @param int     $type    The type of the request
-     *                          (one of HttpKernelInterface::MASTER_REQUEST or HttpKernelInterface::SUB_REQUEST)
-     * @param bool    $catch Whether to catch exceptions or not
+     *                         (one of HttpKernelInterface::MASTER_REQUEST or HttpKernelInterface::SUB_REQUEST)
+     * @param bool    $catch   Whether to catch exceptions or not
      *
      * @return Response A Response instance
      *
      * @throws \Exception When an Exception occurs during processing
-     *
-     * @api
      */
     public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true);
 }
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Kernel.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Kernel.php
@@ -25,6 +25,7 @@ use Symfony\Component\DependencyInjection\Loader\ClosureLoader;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\Response;
 use Symfony\Component\HttpKernel\Bundle\BundleInterface;
+use Symfony\Component\HttpKernel\Config\EnvParametersResource;
 use Symfony\Component\HttpKernel\Config\FileLocator;
 use Symfony\Component\HttpKernel\DependencyInjection\MergeExtensionConfigurationPass;
 use Symfony\Component\HttpKernel\DependencyInjection\AddClassesToCachePass;
@@ -39,8 +40,6 @@ use Symfony\Component\ClassLoader\ClassCollectionLoader;
  * It manages an environment made of bundles.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 abstract class Kernel implements KernelInterface, TerminableInterface
 {
@@ -59,20 +58,18 @@ abstract class Kernel implements KernelInterface, TerminableInterface
     protected $startTime;
     protected $loadClassCache;
 
-    const VERSION         = '2.3.21';
-    const VERSION_ID      = '20321';
-    const MAJOR_VERSION   = '2';
-    const MINOR_VERSION   = '3';
-    const RELEASE_VERSION = '21';
-    const EXTRA_VERSION   = '';
+    const VERSION = '2.3.35';
+    const VERSION_ID = 20335;
+    const MAJOR_VERSION = 2;
+    const MINOR_VERSION = 3;
+    const RELEASE_VERSION = 35;
+    const EXTRA_VERSION = '';
 
     /**
      * Constructor.
      *
-     * @param string  $environment The environment
-     * @param bool    $debug       Whether to enable debugging or not
-     *
-     * @api
+     * @param string $environment The environment
+     * @param bool   $debug       Whether to enable debugging or not
      */
     public function __construct($environment, $debug)
     {
@@ -109,8 +106,6 @@ abstract class Kernel implements KernelInterface, TerminableInterface
 
     /**
      * Boots the current kernel.
-     *
-     * @api
      */
     public function boot()
     {
@@ -138,8 +133,6 @@ abstract class Kernel implements KernelInterface, TerminableInterface
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function terminate(Request $request, Response $response)
     {
@@ -154,8 +147,6 @@ abstract class Kernel implements KernelInterface, TerminableInterface
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function shutdown()
     {
@@ -175,8 +166,6 @@ abstract class Kernel implements KernelInterface, TerminableInterface
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
     {
@@ -188,7 +177,7 @@ abstract class Kernel implements KernelInterface, TerminableInterface
     }
 
     /**
-     * Gets a HTTP kernel from the container
+     * Gets a HTTP kernel from the container.
      *
      * @return HttpKernel
      */
@@ -199,8 +188,6 @@ abstract class Kernel implements KernelInterface, TerminableInterface
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function getBundles()
     {
@@ -209,8 +196,6 @@ abstract class Kernel implements KernelInterface, TerminableInterface
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function isClassInActiveBundle($class)
     {
@@ -225,8 +210,6 @@ abstract class Kernel implements KernelInterface, TerminableInterface
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function getBundle($name, $first = true)
     {
@@ -242,35 +225,9 @@ abstract class Kernel implements KernelInterface, TerminableInterface
     }
 
     /**
-     * Returns the file path for a given resource.
-     *
-     * A Resource can be a file or a directory.
-     *
-     * The resource name must follow the following pattern:
-     *
-     *     @<BundleName>/path/to/a/file.something
-     *
-     * where BundleName is the name of the bundle
-     * and the remaining part is the relative path in the bundle.
-     *
-     * If $dir is passed, and the first segment of the path is "Resources",
-     * this method will look for a file named:
-     *
-     *     $dir/<BundleName>/path/without/Resources
-     *
-     * before looking in the bundle resource folder.
-     *
-     * @param string  $name  A resource name to locate
-     * @param string  $dir   A directory where to look for the resource first
-     * @param bool    $first Whether to return the first path or paths for all matching bundles
-     *
-     * @return string|array The absolute path of the resource or an array if $first is false
-     *
-     * @throws \InvalidArgumentException if the file cannot be found or the name is not valid
-     * @throws \RuntimeException         if the name contains invalid/unsafe
-     * @throws \RuntimeException         if a custom resource is hidden by a resource in a derived bundle
+     * {@inheritdoc}
      *
-     * @api
+     * @throws \RuntimeException if a custom resource is hidden by a resource in a derived bundle
      */
     public function locateResource($name, $dir = null, $first = true)
     {
@@ -328,8 +285,6 @@ abstract class Kernel implements KernelInterface, TerminableInterface
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function getName()
     {
@@ -342,8 +297,6 @@ abstract class Kernel implements KernelInterface, TerminableInterface
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function getEnvironment()
     {
@@ -352,8 +305,6 @@ abstract class Kernel implements KernelInterface, TerminableInterface
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function isDebug()
     {
@@ -362,14 +313,12 @@ abstract class Kernel implements KernelInterface, TerminableInterface
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function getRootDir()
     {
         if (null === $this->rootDir) {
             $r = new \ReflectionObject($this);
-            $this->rootDir = str_replace('\\', '/', dirname($r->getFileName()));
+            $this->rootDir = dirname($r->getFileName());
         }
 
         return $this->rootDir;
@@ -377,8 +326,6 @@ abstract class Kernel implements KernelInterface, TerminableInterface
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function getContainer()
     {
@@ -412,8 +359,6 @@ abstract class Kernel implements KernelInterface, TerminableInterface
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function getStartTime()
     {
@@ -422,8 +367,6 @@ abstract class Kernel implements KernelInterface, TerminableInterface
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function getCacheDir()
     {
@@ -432,8 +375,6 @@ abstract class Kernel implements KernelInterface, TerminableInterface
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function getLogDir()
     {
@@ -442,8 +383,6 @@ abstract class Kernel implements KernelInterface, TerminableInterface
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function getCharset()
     {
@@ -586,14 +525,14 @@ abstract class Kernel implements KernelInterface, TerminableInterface
 
         return array_merge(
             array(
-                'kernel.root_dir'        => $this->rootDir,
-                'kernel.environment'     => $this->environment,
-                'kernel.debug'           => $this->debug,
-                'kernel.name'            => $this->name,
-                'kernel.cache_dir'       => $this->getCacheDir(),
-                'kernel.logs_dir'        => $this->getLogDir(),
-                'kernel.bundles'         => $bundles,
-                'kernel.charset'         => $this->getCharset(),
+                'kernel.root_dir' => realpath($this->rootDir) ?: $this->rootDir,
+                'kernel.environment' => $this->environment,
+                'kernel.debug' => $this->debug,
+                'kernel.name' => $this->name,
+                'kernel.cache_dir' => realpath($this->getCacheDir()) ?: $this->getCacheDir(),
+                'kernel.logs_dir' => realpath($this->getLogDir()) ?: $this->getLogDir(),
+                'kernel.bundles' => $bundles,
+                'kernel.charset' => $this->getCharset(),
                 'kernel.container_class' => $this->getContainerClass(),
             ),
             $this->getEnvParameters()
@@ -630,7 +569,7 @@ abstract class Kernel implements KernelInterface, TerminableInterface
     {
         foreach (array('cache' => $this->getCacheDir(), 'logs' => $this->getLogDir()) as $name => $dir) {
             if (!is_dir($dir)) {
-                if (false === @mkdir($dir, 0777, true)) {
+                if (false === @mkdir($dir, 0777, true) && !is_dir($dir)) {
                     throw new \RuntimeException(sprintf("Unable to create the %s directory (%s)\n", $name, $dir));
                 }
             } elseif (!is_writable($dir)) {
@@ -647,6 +586,7 @@ abstract class Kernel implements KernelInterface, TerminableInterface
         }
 
         $container->addCompilerPass(new AddClassesToCachePass($this));
+        $container->addResource(new EnvParametersResource('SYMFONY__'));
 
         return $container;
     }
@@ -686,7 +626,7 @@ abstract class Kernel implements KernelInterface, TerminableInterface
     {
         $container = new ContainerBuilder(new ParameterBag($this->getKernelParameters()));
 
-        if (class_exists('ProxyManager\Configuration')) {
+        if (class_exists('ProxyManager\Configuration') && class_exists('Symfony\Bridge\ProxyManager\LazyProxy\Instantiator\RuntimeInstantiator')) {
             $container->setProxyInstantiator(new RuntimeInstantiator());
         }
 
@@ -706,11 +646,11 @@ abstract class Kernel implements KernelInterface, TerminableInterface
         // cache the container
         $dumper = new PhpDumper($container);
 
-        if (class_exists('ProxyManager\Configuration')) {
-            $dumper->setProxyDumper(new ProxyDumper());
+        if (class_exists('ProxyManager\Configuration') && class_exists('Symfony\Bridge\ProxyManager\LazyProxy\PhpDumper\ProxyDumper')) {
+            $dumper->setProxyDumper(new ProxyDumper(md5((string) $cache)));
         }
 
-        $content = $dumper->dump(array('class' => $class, 'base_class' => $baseClass));
+        $content = $dumper->dump(array('class' => $class, 'base_class' => $baseClass, 'file' => (string) $cache));
         if (!$this->debug) {
             $content = static::stripComments($content);
         }
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/KernelEvents.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/KernelEvents.php
@@ -12,93 +12,93 @@
 namespace Symfony\Component\HttpKernel;
 
 /**
- * Contains all events thrown in the HttpKernel component
+ * Contains all events thrown in the HttpKernel component.
  *
  * @author Bernhard Schussek <bschussek@gmail.com>
- *
- * @api
  */
 final class KernelEvents
 {
     /**
      * The REQUEST event occurs at the very beginning of request
-     * dispatching
+     * dispatching.
      *
      * This event allows you to create a response for a request before any
      * other code in the framework is executed. The event listener method
      * receives a Symfony\Component\HttpKernel\Event\GetResponseEvent
      * instance.
      *
-     * @var string
+     * @Event
      *
-     * @api
+     * @var string
      */
     const REQUEST = 'kernel.request';
 
     /**
-     * The EXCEPTION event occurs when an uncaught exception appears
+     * The EXCEPTION event occurs when an uncaught exception appears.
      *
      * This event allows you to create a response for a thrown exception or
      * to modify the thrown exception. The event listener method receives
      * a Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent
      * instance.
      *
-     * @var string
+     * @Event
      *
-     * @api
+     * @var string
      */
     const EXCEPTION = 'kernel.exception';
 
     /**
      * The VIEW event occurs when the return value of a controller
-     * is not a Response instance
+     * is not a Response instance.
      *
      * This event allows you to create a response for the return value of the
      * controller. The event listener method receives a
      * Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent
      * instance.
      *
-     * @var string
+     * @Event
      *
-     * @api
+     * @var string
      */
     const VIEW = 'kernel.view';
 
     /**
      * The CONTROLLER event occurs once a controller was found for
-     * handling a request
+     * handling a request.
      *
      * This event allows you to change the controller that will handle the
      * request. The event listener method receives a
      * Symfony\Component\HttpKernel\Event\FilterControllerEvent instance.
      *
-     * @var string
+     * @Event
      *
-     * @api
+     * @var string
      */
     const CONTROLLER = 'kernel.controller';
 
     /**
      * The RESPONSE event occurs once a response was created for
-     * replying to a request
+     * replying to a request.
      *
      * This event allows you to modify or replace the response that will be
      * replied. The event listener method receives a
      * Symfony\Component\HttpKernel\Event\FilterResponseEvent instance.
      *
-     * @var string
+     * @Event
      *
-     * @api
+     * @var string
      */
     const RESPONSE = 'kernel.response';
 
     /**
-     * The TERMINATE event occurs once a response was sent
+     * The TERMINATE event occurs once a response was sent.
      *
      * This event allows you to run expensive post-response jobs.
      * The event listener method receives a
      * Symfony\Component\HttpKernel\Event\PostResponseEvent instance.
      *
+     * @Event
+     *
      * @var string
      */
     const TERMINATE = 'kernel.terminate';
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/KernelInterface.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/KernelInterface.php
@@ -21,8 +21,6 @@ use Symfony\Component\Config\Loader\LoaderInterface;
  * It manages an environment made of bundles.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 interface KernelInterface extends HttpKernelInterface, \Serializable
 {
@@ -30,8 +28,6 @@ interface KernelInterface extends HttpKernelInterface, \Serializable
      * Returns an array of bundles to register.
      *
      * @return BundleInterface[] An array of bundle instances.
-     *
-     * @api
      */
     public function registerBundles();
 
@@ -39,15 +35,11 @@ interface KernelInterface extends HttpKernelInterface, \Serializable
      * Loads the container configuration.
      *
      * @param LoaderInterface $loader A LoaderInterface instance
-     *
-     * @api
      */
     public function registerContainerConfiguration(LoaderInterface $loader);
 
     /**
      * Boots the current kernel.
-     *
-     * @api
      */
     public function boot();
 
@@ -55,8 +47,6 @@ interface KernelInterface extends HttpKernelInterface, \Serializable
      * Shutdowns the kernel.
      *
      * This method is mainly useful when doing functional testing.
-     *
-     * @api
      */
     public function shutdown();
 
@@ -64,8 +54,6 @@ interface KernelInterface extends HttpKernelInterface, \Serializable
      * Gets the registered bundle instances.
      *
      * @return BundleInterface[] An array of registered bundle instances
-     *
-     * @api
      */
     public function getBundles();
 
@@ -74,23 +62,19 @@ interface KernelInterface extends HttpKernelInterface, \Serializable
      *
      * @param string $class A class name
      *
-     * @return bool    true if the class belongs to an active bundle, false otherwise
-     *
-     * @api
+     * @return bool true if the class belongs to an active bundle, false otherwise
      */
     public function isClassInActiveBundle($class);
 
     /**
      * Returns a bundle and optionally its descendants by its name.
      *
-     * @param string  $name  Bundle name
-     * @param bool    $first Whether to return the first bundle only or together with its descendants
+     * @param string $name  Bundle name
+     * @param bool   $first Whether to return the first bundle only or together with its descendants
      *
      * @return BundleInterface|BundleInterface[] A BundleInterface instance or an array of BundleInterface instances if $first is false
      *
      * @throws \InvalidArgumentException when the bundle is not enabled
-     *
-     * @api
      */
     public function getBundle($name, $first = true);
 
@@ -101,26 +85,26 @@ interface KernelInterface extends HttpKernelInterface, \Serializable
      *
      * The resource name must follow the following pattern:
      *
-     *     @BundleName/path/to/a/file.something
+     *     "@BundleName/path/to/a/file.something"
      *
      * where BundleName is the name of the bundle
      * and the remaining part is the relative path in the bundle.
      *
-     * If $dir is passed, and the first segment of the path is Resources,
+     * If $dir is passed, and the first segment of the path is "Resources",
      * this method will look for a file named:
      *
-     *     $dir/BundleName/path/without/Resources
+     *     $dir/<BundleName>/path/without/Resources
      *
-     * @param string  $name  A resource name to locate
-     * @param string  $dir   A directory where to look for the resource first
-     * @param bool    $first Whether to return the first path or paths for all matching bundles
+     * before looking in the bundle resource folder.
+     *
+     * @param string $name  A resource name to locate
+     * @param string $dir   A directory where to look for the resource first
+     * @param bool   $first Whether to return the first path or paths for all matching bundles
      *
      * @return string|array The absolute path of the resource or an array if $first is false
      *
      * @throws \InvalidArgumentException if the file cannot be found or the name is not valid
      * @throws \RuntimeException         if the name contains invalid/unsafe characters
-     *
-     * @api
      */
     public function locateResource($name, $dir = null, $first = true);
 
@@ -128,8 +112,6 @@ interface KernelInterface extends HttpKernelInterface, \Serializable
      * Gets the name of the kernel.
      *
      * @return string The kernel name
-     *
-     * @api
      */
     public function getName();
 
@@ -137,17 +119,13 @@ interface KernelInterface extends HttpKernelInterface, \Serializable
      * Gets the environment.
      *
      * @return string The current environment
-     *
-     * @api
      */
     public function getEnvironment();
 
     /**
      * Checks if debug mode is enabled.
      *
-     * @return bool    true if debug mode is enabled, false otherwise
-     *
-     * @api
+     * @return bool true if debug mode is enabled, false otherwise
      */
     public function isDebug();
 
@@ -155,8 +133,6 @@ interface KernelInterface extends HttpKernelInterface, \Serializable
      * Gets the application root dir.
      *
      * @return string The application root dir
-     *
-     * @api
      */
     public function getRootDir();
 
@@ -164,17 +140,13 @@ interface KernelInterface extends HttpKernelInterface, \Serializable
      * Gets the current container.
      *
      * @return ContainerInterface A ContainerInterface instance
-     *
-     * @api
      */
     public function getContainer();
 
     /**
      * Gets the request start time (not available if debug is disabled).
      *
-     * @return int     The request start timestamp
-     *
-     * @api
+     * @return int The request start timestamp
      */
     public function getStartTime();
 
@@ -182,8 +154,6 @@ interface KernelInterface extends HttpKernelInterface, \Serializable
      * Gets the cache directory.
      *
      * @return string The cache directory
-     *
-     * @api
      */
     public function getCacheDir();
 
@@ -191,8 +161,6 @@ interface KernelInterface extends HttpKernelInterface, \Serializable
      * Gets the log directory.
      *
      * @return string The log directory
-     *
-     * @api
      */
     public function getLogDir();
 
@@ -200,8 +168,6 @@ interface KernelInterface extends HttpKernelInterface, \Serializable
      * Gets the charset of the application.
      *
      * @return string The charset
-     *
-     * @api
      */
     public function getCharset();
 }
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/LICENSE
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2014 Fabien Potencier
+Copyright (c) 2004-2015 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
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Log/DebugLoggerInterface.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Log/DebugLoggerInterface.php
@@ -32,7 +32,7 @@ interface DebugLoggerInterface
     /**
      * Returns the number of errors.
      *
-     * @return int     The number of errors
+     * @return int The number of errors
      */
     public function countErrors();
 }
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Log/LoggerInterface.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Log/LoggerInterface.php
@@ -19,30 +19,25 @@ use Psr\Log\LoggerInterface as PsrLogger;
  * @author Fabien Potencier <fabien@symfony.com>
  *
  * @deprecated since 2.2, to be removed in 3.0. Type-hint \Psr\Log\LoggerInterface instead.
- * @api
  */
 interface LoggerInterface extends PsrLogger
 {
     /**
-     * @api
      * @deprecated since 2.2, to be removed in 3.0. Use emergency() which is PSR-3 compatible.
      */
     public function emerg($message, array $context = array());
 
     /**
-     * @api
      * @deprecated since 2.2, to be removed in 3.0. Use critical() which is PSR-3 compatible.
      */
     public function crit($message, array $context = array());
 
     /**
-     * @api
      * @deprecated since 2.2, to be removed in 3.0. Use error() which is PSR-3 compatible.
      */
     public function err($message, array $context = array());
 
     /**
-     * @api
      * @deprecated since 2.2, to be removed in 3.0. Use warning() which is PSR-3 compatible.
      */
     public function warn($message, array $context = array());
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Log/NullLogger.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Log/NullLogger.php
@@ -17,13 +17,10 @@ use Psr\Log\NullLogger as PsrNullLogger;
  * NullLogger.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class NullLogger extends PsrNullLogger implements LoggerInterface
 {
     /**
-     * @api
      * @deprecated since 2.2, to be removed in 3.0. Use emergency() which is PSR-3 compatible.
      */
     public function emerg($message, array $context = array())
@@ -31,7 +28,6 @@ class NullLogger extends PsrNullLogger implements LoggerInterface
     }
 
     /**
-     * @api
      * @deprecated since 2.2, to be removed in 3.0. Use critical() which is PSR-3 compatible.
      */
     public function crit($message, array $context = array())
@@ -39,7 +35,6 @@ class NullLogger extends PsrNullLogger implements LoggerInterface
     }
 
     /**
-     * @api
      * @deprecated since 2.2, to be removed in 3.0. Use error() which is PSR-3 compatible.
      */
     public function err($message, array $context = array())
@@ -47,7 +42,6 @@ class NullLogger extends PsrNullLogger implements LoggerInterface
     }
 
     /**
-     * @api
      * @deprecated since 2.2, to be removed in 3.0. Use warning() which is PSR-3 compatible.
      */
     public function warn($message, array $context = array())
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/BaseMemcacheProfilerStorage.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/BaseMemcacheProfilerStorage.php
@@ -77,12 +77,12 @@ abstract class BaseMemcacheProfilerStorage implements ProfilerStorageInterface
                 continue;
             }
 
-            $result[$itemToken]  = array(
-                'token'  => $itemToken,
-                'ip'     => $itemIp,
+            $result[$itemToken] = array(
+                'token' => $itemToken,
+                'ip' => $itemIp,
                 'method' => $itemMethod,
-                'url'    => $itemUrl,
-                'time'   => $itemTime,
+                'url' => $itemUrl,
+                'time' => $itemTime,
                 'parent' => $itemParent,
             );
             --$limit;
@@ -152,14 +152,14 @@ abstract class BaseMemcacheProfilerStorage implements ProfilerStorageInterface
     public function write(Profile $profile)
     {
         $data = array(
-            'token'    => $profile->getToken(),
-            'parent'   => $profile->getParentToken(),
+            'token' => $profile->getToken(),
+            'parent' => $profile->getParentToken(),
             'children' => array_map(function ($p) { return $p->getToken(); }, $profile->getChildren()),
-            'data'     => $profile->getCollectors(),
-            'ip'       => $profile->getIp(),
-            'method'   => $profile->getMethod(),
-            'url'      => $profile->getUrl(),
-            'time'     => $profile->getTime(),
+            'data' => $profile->getCollectors(),
+            'ip' => $profile->getIp(),
+            'method' => $profile->getMethod(),
+            'url' => $profile->getUrl(),
+            'time' => $profile->getTime(),
         );
 
         $profileIndexed = false !== $this->getValue($this->getItemName($profile->getToken()));
@@ -188,7 +188,7 @@ abstract class BaseMemcacheProfilerStorage implements ProfilerStorageInterface
     }
 
     /**
-     * Retrieve item from the memcache server
+     * Retrieve item from the memcache server.
      *
      * @param string $key
      *
@@ -197,7 +197,7 @@ abstract class BaseMemcacheProfilerStorage implements ProfilerStorageInterface
     abstract protected function getValue($key);
 
     /**
-     * Store an item on the memcache server under the specified key
+     * Store an item on the memcache server under the specified key.
      *
      * @param string $key
      * @param mixed  $value
@@ -208,7 +208,7 @@ abstract class BaseMemcacheProfilerStorage implements ProfilerStorageInterface
     abstract protected function setValue($key, $value, $expiration = 0);
 
     /**
-     * Delete item from the memcache server
+     * Delete item from the memcache server.
      *
      * @param string $key
      *
@@ -217,7 +217,8 @@ abstract class BaseMemcacheProfilerStorage implements ProfilerStorageInterface
     abstract protected function delete($key);
 
     /**
-     * Append data to an existing item on the memcache server
+     * Append data to an existing item on the memcache server.
+     *
      * @param string $key
      * @param string $value
      * @param int    $expiration
@@ -259,7 +260,7 @@ abstract class BaseMemcacheProfilerStorage implements ProfilerStorageInterface
     }
 
     /**
-     * Get item name
+     * Get item name.
      *
      * @param string $token
      *
@@ -277,7 +278,7 @@ abstract class BaseMemcacheProfilerStorage implements ProfilerStorageInterface
     }
 
     /**
-     * Get name of index
+     * Get name of index.
      *
      * @return string
      */
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/FileProfilerStorage.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/FileProfilerStorage.php
@@ -1,4 +1,5 @@
 <?php
+
 /*
  * This file is part of the Symfony package.
  *
@@ -40,8 +41,8 @@ class FileProfilerStorage implements ProfilerStorageInterface
         }
         $this->folder = substr($dsn, 5);
 
-        if (!is_dir($this->folder)) {
-            mkdir($this->folder, 0777, true);
+        if (!is_dir($this->folder) && false === @mkdir($this->folder, 0777, true) && !is_dir($this->folder)) {
+            throw new \RuntimeException(sprintf('Unable to create the storage directory (%s).', $this->folder));
         }
     }
 
@@ -78,11 +79,11 @@ class FileProfilerStorage implements ProfilerStorageInterface
             }
 
             $result[$csvToken] = array(
-                'token'  => $csvToken,
-                'ip'     => $csvIp,
+                'token' => $csvToken,
+                'ip' => $csvIp,
                 'method' => $csvMethod,
-                'url'    => $csvUrl,
-                'time'   => $csvTime,
+                'url' => $csvUrl,
+                'time' => $csvTime,
                 'parent' => $csvParent,
             );
         }
@@ -124,6 +125,8 @@ class FileProfilerStorage implements ProfilerStorageInterface
 
     /**
      * {@inheritdoc}
+     *
+     * @throws \RuntimeException
      */
     public function write(Profile $profile)
     {
@@ -133,21 +136,21 @@ class FileProfilerStorage implements ProfilerStorageInterface
         if (!$profileIndexed) {
             // Create directory
             $dir = dirname($file);
-            if (!is_dir($dir)) {
-                mkdir($dir, 0777, true);
+            if (!is_dir($dir) && false === @mkdir($dir, 0777, true) && !is_dir($dir)) {
+                throw new \RuntimeException(sprintf('Unable to create the storage directory (%s).', $dir));
             }
         }
 
         // Store profile
         $data = array(
-            'token'    => $profile->getToken(),
-            'parent'   => $profile->getParentToken(),
+            'token' => $profile->getToken(),
+            'parent' => $profile->getParentToken(),
             'children' => array_map(function ($p) { return $p->getToken(); }, $profile->getChildren()),
-            'data'     => $profile->getCollectors(),
-            'ip'       => $profile->getIp(),
-            'method'   => $profile->getMethod(),
-            'url'      => $profile->getUrl(),
-            'time'     => $profile->getTime(),
+            'data' => $profile->getCollectors(),
+            'ip' => $profile->getIp(),
+            'method' => $profile->getMethod(),
+            'url' => $profile->getUrl(),
+            'time' => $profile->getTime(),
         );
 
         if (false === file_put_contents($file, serialize($data))) {
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/MemcacheProfilerStorage.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/MemcacheProfilerStorage.php
@@ -12,7 +12,7 @@
 namespace Symfony\Component\HttpKernel\Profiler;
 
 /**
- * Memcache Profiler Storage
+ * Memcache Profiler Storage.
  *
  * @author Andrej Hudec <pulzarraider@gmail.com>
  */
@@ -24,7 +24,7 @@ class MemcacheProfilerStorage extends BaseMemcacheProfilerStorage
     private $memcache;
 
     /**
-     * Internal convenience method that returns the instance of the Memcache
+     * Internal convenience method that returns the instance of the Memcache.
      *
      * @return \Memcache
      *
@@ -41,7 +41,7 @@ class MemcacheProfilerStorage extends BaseMemcacheProfilerStorage
             $port = $matches[3];
 
             $memcache = new \Memcache();
-            $memcache->addServer($host, $port);
+            $memcache->addserver($host, $port);
 
             $this->memcache = $memcache;
         }
@@ -50,7 +50,7 @@ class MemcacheProfilerStorage extends BaseMemcacheProfilerStorage
     }
 
     /**
-     * Set instance of the Memcache
+     * Set instance of the Memcache.
      *
      * @param \Memcache $memcache
      */
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/MemcachedProfilerStorage.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/MemcachedProfilerStorage.php
@@ -12,7 +12,7 @@
 namespace Symfony\Component\HttpKernel\Profiler;
 
 /**
- * Memcached Profiler Storage
+ * Memcached Profiler Storage.
  *
  * @author Andrej Hudec <pulzarraider@gmail.com>
  */
@@ -24,7 +24,7 @@ class MemcachedProfilerStorage extends BaseMemcacheProfilerStorage
     private $memcached;
 
     /**
-     * Internal convenience method that returns the instance of the Memcached
+     * Internal convenience method that returns the instance of the Memcached.
      *
      * @return \Memcached
      *
@@ -54,7 +54,7 @@ class MemcachedProfilerStorage extends BaseMemcacheProfilerStorage
     }
 
     /**
-     * Set instance of the Memcached
+     * Set instance of the Memcached.
      *
      * @param \Memcached $memcached
      */
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/MongoDbProfilerStorage.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/MongoDbProfilerStorage.php
@@ -20,10 +20,10 @@ class MongoDbProfilerStorage implements ProfilerStorageInterface
     /**
      * Constructor.
      *
-     * @param string  $dsn      A data source name
-     * @param string  $username Not used
-     * @param string  $password Not used
-     * @param int     $lifetime The lifetime to use for the purge
+     * @param string $dsn      A data source name
+     * @param string $username Not used
+     * @param string $password Not used
+     * @param int    $lifetime The lifetime to use for the purge
      */
     public function __construct($dsn, $username = '', $password = '', $lifetime = 86400)
     {
@@ -91,7 +91,7 @@ class MongoDbProfilerStorage implements ProfilerStorageInterface
     }
 
     /**
-     * Internal convenience method that returns the instance of the MongoDB Collection
+     * Internal convenience method that returns the instance of the MongoDB Collection.
      *
      * @return \MongoCollection
      *
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/MysqlProfilerStorage.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/MysqlProfilerStorage.php
@@ -12,7 +12,7 @@
 namespace Symfony\Component\HttpKernel\Profiler;
 
 /**
- * A ProfilerStorage for Mysql
+ * A ProfilerStorage for Mysql.
  *
  * @author Jan Schumann <js@schumann-it.com>
  */
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/PdoProfilerStorage.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/PdoProfilerStorage.php
@@ -28,10 +28,10 @@ abstract class PdoProfilerStorage implements ProfilerStorageInterface
     /**
      * Constructor.
      *
-     * @param string  $dsn      A data source name
-     * @param string  $username The username for the database
-     * @param string  $password The password for the database
-     * @param int     $lifetime The lifetime to use for the purge
+     * @param string $dsn      A data source name
+     * @param string $username The username for the database
+     * @param string $password The password for the database
+     * @param int    $lifetime The lifetime to use for the purge
      */
     public function __construct($dsn, $username = '', $password = '', $lifetime = 86400)
     {
@@ -86,13 +86,13 @@ abstract class PdoProfilerStorage implements ProfilerStorageInterface
     {
         $db = $this->initDb();
         $args = array(
-            ':token'      => $profile->getToken(),
-            ':parent'     => $profile->getParentToken(),
-            ':data'       => base64_encode(serialize($profile->getCollectors())),
-            ':ip'         => $profile->getIp(),
-            ':method'     => $profile->getMethod(),
-            ':url'        => $profile->getUrl(),
-            ':time'       => $profile->getTime(),
+            ':token' => $profile->getToken(),
+            ':parent' => $profile->getParentToken(),
+            ':data' => base64_encode(serialize($profile->getCollectors())),
+            ':ip' => $profile->getIp(),
+            ':method' => $profile->getMethod(),
+            ':url' => $profile->getUrl(),
+            ':time' => $profile->getTime(),
             ':created_at' => time(),
         );
 
@@ -124,7 +124,7 @@ abstract class PdoProfilerStorage implements ProfilerStorageInterface
     }
 
     /**
-     * Build SQL criteria to fetch records by ip and url
+     * Build SQL criteria to fetch records by ip and url.
      *
      * @param string $ip     The IP
      * @param string $url    The URL
@@ -138,7 +138,7 @@ abstract class PdoProfilerStorage implements ProfilerStorageInterface
     abstract protected function buildCriteria($ip, $url, $start, $end, $limit, $method);
 
     /**
-     * Initializes the database
+     * Initializes the database.
      *
      * @throws \RuntimeException When the requested database driver is not installed
      */
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/Profile.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/Profile.php
@@ -73,7 +73,7 @@ class Profile
     }
 
     /**
-     * Sets the parent token
+     * Sets the parent token.
      *
      * @param Profile $parent The parent Profile
      */
@@ -195,7 +195,7 @@ class Profile
     }
 
     /**
-     * Adds the child token
+     * Adds the child token.
      *
      * @param Profile $child The child Profile
      */
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/ProfilerStorageInterface.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/ProfilerStorageInterface.php
@@ -48,7 +48,7 @@ interface ProfilerStorageInterface
      *
      * @param Profile $profile A Profile instance
      *
-     * @return bool    Write operation successful
+     * @return bool Write operation successful
      */
     public function write(Profile $profile);
 
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/RedisProfilerStorage.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Profiler/RedisProfilerStorage.php
@@ -88,11 +88,11 @@ class RedisProfilerStorage implements ProfilerStorageInterface
             }
 
             $result[] = array(
-                'token'  => $itemToken,
-                'ip'     => $itemIp,
+                'token' => $itemToken,
+                'ip' => $itemIp,
                 'method' => $itemMethod,
-                'url'    => $itemUrl,
-                'time'   => $itemTime,
+                'url' => $itemUrl,
+                'time' => $itemTime,
                 'parent' => $itemParent,
             );
             --$limit;
@@ -158,14 +158,14 @@ class RedisProfilerStorage implements ProfilerStorageInterface
     public function write(Profile $profile)
     {
         $data = array(
-            'token'    => $profile->getToken(),
-            'parent'   => $profile->getParentToken(),
+            'token' => $profile->getToken(),
+            'parent' => $profile->getParentToken(),
             'children' => array_map(function ($p) { return $p->getToken(); }, $profile->getChildren()),
-            'data'     => $profile->getCollectors(),
-            'ip'       => $profile->getIp(),
-            'method'   => $profile->getMethod(),
-            'url'      => $profile->getUrl(),
-            'time'     => $profile->getTime(),
+            'data' => $profile->getCollectors(),
+            'ip' => $profile->getIp(),
+            'method' => $profile->getMethod(),
+            'url' => $profile->getUrl(),
+            'time' => $profile->getTime(),
         );
 
         $profileIndexed = false !== $this->getValue($this->getItemName($profile->getToken()));
@@ -233,7 +233,7 @@ class RedisProfilerStorage implements ProfilerStorageInterface
     }
 
     /**
-     * Set instance of the Redis
+     * Set instance of the Redis.
      *
      * @param \Redis $redis
      */
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/TerminableInterface.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/TerminableInterface.php
@@ -20,8 +20,6 @@ use Symfony\Component\HttpFoundation\Response;
  *
  * @author Jordi Boggiano <j.boggiano@seld.be>
  * @author Pierre Minnieur <pierre.minnieur@sensiolabs.de>
- *
- * @api
  */
 interface TerminableInterface
 {
@@ -32,8 +30,6 @@ interface TerminableInterface
      *
      * @param Request  $request  A Request instance
      * @param Response $response A Response instance
-     *
-     * @api
      */
     public function terminate(Request $request, Response $response);
 }
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/UriSigner.php
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/UriSigner.php
@@ -42,6 +42,15 @@ class UriSigner
      */
     public function sign($uri)
     {
+        $url = parse_url($uri);
+        if (isset($url['query'])) {
+            parse_str($url['query'], $params);
+        } else {
+            $params = array();
+        }
+
+        $uri = $this->buildUrl($url, $params);
+
         return $uri.(false === (strpos($uri, '?')) ? '?' : '&').'_hash='.$this->computeHash($uri);
     }
 
@@ -54,19 +63,47 @@ class UriSigner
      *
      * @param string $uri A signed URI
      *
-     * @return bool    True if the URI is signed correctly, false otherwise
+     * @return bool True if the URI is signed correctly, false otherwise
      */
     public function check($uri)
     {
-        if (!preg_match('/^(.*)(?:\?|&)_hash=(.+?)$/', $uri, $matches)) {
+        $url = parse_url($uri);
+        if (isset($url['query'])) {
+            parse_str($url['query'], $params);
+        } else {
+            $params = array();
+        }
+
+        if (empty($params['_hash'])) {
             return false;
         }
 
-        return $this->computeHash($matches[1]) === $matches[2];
+        $hash = urlencode($params['_hash']);
+        unset($params['_hash']);
+
+        return $this->computeHash($this->buildUrl($url, $params)) === $hash;
     }
 
     private function computeHash($uri)
     {
         return urlencode(base64_encode(hash_hmac('sha1', $uri, $this->secret, true)));
     }
+
+    private function buildUrl(array $url, array $params = array())
+    {
+        ksort($params);
+        $url['query'] = http_build_query($params);
+
+        $scheme = isset($url['scheme']) ? $url['scheme'].'://' : '';
+        $host = isset($url['host']) ? $url['host'] : '';
+        $port = isset($url['port']) ? ':'.$url['port'] : '';
+        $user = isset($url['user']) ? $url['user'] : '';
+        $pass = isset($url['pass']) ? ':'.$url['pass']  : '';
+        $pass = ($user || $pass) ? "$pass@" : '';
+        $path = isset($url['path']) ? $url['path'] : '';
+        $query = isset($url['query']) && $url['query'] ? '?'.$url['query'] : '';
+        $fragment = isset($url['fragment']) ? '#'.$url['fragment'] : '';
+
+        return $scheme.$user.$pass.$host.$port.$path.$query.$fragment;
+    }
 }
--- a/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/composer.json
+++ b/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/composer.json
@@ -3,7 +3,7 @@
     "type": "library",
     "description": "Symfony HttpKernel Component",
     "keywords": [],
-    "homepage": "http://symfony.com",
+    "homepage": "https://symfony.com",
     "license": "MIT",
     "authors": [
         {
@@ -12,26 +12,28 @@
         },
         {
             "name": "Symfony Community",
-            "homepage": "http://symfony.com/contributors"
+            "homepage": "https://symfony.com/contributors"
         }
     ],
     "require": {
         "php": ">=5.3.3",
         "symfony/event-dispatcher": "~2.1",
-        "symfony/http-foundation": "~2.2",
-        "symfony/debug": "~2.3",
+        "symfony/http-foundation": "~2.3,>=2.3.4",
+        "symfony/debug": "~2.3.24|~2.5.9|~2.6,>=2.6.2",
         "psr/log": "~1.0"
     },
     "require-dev": {
-        "symfony/browser-kit": "~2.2",
+        "symfony/browser-kit": "~2.3",
         "symfony/class-loader": "~2.1",
-        "symfony/config": "~2.0",
+        "symfony/config": "~2.0,>=2.0.5",
         "symfony/console": "~2.2",
-        "symfony/dependency-injection": "~2.0",
-        "symfony/finder": "~2.0",
-        "symfony/process": "~2.0",
+        "symfony/css-selector": "~2.0,>=2.0.5",
+        "symfony/dependency-injection": "~2.2",
+        "symfony/dom-crawler": "~2.0,>=2.0.5",
+        "symfony/finder": "~2.0,>=2.0.5",
+        "symfony/process": "~2.0,>=2.0.5",
         "symfony/routing": "~2.2",
-        "symfony/stopwatch": "~2.2",
+        "symfony/stopwatch": "~2.3",
         "symfony/templating": "~2.2"
     },
     "suggest": {
@@ -43,7 +45,10 @@
         "symfony/finder": ""
     },
     "autoload": {
-        "psr-0": { "Symfony\\Component\\HttpKernel\\": "" }
+        "psr-0": { "Symfony\\Component\\HttpKernel\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
     },
     "target-dir": "Symfony/Component/HttpKernel",
     "minimum-stability": "dev",
--- a/vendor/symfony/routing/Symfony/Component/Routing/Annotation/Route.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Annotation/Route.php
@@ -53,7 +53,7 @@ class Route
         foreach ($data as $key => $value) {
             $method = 'set'.str_replace('_', '', $key);
             if (!method_exists($this, $method)) {
-                throw new \BadMethodCallException(sprintf("Unknown property '%s' on annotation '%s'.", $key, get_class($this)));
+                throw new \BadMethodCallException(sprintf('Unknown property "%s" on annotation "%s".', $key, get_class($this)));
             }
             $this->$method($value);
         }
--- a/vendor/symfony/routing/Symfony/Component/Routing/CompiledRoute.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/CompiledRoute.php
@@ -16,7 +16,7 @@ namespace Symfony\Component\Routing;
  *
  * @author Fabien Potencier <fabien@symfony.com>
  */
-class CompiledRoute
+class CompiledRoute implements \Serializable
 {
     private $variables;
     private $tokens;
@@ -30,14 +30,14 @@ class CompiledRoute
     /**
      * Constructor.
      *
-     * @param string      $staticPrefix       The static prefix of the compiled route
-     * @param string      $regex              The regular expression to use to match this route
-     * @param array       $tokens             An array of tokens to use to generate URL for this route
-     * @param array       $pathVariables      An array of path variables
-     * @param string|null $hostRegex          Host regex
-     * @param array       $hostTokens         Host tokens
-     * @param array       $hostVariables      An array of host variables
-     * @param array       $variables          An array of variables (variables defined in the path and in the host patterns)
+     * @param string      $staticPrefix  The static prefix of the compiled route
+     * @param string      $regex         The regular expression to use to match this route
+     * @param array       $tokens        An array of tokens to use to generate URL for this route
+     * @param array       $pathVariables An array of path variables
+     * @param string|null $hostRegex     Host regex
+     * @param array       $hostTokens    Host tokens
+     * @param array       $hostVariables An array of host variables
+     * @param array       $variables     An array of variables (variables defined in the path and in the host patterns)
      */
     public function __construct($staticPrefix, $regex, array $tokens, array $pathVariables, $hostRegex = null, array $hostTokens = array(), array $hostVariables = array(), array $variables = array())
     {
@@ -52,6 +52,39 @@ class CompiledRoute
     }
 
     /**
+     * {@inheritdoc}
+     */
+    public function serialize()
+    {
+        return serialize(array(
+            'vars' => $this->variables,
+            'path_prefix' => $this->staticPrefix,
+            'path_regex' => $this->regex,
+            'path_tokens' => $this->tokens,
+            'path_vars' => $this->pathVariables,
+            'host_regex' => $this->hostRegex,
+            'host_tokens' => $this->hostTokens,
+            'host_vars' => $this->hostVariables,
+        ));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function unserialize($serialized)
+    {
+        $data = unserialize($serialized);
+        $this->variables = $data['vars'];
+        $this->staticPrefix = $data['path_prefix'];
+        $this->regex = $data['path_regex'];
+        $this->tokens = $data['path_tokens'];
+        $this->pathVariables = $data['path_vars'];
+        $this->hostRegex = $data['host_regex'];
+        $this->hostTokens = $data['host_tokens'];
+        $this->hostVariables = $data['host_vars'];
+    }
+
+    /**
      * Returns the static prefix.
      *
      * @return string The static prefix
@@ -72,7 +105,7 @@ class CompiledRoute
     }
 
     /**
-     * Returns the host regex
+     * Returns the host regex.
      *
      * @return string|null The host regex or null
      */
--- a/vendor/symfony/routing/Symfony/Component/Routing/Exception/ExceptionInterface.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Exception/ExceptionInterface.php
@@ -12,11 +12,9 @@
 namespace Symfony\Component\Routing\Exception;
 
 /**
- * ExceptionInterface
+ * ExceptionInterface.
  *
  * @author Alexandre Salomé <alexandre.salome@gmail.com>
- *
- * @api
  */
 interface ExceptionInterface
 {
--- a/vendor/symfony/routing/Symfony/Component/Routing/Exception/InvalidParameterException.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Exception/InvalidParameterException.php
@@ -12,11 +12,9 @@
 namespace Symfony\Component\Routing\Exception;
 
 /**
- * Exception thrown when a parameter is not valid
+ * Exception thrown when a parameter is not valid.
  *
  * @author Alexandre Salomé <alexandre.salome@gmail.com>
- *
- * @api
  */
 class InvalidParameterException extends \InvalidArgumentException implements ExceptionInterface
 {
--- a/vendor/symfony/routing/Symfony/Component/Routing/Exception/MethodNotAllowedException.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Exception/MethodNotAllowedException.php
@@ -17,8 +17,6 @@ namespace Symfony\Component\Routing\Exception;
  * This exception should trigger an HTTP 405 response in your application code.
  *
  * @author Kris Wallsmith <kris@symfony.com>
- *
- * @api
  */
 class MethodNotAllowedException extends \RuntimeException implements ExceptionInterface
 {
--- a/vendor/symfony/routing/Symfony/Component/Routing/Exception/MissingMandatoryParametersException.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Exception/MissingMandatoryParametersException.php
@@ -16,8 +16,6 @@ namespace Symfony\Component\Routing\Exception;
  * mandatory parameters.
  *
  * @author Alexandre Salomé <alexandre.salome@gmail.com>
- *
- * @api
  */
 class MissingMandatoryParametersException extends \InvalidArgumentException implements ExceptionInterface
 {
--- a/vendor/symfony/routing/Symfony/Component/Routing/Exception/ResourceNotFoundException.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Exception/ResourceNotFoundException.php
@@ -17,8 +17,6 @@ namespace Symfony\Component\Routing\Exception;
  * This exception should trigger an HTTP 404 response in your application code.
  *
  * @author Kris Wallsmith <kris@symfony.com>
- *
- * @api
  */
 class ResourceNotFoundException extends \RuntimeException implements ExceptionInterface
 {
--- a/vendor/symfony/routing/Symfony/Component/Routing/Exception/RouteNotFoundException.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Exception/RouteNotFoundException.php
@@ -12,11 +12,9 @@
 namespace Symfony\Component\Routing\Exception;
 
 /**
- * Exception thrown when a route does not exist
+ * Exception thrown when a route does not exist.
  *
  * @author Alexandre Salomé <alexandre.salome@gmail.com>
- *
- * @api
  */
 class RouteNotFoundException extends \InvalidArgumentException implements ExceptionInterface
 {
--- a/vendor/symfony/routing/Symfony/Component/Routing/Generator/ConfigurableRequirementsInterface.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Generator/ConfigurableRequirementsInterface.php
@@ -41,7 +41,7 @@ interface ConfigurableRequirementsInterface
      * Enables or disables the exception on incorrect parameters.
      * Passing null will deactivate the requirements check completely.
      *
-     * @param bool|null    $enabled
+     * @param bool|null $enabled
      */
     public function setStrictRequirements($enabled);
 
--- a/vendor/symfony/routing/Symfony/Component/Routing/Generator/Dumper/GeneratorDumperInterface.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Generator/Dumper/GeneratorDumperInterface.php
@@ -17,8 +17,6 @@ use Symfony\Component\Routing\RouteCollection;
  * GeneratorDumperInterface is the interface that all generator dumper classes must implement.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 interface GeneratorDumperInterface
 {
--- a/vendor/symfony/routing/Symfony/Component/Routing/Generator/Dumper/PhpGeneratorDumper.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Generator/Dumper/PhpGeneratorDumper.php
@@ -16,8 +16,6 @@ namespace Symfony\Component\Routing\Generator\Dumper;
  *
  * @author Fabien Potencier <fabien@symfony.com>
  * @author Tobias Schultze <http://tobion.de>
- *
- * @api
  */
 class PhpGeneratorDumper extends GeneratorDumper
 {
@@ -32,13 +30,11 @@ class PhpGeneratorDumper extends GeneratorDumper
      * @param array $options An array of options
      *
      * @return string A PHP class representing the generator class
-     *
-     * @api
      */
     public function dump(array $options = array())
     {
         $options = array_merge(array(
-            'class'      => 'ProjectUrlGenerator',
+            'class' => 'ProjectUrlGenerator',
             'base_class' => 'Symfony\\Component\\Routing\\Generator\\UrlGenerator',
         ), $options);
 
--- a/vendor/symfony/routing/Symfony/Component/Routing/Generator/UrlGenerator.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Generator/UrlGenerator.php
@@ -24,8 +24,6 @@ use Psr\Log\LoggerInterface;
  *
  * @author Fabien Potencier <fabien@symfony.com>
  * @author Tobias Schultze <http://tobion.de>
- *
- * @api
  */
 class UrlGenerator implements UrlGeneratorInterface, ConfigurableRequirementsInterface
 {
@@ -83,8 +81,6 @@ class UrlGenerator implements UrlGeneratorInterface, ConfigurableRequirementsInt
      * @param RouteCollection      $routes  A RouteCollection instance
      * @param RequestContext       $context The context
      * @param LoggerInterface|null $logger  A logger instance
-     *
-     * @api
      */
     public function __construct(RouteCollection $routes, RequestContext $context, LoggerInterface $logger = null)
     {
@@ -213,7 +209,7 @@ class UrlGenerator implements UrlGeneratorInterface, ConfigurableRequirementsInt
                 $routeHost = '';
                 foreach ($hostTokens as $token) {
                     if ('variable' === $token[0]) {
-                        if (null !== $this->strictRequirements && !preg_match('#^'.$token[2].'$#', $mergedParams[$token[3]])) {
+                        if (null !== $this->strictRequirements && !preg_match('#^'.$token[2].'$#i', $mergedParams[$token[3]])) {
                             $message = sprintf('Parameter "%s" for route "%s" must match "%s" ("%s" given) to generate a corresponding URL.', $token[3], $name, $token[2], $mergedParams[$token[3]]);
 
                             if ($this->strictRequirements) {
--- a/vendor/symfony/routing/Symfony/Component/Routing/Generator/UrlGeneratorInterface.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Generator/UrlGeneratorInterface.php
@@ -28,8 +28,6 @@ use Symfony\Component\Routing\RequestContextAwareInterface;
  *
  * @author Fabien Potencier <fabien@symfony.com>
  * @author Tobias Schultze <http://tobion.de>
- *
- * @api
  */
 interface UrlGeneratorInterface extends RequestContextAwareInterface
 {
@@ -45,6 +43,7 @@ interface UrlGeneratorInterface extends RequestContextAwareInterface
 
     /**
      * Generates a relative path based on the current request path, e.g. "../parent-file".
+     *
      * @see UrlGenerator::getRelativePath()
      */
     const RELATIVE_PATH = 'relative';
@@ -70,9 +69,9 @@ interface UrlGeneratorInterface extends RequestContextAwareInterface
      *
      * If there is no route with the given name, the generator must throw the RouteNotFoundException.
      *
-     * @param string         $name          The name of the route
-     * @param mixed          $parameters    An array of parameters
-     * @param bool|string    $referenceType The type of reference to be generated (one of the constants)
+     * @param string      $name          The name of the route
+     * @param mixed       $parameters    An array of parameters
+     * @param bool|string $referenceType The type of reference to be generated (one of the constants)
      *
      * @return string The generated URL
      *
@@ -80,8 +79,6 @@ interface UrlGeneratorInterface extends RequestContextAwareInterface
      * @throws MissingMandatoryParametersException When some parameters are missing that are mandatory for the route
      * @throws InvalidParameterException           When a parameter value for a placeholder is not correct because
      *                                             it does not match the requirement
-     *
-     * @api
      */
     public function generate($name, $parameters = array(), $referenceType = self::ABSOLUTE_PATH);
 }
--- a/vendor/symfony/routing/Symfony/Component/Routing/LICENSE
+++ b/vendor/symfony/routing/Symfony/Component/Routing/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2014 Fabien Potencier
+Copyright (c) 2004-2015 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
--- a/vendor/symfony/routing/Symfony/Component/Routing/Loader/AnnotationClassLoader.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Loader/AnnotationClassLoader.php
@@ -109,13 +109,13 @@ abstract class AnnotationClassLoader implements LoaderInterface
         }
 
         $globals = array(
-            'path'         => '',
+            'path' => '',
             'requirements' => array(),
-            'options'      => array(),
-            'defaults'     => array(),
-            'schemes'      => array(),
-            'methods'      => array(),
-            'host'         => '',
+            'options' => array(),
+            'defaults' => array(),
+            'schemes' => array(),
+            'methods' => array(),
+            'host' => '',
         );
 
         $class = new \ReflectionClass($class);
@@ -180,7 +180,7 @@ abstract class AnnotationClassLoader implements LoaderInterface
 
         $defaults = array_replace($globals['defaults'], $annot->getDefaults());
         foreach ($method->getParameters() as $param) {
-            if (!isset($defaults[$param->getName()]) && $param->isOptional()) {
+            if (!isset($defaults[$param->getName()]) && $param->isDefaultValueAvailable()) {
                 $defaults[$param->getName()] = $param->getDefaultValue();
             }
         }
@@ -237,7 +237,7 @@ abstract class AnnotationClassLoader implements LoaderInterface
         if ($this->defaultRouteIndex > 0) {
             $name .= '_'.$this->defaultRouteIndex;
         }
-        $this->defaultRouteIndex++;
+        ++$this->defaultRouteIndex;
 
         return $name;
     }
--- a/vendor/symfony/routing/Symfony/Component/Routing/Loader/AnnotationFileLoader.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Loader/AnnotationFileLoader.php
@@ -88,7 +88,7 @@ class AnnotationFileLoader extends FileLoader
         $class = false;
         $namespace = false;
         $tokens = token_get_all(file_get_contents($file));
-        for ($i = 0, $count = count($tokens); $i < $count; $i++) {
+        for ($i = 0, $count = count($tokens); $i < $count; ++$i) {
             $token = $tokens[$i];
 
             if (!is_array($token)) {
--- a/vendor/symfony/routing/Symfony/Component/Routing/Loader/ClosureLoader.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Loader/ClosureLoader.php
@@ -20,8 +20,6 @@ use Symfony\Component\Routing\RouteCollection;
  * The Closure must return a RouteCollection instance.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class ClosureLoader extends Loader
 {
@@ -32,18 +30,14 @@ class ClosureLoader extends Loader
      * @param string|null $type    The resource type
      *
      * @return RouteCollection A RouteCollection instance
-     *
-     * @api
      */
     public function load($closure, $type = null)
     {
-        return call_user_func($closure);
+        return $closure();
     }
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function supports($resource, $type = null)
     {
--- a/vendor/symfony/routing/Symfony/Component/Routing/Loader/PhpFileLoader.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Loader/PhpFileLoader.php
@@ -21,8 +21,6 @@ use Symfony\Component\Routing\RouteCollection;
  * The file must return a RouteCollection instance.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class PhpFileLoader extends FileLoader
 {
@@ -33,8 +31,6 @@ class PhpFileLoader extends FileLoader
      * @param string|null $type The resource type
      *
      * @return RouteCollection A RouteCollection instance
-     *
-     * @api
      */
     public function load($file, $type = null)
     {
@@ -52,8 +48,6 @@ class PhpFileLoader extends FileLoader
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function supports($resource, $type = null)
     {
--- a/vendor/symfony/routing/Symfony/Component/Routing/Loader/XmlFileLoader.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Loader/XmlFileLoader.php
@@ -22,8 +22,6 @@ use Symfony\Component\Config\Util\XmlUtils;
  *
  * @author Fabien Potencier <fabien@symfony.com>
  * @author Tobias Schultze <http://tobion.de>
- *
- * @api
  */
 class XmlFileLoader extends FileLoader
 {
@@ -40,8 +38,6 @@ class XmlFileLoader extends FileLoader
      *
      * @throws \InvalidArgumentException When the file cannot be loaded or when the XML cannot be
      *                                   parsed because it does not validate against the scheme.
-     *
-     * @api
      */
     public function load($file, $type = null)
     {
@@ -94,8 +90,6 @@ class XmlFileLoader extends FileLoader
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function supports($resource, $type = null)
     {
--- a/vendor/symfony/routing/Symfony/Component/Routing/Loader/YamlFileLoader.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Loader/YamlFileLoader.php
@@ -14,6 +14,7 @@ namespace Symfony\Component\Routing\Loader;
 use Symfony\Component\Routing\RouteCollection;
 use Symfony\Component\Routing\Route;
 use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Yaml\Exception\ParseException;
 use Symfony\Component\Yaml\Parser as YamlParser;
 use Symfony\Component\Config\Loader\FileLoader;
 
@@ -22,8 +23,6 @@ use Symfony\Component\Config\Loader\FileLoader;
  *
  * @author Fabien Potencier <fabien@symfony.com>
  * @author Tobias Schultze <http://tobion.de>
- *
- * @api
  */
 class YamlFileLoader extends FileLoader
 {
@@ -41,8 +40,6 @@ class YamlFileLoader extends FileLoader
      * @return RouteCollection A RouteCollection instance
      *
      * @throws \InvalidArgumentException When a route can't be parsed because YAML is invalid
-     *
-     * @api
      */
     public function load($file, $type = null)
     {
@@ -60,22 +57,26 @@ class YamlFileLoader extends FileLoader
             $this->yamlParser = new YamlParser();
         }
 
-        $config = $this->yamlParser->parse(file_get_contents($path));
+        try {
+            $parsedConfig = $this->yamlParser->parse(file_get_contents($path));
+        } catch (ParseException $e) {
+            throw new \InvalidArgumentException(sprintf('The file "%s" does not contain valid YAML.', $path), 0, $e);
+        }
 
         $collection = new RouteCollection();
         $collection->addResource(new FileResource($path));
 
         // empty file
-        if (null === $config) {
+        if (null === $parsedConfig) {
             return $collection;
         }
 
         // not an array
-        if (!is_array($config)) {
+        if (!is_array($parsedConfig)) {
             throw new \InvalidArgumentException(sprintf('The file "%s" must contain a YAML array.', $path));
         }
 
-        foreach ($config as $name => $config) {
+        foreach ($parsedConfig as $name => $config) {
             if (isset($config['pattern'])) {
                 if (isset($config['path'])) {
                     throw new \InvalidArgumentException(sprintf('The file "%s" cannot define both a "path" and a "pattern" attribute. Use only "path".', $path));
@@ -99,12 +100,10 @@ class YamlFileLoader extends FileLoader
 
     /**
      * {@inheritdoc}
-     *
-     * @api
      */
     public function supports($resource, $type = null)
     {
-        return is_string($resource) && 'yml' === pathinfo($resource, PATHINFO_EXTENSION) && (!$type || 'yaml' === $type);
+        return is_string($resource) && in_array(pathinfo($resource, PATHINFO_EXTENSION), array('yml', 'yaml'), true) && (!$type || 'yaml' === $type);
     }
 
     /**
--- a/vendor/symfony/routing/Symfony/Component/Routing/Matcher/ApacheUrlMatcher.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Matcher/ApacheUrlMatcher.php
@@ -60,8 +60,8 @@ class ApacheUrlMatcher extends UrlMatcher
                 continue;
             }
             if (false !== $pos = strpos($name, '_', 9)) {
-                $type = substr($name, 9, $pos-9);
-                $name = substr($name, $pos+1);
+                $type = substr($name, 9, $pos - 9);
+                $name = substr($name, $pos + 1);
             } else {
                 $type = substr($name, 9);
             }
--- a/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/ApacheMatcherDumper.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/ApacheMatcherDumper.php
@@ -39,7 +39,7 @@ class ApacheMatcherDumper extends MatcherDumper
     {
         $options = array_merge(array(
             'script_name' => 'app.php',
-            'base_uri'    => '',
+            'base_uri' => '',
         ), $options);
 
         $options['script_name'] = self::escape($options['script_name'], ' ', '\\');
@@ -55,7 +55,7 @@ class ApacheMatcherDumper extends MatcherDumper
 
             if (null !== $hostRegex && $prevHostRegex !== $hostRegex) {
                 $prevHostRegex = $hostRegex;
-                $hostRegexUnique++;
+                ++$hostRegexUnique;
 
                 $rule = array();
 
@@ -68,7 +68,7 @@ class ApacheMatcherDumper extends MatcherDumper
                 $variables[] = sprintf('E=__ROUTING_host_%s:1', $hostRegexUnique);
 
                 foreach ($compiledRoute->getHostVariables() as $i => $variable) {
-                    $variables[] = sprintf('E=__ROUTING_host_%s_%s:%%%d', $hostRegexUnique, $variable, $i+1);
+                    $variables[] = sprintf('E=__ROUTING_host_%s_%s:%%%d', $hostRegexUnique, $variable, $i + 1);
                 }
 
                 $variables = implode(',', $variables);
@@ -103,12 +103,12 @@ class ApacheMatcherDumper extends MatcherDumper
     }
 
     /**
-     * Dumps a single route
+     * Dumps a single route.
      *
-     * @param  string $name Route name
-     * @param  Route  $route The route
-     * @param  array  $options Options
-     * @param  bool   $hostRegexUnique Unique identifier for the host regex
+     * @param string $name            Route name
+     * @param Route  $route           The route
+     * @param array  $options         Options
+     * @param bool   $hostRegexUnique Unique identifier for the host regex
      *
      * @return string The compiled route
      */
@@ -133,10 +133,10 @@ class ApacheMatcherDumper extends MatcherDumper
         }
         foreach ($this->normalizeValues($route->getDefaults()) as $key => $value) {
             $variables[] = 'E=_ROUTING_default_'.$key.':'.strtr($value, array(
-                ':'  => '\\:',
-                '='  => '\\=',
+                ':' => '\\:',
+                '=' => '\\=',
                 '\\' => '\\\\',
-                ' '  => '\\ ',
+                ' ' => '\\ ',
             ));
         }
         $variables = implode(',', $variables);
@@ -151,18 +151,18 @@ class ApacheMatcherDumper extends MatcherDumper
             }
 
             if ($compiledRoute->getHostRegex()) {
-                $rule[] = sprintf("RewriteCond %%{ENV:__ROUTING_host_%s} =1", $hostRegexUnique);
+                $rule[] = sprintf('RewriteCond %%{ENV:__ROUTING_host_%s} =1', $hostRegexUnique);
             }
 
             $rule[] = "RewriteCond %{REQUEST_URI} $regex";
-            $rule[] = sprintf("RewriteCond %%{REQUEST_METHOD} !^(%s)$ [NC]", implode('|', $methods));
+            $rule[] = sprintf('RewriteCond %%{REQUEST_METHOD} !^(%s)$ [NC]', implode('|', $methods));
             $rule[] = sprintf('RewriteRule .* - [S=%d,%s]', $hasTrailingSlash ? 2 : 1, implode(',', $allow));
         }
 
         // redirect with trailing slash appended
         if ($hasTrailingSlash) {
             if ($compiledRoute->getHostRegex()) {
-                $rule[] = sprintf("RewriteCond %%{ENV:__ROUTING_host_%s} =1", $hostRegexUnique);
+                $rule[] = sprintf('RewriteCond %%{ENV:__ROUTING_host_%s} =1', $hostRegexUnique);
             }
 
             $rule[] = 'RewriteCond %{REQUEST_URI} '.substr($regex, 0, -2).'$';
@@ -172,7 +172,7 @@ class ApacheMatcherDumper extends MatcherDumper
         // the main rule
 
         if ($compiledRoute->getHostRegex()) {
-            $rule[] = sprintf("RewriteCond %%{ENV:__ROUTING_host_%s} =1", $hostRegexUnique);
+            $rule[] = sprintf('RewriteCond %%{ENV:__ROUTING_host_%s} =1', $hostRegexUnique);
         }
 
         $rule[] = "RewriteCond %{REQUEST_URI} $regex";
@@ -182,9 +182,9 @@ class ApacheMatcherDumper extends MatcherDumper
     }
 
     /**
-     * Returns methods allowed for a route
+     * Returns methods allowed for a route.
      *
-     * @param Route  $route The route
+     * @param Route $route The route
      *
      * @return array The methods
      */
@@ -203,9 +203,9 @@ class ApacheMatcherDumper extends MatcherDumper
     }
 
     /**
-     * Converts a regex to make it suitable for mod_rewrite
+     * Converts a regex to make it suitable for mod_rewrite.
      *
-     * @param string  $regex The regex
+     * @param string $regex The regex
      *
      * @return string The converted regex
      */
--- a/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/DumperCollection.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/DumperCollection.php
@@ -15,6 +15,8 @@ namespace Symfony\Component\Routing\Matcher\Dumper;
  * Collection of routes.
  *
  * @author Arnaud Le Blanc <arnaud.lb@gmail.com>
+ *
+ * @internal
  */
 class DumperCollection implements \IteratorAggregate
 {
@@ -44,13 +46,13 @@ class DumperCollection implements \IteratorAggregate
     }
 
     /**
-     * Adds a route or collection
+     * Adds a route or collection.
      *
      * @param DumperRoute|DumperCollection The route or collection
      */
     public function add($child)
     {
-        if ($child instanceof DumperCollection) {
+        if ($child instanceof self) {
             $child->setParent($this);
         }
         $this->children[] = $child;
@@ -64,7 +66,7 @@ class DumperCollection implements \IteratorAggregate
     public function setAll(array $children)
     {
         foreach ($children as $child) {
-            if ($child instanceof DumperCollection) {
+            if ($child instanceof self) {
                 $child->setParent($this);
             }
         }
@@ -116,7 +118,7 @@ class DumperCollection implements \IteratorAggregate
      *
      * @param string $name The attribute name
      *
-     * @return bool    true if the attribute is defined, false otherwise
+     * @return bool true if the attribute is defined, false otherwise
      */
     public function hasAttribute($name)
     {
--- a/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/DumperPrefixCollection.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/DumperPrefixCollection.php
@@ -15,6 +15,8 @@ namespace Symfony\Component\Routing\Matcher\Dumper;
  * Prefix tree of routes preserving routes order.
  *
  * @author Arnaud Le Blanc <arnaud.lb@gmail.com>
+ *
+ * @internal
  */
 class DumperPrefixCollection extends DumperCollection
 {
@@ -66,8 +68,8 @@ class DumperPrefixCollection extends DumperCollection
 
             // Prefix starts with route's prefix
             if ('' === $collection->prefix || 0 === strpos($prefix, $collection->prefix)) {
-                $child = new DumperPrefixCollection();
-                $child->setPrefix(substr($prefix, 0, strlen($collection->prefix)+1));
+                $child = new self();
+                $child->setPrefix(substr($prefix, 0, strlen($collection->prefix) + 1));
                 $collection->add($child);
 
                 return $child->addPrefixRoute($route);
@@ -75,11 +77,11 @@ class DumperPrefixCollection extends DumperCollection
         }
 
         // Reached only if the root has a non empty prefix
-        throw new \LogicException("The collection root must not have a prefix");
+        throw new \LogicException('The collection root must not have a prefix');
     }
 
     /**
-     * Merges nodes whose prefix ends with a slash
+     * Merges nodes whose prefix ends with a slash.
      *
      * Children of a node whose prefix ends with a slash are moved to the parent node
      */
--- a/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/DumperRoute.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/DumperRoute.php
@@ -17,6 +17,8 @@ use Symfony\Component\Routing\Route;
  * Container for a Route.
  *
  * @author Arnaud Le Blanc <arnaud.lb@gmail.com>
+ *
+ * @internal
  */
 class DumperRoute
 {
--- a/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php
@@ -38,7 +38,7 @@ class PhpMatcherDumper extends MatcherDumper
     public function dump(array $options = array())
     {
         $options = array_replace(array(
-            'class'      => 'ProjectUrlMatcher',
+            'class' => 'ProjectUrlMatcher',
             'base_class' => 'Symfony\\Component\\Routing\\Matcher\\UrlMatcher',
         ), $options);
 
@@ -54,7 +54,7 @@ use Symfony\Component\Routing\Exception\ResourceNotFoundException;
 use Symfony\Component\Routing\RequestContext;
 
 /**
- * {$options['class']}
+ * {$options['class']}.
  *
  * This class has been auto-generated
  * by the Symfony Routing Component.
@@ -78,7 +78,7 @@ EOF;
     /**
      * Generates the code for the match method implementing UrlMatcherInterface.
      *
-     * @param bool    $supportsRedirections Whether redirections are supported by the base class
+     * @param bool $supportsRedirections Whether redirections are supported by the base class
      *
      * @return string Match method as PHP code
      */
@@ -141,7 +141,7 @@ EOF;
     }
 
     /**
-     * Generates PHP code recursively to match a tree of routes
+     * Generates PHP code recursively to match a tree of routes.
      *
      * @param DumperPrefixCollection $collection           A DumperPrefixCollection instance
      * @param bool                   $supportsRedirections Whether redirections are supported by the base class
@@ -216,11 +216,11 @@ EOF;
                 $conditions[] = sprintf("rtrim(\$pathinfo, '/') === %s", var_export(rtrim(str_replace('\\', '', $m['url']), '/'), true));
                 $hasTrailingSlash = true;
             } else {
-                $conditions[] = sprintf("\$pathinfo === %s", var_export(str_replace('\\', '', $m['url']), true));
+                $conditions[] = sprintf('$pathinfo === %s', var_export(str_replace('\\', '', $m['url']), true));
             }
         } else {
             if ($compiledRoute->getStaticPrefix() && $compiledRoute->getStaticPrefix() !== $parentPrefix) {
-                $conditions[] = sprintf("0 === strpos(\$pathinfo, %s)", var_export($compiledRoute->getStaticPrefix(), true));
+                $conditions[] = sprintf('0 === strpos($pathinfo, %s)', var_export($compiledRoute->getStaticPrefix(), true));
             }
 
             $regex = $compiledRoute->getRegex();
@@ -228,7 +228,7 @@ EOF;
                 $regex = substr($regex, 0, $pos).'/?$'.substr($regex, $pos + 2);
                 $hasTrailingSlash = true;
             }
-            $conditions[] = sprintf("preg_match(%s, \$pathinfo, \$matches)", var_export($regex, true));
+            $conditions[] = sprintf('preg_match(%s, $pathinfo, $matches)', var_export($regex, true));
 
             $matches = true;
         }
@@ -305,8 +305,7 @@ EOF;
             }
             $vars[] = "array('_route' => '$name')";
 
-            $code .= sprintf("            return \$this->mergeDefaults(array_replace(%s), %s);\n"
-                , implode(', ', $vars), str_replace("\n", '', var_export($route->getDefaults(), true)));
+            $code .= sprintf("            return \$this->mergeDefaults(array_replace(%s), %s);\n", implode(', ', $vars), str_replace("\n", '', var_export($route->getDefaults(), true)));
         } elseif ($route->getDefaults()) {
             $code .= sprintf("            return %s;\n", str_replace("\n", '', var_export(array_replace($route->getDefaults(), array('_route' => $name)), true)));
         } else {
--- a/vendor/symfony/routing/Symfony/Component/Routing/Matcher/RedirectableUrlMatcher.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Matcher/RedirectableUrlMatcher.php
@@ -16,8 +16,6 @@ use Symfony\Component\Routing\Route;
 
 /**
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 abstract class RedirectableUrlMatcher extends UrlMatcher implements RedirectableUrlMatcherInterface
 {
--- a/vendor/symfony/routing/Symfony/Component/Routing/Matcher/RedirectableUrlMatcherInterface.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Matcher/RedirectableUrlMatcherInterface.php
@@ -15,8 +15,6 @@ namespace Symfony\Component\Routing\Matcher;
  * RedirectableUrlMatcherInterface knows how to redirect the user.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 interface RedirectableUrlMatcherInterface
 {
@@ -28,8 +26,6 @@ interface RedirectableUrlMatcherInterface
      * @param string|null $scheme The URL scheme (null to keep the current one)
      *
      * @return array An array of parameters
-     *
-     * @api
      */
     public function redirect($path, $route, $scheme = null);
 }
--- a/vendor/symfony/routing/Symfony/Component/Routing/Matcher/TraceableUrlMatcher.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Matcher/TraceableUrlMatcher.php
@@ -24,7 +24,7 @@ class TraceableUrlMatcher extends UrlMatcher
 {
     const ROUTE_DOES_NOT_MATCH = 0;
     const ROUTE_ALMOST_MATCHES = 1;
-    const ROUTE_MATCHES        = 2;
+    const ROUTE_MATCHES = 2;
 
     protected $traces;
 
@@ -111,10 +111,10 @@ class TraceableUrlMatcher extends UrlMatcher
     private function addTrace($log, $level = self::ROUTE_DOES_NOT_MATCH, $name = null, $route = null)
     {
         $this->traces[] = array(
-            'log'   => $log,
-            'name'  => $name,
+            'log' => $log,
+            'name' => $name,
             'level' => $level,
-            'path'  => null !== $route ? $route->getPath() : null,
+            'path' => null !== $route ? $route->getPath() : null,
         );
     }
 }
--- a/vendor/symfony/routing/Symfony/Component/Routing/Matcher/UrlMatcher.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Matcher/UrlMatcher.php
@@ -21,14 +21,12 @@ use Symfony\Component\Routing\Route;
  * UrlMatcher matches URL based on a set of routes.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class UrlMatcher implements UrlMatcherInterface
 {
-    const REQUIREMENT_MATCH     = 0;
-    const REQUIREMENT_MISMATCH  = 1;
-    const ROUTE_MATCH           = 2;
+    const REQUIREMENT_MATCH = 0;
+    const REQUIREMENT_MISMATCH = 1;
+    const ROUTE_MATCH = 2;
 
     /**
      * @var RequestContext
@@ -50,8 +48,6 @@ class UrlMatcher implements UrlMatcherInterface
      *
      * @param RouteCollection $routes  A RouteCollection instance
      * @param RequestContext  $context The context
-     *
-     * @api
      */
     public function __construct(RouteCollection $routes, RequestContext $context)
     {
--- a/vendor/symfony/routing/Symfony/Component/Routing/Matcher/UrlMatcherInterface.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Matcher/UrlMatcherInterface.php
@@ -19,8 +19,6 @@ use Symfony\Component\Routing\Exception\MethodNotAllowedException;
  * UrlMatcherInterface is the interface that all URL matcher classes must implement.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 interface UrlMatcherInterface extends RequestContextAwareInterface
 {
@@ -36,8 +34,6 @@ interface UrlMatcherInterface extends RequestContextAwareInterface
      *
      * @throws ResourceNotFoundException If the resource could not be found
      * @throws MethodNotAllowedException If the resource was found but the request method is not allowed
-     *
-     * @api
      */
     public function match($pathinfo);
 }
--- a/vendor/symfony/routing/Symfony/Component/Routing/RequestContext.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/RequestContext.php
@@ -18,8 +18,6 @@ use Symfony\Component\HttpFoundation\Request;
  *
  * @author Fabien Potencier <fabien@symfony.com>
  * @author Tobias Schultze <http://tobion.de>
- *
- * @api
  */
 class RequestContext
 {
@@ -40,16 +38,14 @@ class RequestContext
     /**
      * Constructor.
      *
-     * @param string  $baseUrl      The base URL
-     * @param string  $method       The HTTP method
-     * @param string  $host         The HTTP host name
-     * @param string  $scheme       The HTTP scheme
-     * @param int     $httpPort     The HTTP port
-     * @param int     $httpsPort    The HTTPS port
-     * @param string  $path         The path
-     * @param string  $queryString  The query string
-     *
-     * @api
+     * @param string $baseUrl     The base URL
+     * @param string $method      The HTTP method
+     * @param string $host        The HTTP host name
+     * @param string $scheme      The HTTP scheme
+     * @param int    $httpPort    The HTTP port
+     * @param int    $httpsPort   The HTTPS port
+     * @param string $path        The path
+     * @param string $queryString The query string
      */
     public function __construct($baseUrl = '', $method = 'GET', $host = 'localhost', $scheme = 'http', $httpPort = 80, $httpsPort = 443, $path = '/', $queryString = '')
     {
@@ -94,8 +90,6 @@ class RequestContext
      * Sets the base URL.
      *
      * @param string $baseUrl The base URL
-     *
-     * @api
      */
     public function setBaseUrl($baseUrl)
     {
@@ -138,8 +132,6 @@ class RequestContext
      * Sets the HTTP method.
      *
      * @param string $method The HTTP method
-     *
-     * @api
      */
     public function setMethod($method)
     {
@@ -162,8 +154,6 @@ class RequestContext
      * Sets the HTTP host.
      *
      * @param string $host The HTTP host
-     *
-     * @api
      */
     public function setHost($host)
     {
@@ -184,8 +174,6 @@ class RequestContext
      * Sets the HTTP scheme.
      *
      * @param string $scheme The HTTP scheme
-     *
-     * @api
      */
     public function setScheme($scheme)
     {
@@ -206,8 +194,6 @@ class RequestContext
      * Sets the HTTP port.
      *
      * @param int $httpPort The HTTP port
-     *
-     * @api
      */
     public function setHttpPort($httpPort)
     {
@@ -228,8 +214,6 @@ class RequestContext
      * Sets the HTTPS port.
      *
      * @param int $httpsPort The HTTPS port
-     *
-     * @api
      */
     public function setHttpsPort($httpsPort)
     {
@@ -250,8 +234,6 @@ class RequestContext
      * Sets the query string.
      *
      * @param string $queryString The query string (after "?")
-     *
-     * @api
      */
     public function setQueryString($queryString)
     {
@@ -312,8 +294,6 @@ class RequestContext
      *
      * @param string $name      A parameter name
      * @param mixed  $parameter The parameter value
-     *
-     * @api
      */
     public function setParameter($name, $parameter)
     {
--- a/vendor/symfony/routing/Symfony/Component/Routing/RequestContextAwareInterface.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/RequestContextAwareInterface.php
@@ -11,17 +11,12 @@
 
 namespace Symfony\Component\Routing;
 
-/**
- * @api
- */
 interface RequestContextAwareInterface
 {
     /**
      * Sets the request context.
      *
      * @param RequestContext $context The context
-     *
-     * @api
      */
     public function setContext(RequestContext $context);
 
@@ -29,8 +24,6 @@ interface RequestContextAwareInterface
      * Gets the request context.
      *
      * @return RequestContext The context
-     *
-     * @api
      */
     public function getContext();
 }
--- a/vendor/symfony/routing/Symfony/Component/Routing/Route.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Route.php
@@ -16,8 +16,6 @@ namespace Symfony\Component\Routing;
  *
  * @author Fabien Potencier <fabien@symfony.com>
  * @author Tobias Schultze <http://tobion.de>
- *
- * @api
  */
 class Route implements \Serializable
 {
@@ -75,8 +73,6 @@ class Route implements \Serializable
      * @param string       $host         The host pattern to match
      * @param string|array $schemes      A required URI scheme or an array of restricted schemes
      * @param string|array $methods      A required HTTP method or an array of restricted methods
-     *
-     * @api
      */
     public function __construct($path, array $defaults = array(), array $requirements = array(), array $options = array(), $host = '', $schemes = array(), $methods = array())
     {
@@ -95,22 +91,29 @@ class Route implements \Serializable
         }
     }
 
+    /**
+     * {@inheritdoc}
+     */
     public function serialize()
     {
         return serialize(array(
-            'path'         => $this->path,
-            'host'         => $this->host,
-            'defaults'     => $this->defaults,
+            'path' => $this->path,
+            'host' => $this->host,
+            'defaults' => $this->defaults,
             'requirements' => $this->requirements,
-            'options'      => $this->options,
-            'schemes'      => $this->schemes,
-            'methods'      => $this->methods,
+            'options' => $this->options,
+            'schemes' => $this->schemes,
+            'methods' => $this->methods,
+            'compiled' => $this->compiled,
         ));
     }
 
-    public function unserialize($data)
+    /**
+     * {@inheritdoc}
+     */
+    public function unserialize($serialized)
     {
-        $data = unserialize($data);
+        $data = unserialize($serialized);
         $this->path = $data['path'];
         $this->host = $data['host'];
         $this->defaults = $data['defaults'];
@@ -118,6 +121,9 @@ class Route implements \Serializable
         $this->options = $data['options'];
         $this->schemes = $data['schemes'];
         $this->methods = $data['methods'];
+        if (isset($data['compiled'])) {
+            $this->compiled = $data['compiled'];
+        }
     }
 
     /**
@@ -242,10 +248,22 @@ class Route implements \Serializable
     }
 
     /**
+     * Checks if a scheme requirement has been set.
+     *
+     * @param string $scheme
+     *
+     * @return bool true if the scheme requirement exists, otherwise false
+     */
+    public function hasScheme($scheme)
+    {
+        return in_array(strtolower($scheme), $this->schemes, true);
+    }
+
+    /**
      * Returns the uppercased HTTP methods this route is restricted to.
      * So an empty array means that any method is allowed.
      *
-     * @return array The schemes
+     * @return array The methods
      */
     public function getMethods()
     {
@@ -334,8 +352,6 @@ class Route implements \Serializable
      * @param mixed  $value The option value
      *
      * @return Route The current Route instance
-     *
-     * @api
      */
     public function setOption($name, $value)
     {
@@ -358,11 +374,11 @@ class Route implements \Serializable
     }
 
     /**
-     * Checks if an option has been set
+     * Checks if an option has been set.
      *
      * @param string $name An option name
      *
-     * @return bool    true if the option is set, false otherwise
+     * @return bool true if the option is set, false otherwise
      */
     public function hasOption($name)
     {
@@ -431,7 +447,7 @@ class Route implements \Serializable
      *
      * @param string $name A variable name
      *
-     * @return bool    true if the default value is set, false otherwise
+     * @return bool true if the default value is set, false otherwise
      */
     public function hasDefault($name)
     {
@@ -445,8 +461,6 @@ class Route implements \Serializable
      * @param mixed  $default The default value
      *
      * @return Route The current Route instance
-     *
-     * @api
      */
     public function setDefault($name, $default)
     {
@@ -518,7 +532,7 @@ class Route implements \Serializable
      *
      * @param string $key A variable name
      *
-     * @return bool    true if a requirement is specified, false otherwise
+     * @return bool true if a requirement is specified, false otherwise
      */
     public function hasRequirement($key)
     {
@@ -532,8 +546,6 @@ class Route implements \Serializable
      * @param string $regex The regex
      *
      * @return Route The current Route instance
-     *
-     * @api
      */
     public function setRequirement($key, $regex)
     {
--- a/vendor/symfony/routing/Symfony/Component/Routing/RouteCollection.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/RouteCollection.php
@@ -22,8 +22,6 @@ use Symfony\Component\Config\Resource\ResourceInterface;
  *
  * @author Fabien Potencier <fabien@symfony.com>
  * @author Tobias Schultze <http://tobion.de>
- *
- * @api
  */
 class RouteCollection implements \IteratorAggregate, \Countable
 {
@@ -73,8 +71,6 @@ class RouteCollection implements \IteratorAggregate, \Countable
      *
      * @param string $name  The route name
      * @param Route  $route A Route instance
-     *
-     * @api
      */
     public function add($name, Route $route)
     {
@@ -106,7 +102,7 @@ class RouteCollection implements \IteratorAggregate, \Countable
     }
 
     /**
-     * Removes a route or an array of routes by name from the collection
+     * Removes a route or an array of routes by name from the collection.
      *
      * @param string|array $name The route name or an array of route names
      */
@@ -121,9 +117,7 @@ class RouteCollection implements \IteratorAggregate, \Countable
      * Adds a route collection at the end of the current set by appending all
      * routes of the added collection.
      *
-     * @param RouteCollection $collection      A RouteCollection instance
-     *
-     * @api
+     * @param RouteCollection $collection A RouteCollection instance
      */
     public function addCollection(RouteCollection $collection)
     {
@@ -143,8 +137,6 @@ class RouteCollection implements \IteratorAggregate, \Countable
      * @param string $prefix       An optional prefix to add before each pattern of the route collection
      * @param array  $defaults     An array of default values
      * @param array  $requirements An array of requirements
-     *
-     * @api
      */
     public function addPrefix($prefix, array $defaults = array(), array $requirements = array())
     {
--- a/vendor/symfony/routing/Symfony/Component/Routing/RouteCompiler.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/RouteCompiler.php
@@ -46,7 +46,7 @@ class RouteCompiler implements RouteCompilerInterface
             $result = self::compilePattern($route, $host, true);
 
             $hostVariables = $result['variables'];
-            $variables = array_merge($variables, $hostVariables);
+            $variables = $hostVariables;
 
             $hostTokens = $result['tokens'];
             $hostRegex = $result['regex'];
@@ -145,7 +145,7 @@ class RouteCompiler implements RouteCompilerInterface
         // find the first optional token
         $firstOptional = PHP_INT_MAX;
         if (!$isHost) {
-            for ($i = count($tokens) - 1; $i >= 0; $i--) {
+            for ($i = count($tokens) - 1; $i >= 0; --$i) {
                 $token = $tokens[$i];
                 if ('variable' === $token[0] && $route->hasDefault($token[3])) {
                     $firstOptional = $i;
@@ -157,13 +157,13 @@ class RouteCompiler implements RouteCompilerInterface
 
         // compute the matching regexp
         $regexp = '';
-        for ($i = 0, $nbToken = count($tokens); $i < $nbToken; $i++) {
+        for ($i = 0, $nbToken = count($tokens); $i < $nbToken; ++$i) {
             $regexp .= self::computeRegexp($tokens, $i, $firstOptional);
         }
 
         return array(
             'staticPrefix' => 'text' === $tokens[0][0] ? $tokens[0][1] : '',
-            'regex' => self::REGEX_DELIMITER.'^'.$regexp.'$'.self::REGEX_DELIMITER.'s',
+            'regex' => self::REGEX_DELIMITER.'^'.$regexp.'$'.self::REGEX_DELIMITER.'s'.($isHost ? 'i' : ''),
             'tokens' => array_reverse($tokens),
             'variables' => $variables,
         );
@@ -191,9 +191,9 @@ class RouteCompiler implements RouteCompilerInterface
     /**
      * Computes the regexp used to match a specific token. It can be static text or a subpattern.
      *
-     * @param array   $tokens        The route tokens
-     * @param int     $index         The index of the current token
-     * @param int     $firstOptional The index of the first optional token
+     * @param array $tokens        The route tokens
+     * @param int   $index         The index of the current token
+     * @param int   $firstOptional The index of the first optional token
      *
      * @return string The regexp pattern for a single token
      */
@@ -218,7 +218,7 @@ class RouteCompiler implements RouteCompilerInterface
                     $nbTokens = count($tokens);
                     if ($nbTokens - 1 == $index) {
                         // Close the optional subpatterns
-                        $regexp .= str_repeat(")?", $nbTokens - $firstOptional - (0 === $firstOptional ? 1 : 0));
+                        $regexp .= str_repeat(')?', $nbTokens - $firstOptional - (0 === $firstOptional ? 1 : 0));
                     }
                 }
 
--- a/vendor/symfony/routing/Symfony/Component/Routing/Router.php
+++ b/vendor/symfony/routing/Symfony/Component/Routing/Router.php
@@ -100,18 +100,18 @@ class Router implements RouterInterface
     public function setOptions(array $options)
     {
         $this->options = array(
-            'cache_dir'              => null,
-            'debug'                  => false,
-            'generator_class'        => 'Symfony\\Component\\Routing\\Generator\\UrlGenerator',
-            'generator_base_class'   => 'Symfony\\Component\\Routing\\Generator\\UrlGenerator',
+            'cache_dir' => null,
+            'debug' => false,
+            'generator_class' => 'Symfony\\Component\\Routing\\Generator\\UrlGenerator',
+            'generator_base_class' => 'Symfony\\Component\\Routing\\Generator\\UrlGenerator',
             'generator_dumper_class' => 'Symfony\\Component\\Routing\\Generator\\Dumper\\PhpGeneratorDumper',
-            'generator_cache_class'  => 'ProjectUrlGenerator',
-            'matcher_class'          => 'Symfony\\Component\\Routing\\Matcher\\UrlMatcher',
-            'matcher_base_class'     => 'Symfony\\Component\\Routing\\Matcher\\UrlMatcher',
-            'matcher_dumper_class'   => 'Symfony\\Component\\Routing\\Matcher\\Dumper\\PhpMatcherDumper',
-            'matcher_cache_class'    => 'ProjectUrlMatcher',
-            'resource_type'          => null,
-            'strict_requirements'    => true,
+            'generator_cache_class' => 'ProjectUrlGenerator',
+            'matcher_class' => 'Symfony\\Component\\Routing\\Matcher\\UrlMatcher',
+            'matcher_base_class' => 'Symfony\\Component\\Routing\\Matcher\\UrlMatcher',
+            'matcher_dumper_class' => 'Symfony\\Component\\Routing\\Matcher\\Dumper\\PhpMatcherDumper',
+            'matcher_cache_class' => 'ProjectUrlMatcher',
+            'resource_type' => null,
+            'strict_requirements' => true,
         );
 
         // check option names and live merge, if errors are encountered Exception will be thrown
@@ -236,7 +236,7 @@ class Router implements RouterInterface
             $dumper = new $this->options['matcher_dumper_class']($this->getRouteCollection());
 
             $options = array(
-                'class'      => $class,
+                'class' => $class,
                 'base_class' => $this->options['matcher_base_class'],
             );
 
@@ -268,7 +268,7 @@ class Router implements RouterInterface
                 $dumper = new $this->options['generator_dumper_class']($this->getRouteCollection());
 
                 $options = array(
-                    'class'      => $class,
+                    'class' => $class,
                     'base_class' => $this->options['generator_base_class'],
                 );
 
--- a/vendor/symfony/routing/Symfony/Component/Routing/composer.json
+++ b/vendor/symfony/routing/Symfony/Component/Routing/composer.json
@@ -3,7 +3,7 @@
     "type": "library",
     "description": "Symfony Routing Component",
     "keywords": [],
-    "homepage": "http://symfony.com",
+    "homepage": "https://symfony.com",
     "license": "MIT",
     "authors": [
         {
@@ -12,7 +12,7 @@
         },
         {
             "name": "Symfony Community",
-            "homepage": "http://symfony.com/contributors"
+            "homepage": "https://symfony.com/contributors"
         }
     ],
     "require": {
@@ -21,7 +21,7 @@
     "require-dev": {
         "symfony/config": "~2.2",
         "symfony/http-foundation": "~2.3",
-        "symfony/yaml": "~2.0",
+        "symfony/yaml": "~2.0,>=2.0.5",
         "doctrine/common": "~2.2",
         "psr/log": "~1.0"
     },
@@ -31,7 +31,10 @@
         "doctrine/common": ""
     },
     "autoload": {
-        "psr-0": { "Symfony\\Component\\Routing\\": "" }
+        "psr-0": { "Symfony\\Component\\Routing\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
     },
     "target-dir": "Symfony/Component/Routing",
     "minimum-stability": "dev",
--- a/vendor/symfony/yaml/Symfony/Component/Yaml/Dumper.php
+++ b/vendor/symfony/yaml/Symfony/Component/Yaml/Dumper.php
@@ -28,7 +28,7 @@ class Dumper
     /**
      * Sets the indentation.
      *
-     * @param int     $num The amount of spaces to use for indentation of nested nodes.
+     * @param int $num The amount of spaces to use for indentation of nested nodes.
      */
     public function setIndentation($num)
     {
@@ -38,13 +38,13 @@ class Dumper
     /**
      * Dumps a PHP value to YAML.
      *
-     * @param mixed   $input                  The PHP value
-     * @param int     $inline                 The level where you switch to inline YAML
-     * @param int     $indent                 The level of indentation (used internally)
-     * @param bool    $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
-     * @param bool    $objectSupport          true if object support is enabled, false otherwise
+     * @param mixed $input                  The PHP value
+     * @param int   $inline                 The level where you switch to inline YAML
+     * @param int   $indent                 The level of indentation (used internally)
+     * @param bool  $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
+     * @param bool  $objectSupport          true if object support is enabled, false otherwise
      *
-     * @return string  The YAML representation of the PHP value
+     * @return string The YAML representation of the PHP value
      */
     public function dump($input, $inline = 0, $indent = 0, $exceptionOnInvalidType = false, $objectSupport = false)
     {
--- a/vendor/symfony/yaml/Symfony/Component/Yaml/Escaper.php
+++ b/vendor/symfony/yaml/Symfony/Component/Yaml/Escaper.php
@@ -32,19 +32,19 @@ class Escaper
                                      "\x10",  "\x11",  "\x12",  "\x13",  "\x14",  "\x15",  "\x16",  "\x17",
                                      "\x18",  "\x19",  "\x1a",  "\x1b",  "\x1c",  "\x1d",  "\x1e",  "\x1f",
                                      "\xc2\x85", "\xc2\xa0", "\xe2\x80\xa8", "\xe2\x80\xa9",);
-    private static $escaped  = array('\\\\', '\\"', '\\\\', '\\"',
-                                     "\\0",   "\\x01", "\\x02", "\\x03", "\\x04", "\\x05", "\\x06", "\\a",
-                                     "\\b",   "\\t",   "\\n",   "\\v",   "\\f",   "\\r",   "\\x0e", "\\x0f",
-                                     "\\x10", "\\x11", "\\x12", "\\x13", "\\x14", "\\x15", "\\x16", "\\x17",
-                                     "\\x18", "\\x19", "\\x1a", "\\e",   "\\x1c", "\\x1d", "\\x1e", "\\x1f",
-                                     "\\N", "\\_", "\\L", "\\P",);
+    private static $escaped = array('\\\\', '\\"', '\\\\', '\\"',
+                                     '\\0',   '\\x01', '\\x02', '\\x03', '\\x04', '\\x05', '\\x06', '\\a',
+                                     '\\b',   '\\t',   '\\n',   '\\v',   '\\f',   '\\r',   '\\x0e', '\\x0f',
+                                     '\\x10', '\\x11', '\\x12', '\\x13', '\\x14', '\\x15', '\\x16', '\\x17',
+                                     '\\x18', '\\x19', '\\x1a', '\\e',   '\\x1c', '\\x1d', '\\x1e', '\\x1f',
+                                     '\\N', '\\_', '\\L', '\\P',);
 
     /**
      * Determines if a PHP value would require double quoting in YAML.
      *
      * @param string $value A PHP value
      *
-     * @return bool    True if the value would require double quotes.
+     * @return bool True if the value would require double quotes.
      */
     public static function requiresDoubleQuoting($value)
     {
@@ -68,10 +68,18 @@ class Escaper
      *
      * @param string $value A PHP value
      *
-     * @return bool    True if the value would require single quotes.
+     * @return bool True if the value would require single quotes.
      */
     public static function requiresSingleQuoting($value)
     {
+        // Determines if a PHP value is entirely composed of a value that would
+        // require single quoting in YAML.
+        if (in_array(strtolower($value), array('null', '~', 'true', 'false', 'y', 'n', 'yes', 'no', 'on', 'off'))) {
+            return true;
+        }
+
+        // Determines if the PHP value contains any single characters that would
+        // cause it to require single quoting in YAML.
         return preg_match('/[ \s \' " \: \{ \} \[ \] , & \* \# \?] | \A[ \- ? | < > = ! % @ ` ]/x', $value);
     }
 
--- a/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/DumpException.php
+++ b/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/DumpException.php
@@ -15,8 +15,6 @@ namespace Symfony\Component\Yaml\Exception;
  * Exception class thrown when an error occurs during dumping.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class DumpException extends RuntimeException
 {
--- a/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/ExceptionInterface.php
+++ b/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/ExceptionInterface.php
@@ -15,8 +15,6 @@ namespace Symfony\Component\Yaml\Exception;
  * Exception interface for all exceptions thrown by the component.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 interface ExceptionInterface
 {
--- a/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/ParseException.php
+++ b/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/ParseException.php
@@ -11,17 +11,10 @@
 
 namespace Symfony\Component\Yaml\Exception;
 
-if (!defined('JSON_UNESCAPED_UNICODE')) {
-    define('JSON_UNESCAPED_SLASHES', 64);
-    define('JSON_UNESCAPED_UNICODE', 256);
-}
-
 /**
  * Exception class thrown when an error occurs during parsing.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class ParseException extends RuntimeException
 {
@@ -33,10 +26,10 @@ class ParseException extends RuntimeException
     /**
      * Constructor.
      *
-     * @param string    $message    The error message
-     * @param int       $parsedLine The line where the error occurred
-     * @param int       $snippet    The snippet of code near the problem
-     * @param string    $parsedFile The file name where the error occurred
+     * @param string     $message    The error message
+     * @param int        $parsedLine The line where the error occurred
+     * @param int        $snippet    The snippet of code near the problem
+     * @param string     $parsedFile The file name where the error occurred
      * @param \Exception $previous   The previous exception
      */
     public function __construct($message, $parsedLine = -1, $snippet = null, $parsedFile = null, \Exception $previous = null)
@@ -100,7 +93,7 @@ class ParseException extends RuntimeException
     /**
      * Gets the line where the error occurred.
      *
-     * @return int     The file line
+     * @return int The file line
      */
     public function getParsedLine()
     {
@@ -110,7 +103,7 @@ class ParseException extends RuntimeException
     /**
      * Sets the line where the error occurred.
      *
-     * @param int     $parsedLine The file line
+     * @param int $parsedLine The file line
      */
     public function setParsedLine($parsedLine)
     {
@@ -130,7 +123,12 @@ class ParseException extends RuntimeException
         }
 
         if (null !== $this->parsedFile) {
-            $this->message .= sprintf(' in %s', json_encode($this->parsedFile, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));
+            if (PHP_VERSION_ID >= 50400) {
+                $jsonOptions = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE;
+            } else {
+                $jsonOptions = 0;
+            }
+            $this->message .= sprintf(' in %s', json_encode($this->parsedFile, $jsonOptions));
         }
 
         if ($this->parsedLine >= 0) {
--- a/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/RuntimeException.php
+++ b/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/RuntimeException.php
@@ -15,8 +15,6 @@ namespace Symfony\Component\Yaml\Exception;
  * Exception class thrown when an error occurs during parsing.
  *
  * @author Romain Neutron <imprec@gmail.com>
- *
- * @api
  */
 class RuntimeException extends \RuntimeException implements ExceptionInterface
 {
--- a/vendor/symfony/yaml/Symfony/Component/Yaml/Inline.php
+++ b/vendor/symfony/yaml/Symfony/Component/Yaml/Inline.php
@@ -29,10 +29,10 @@ class Inline
     /**
      * Converts a YAML string to a PHP array.
      *
-     * @param string  $value                  A YAML string
-     * @param bool    $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
-     * @param bool    $objectSupport          true if object support is enabled, false otherwise
-     * @param array   $references             Mapping of variable names to values
+     * @param string $value                  A YAML string
+     * @param bool   $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
+     * @param bool   $objectSupport          true if object support is enabled, false otherwise
+     * @param array  $references             Mapping of variable names to values
      *
      * @return array A PHP array representing the YAML string
      *
@@ -45,7 +45,7 @@ class Inline
 
         $value = trim($value);
 
-        if (0 == strlen($value)) {
+        if ('' === $value) {
             return '';
         }
 
@@ -83,9 +83,9 @@ class Inline
     /**
      * Dumps a given PHP variable to a YAML string.
      *
-     * @param mixed   $value                  The PHP variable to convert
-     * @param bool    $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
-     * @param bool    $objectSupport          true if object support is enabled, false otherwise
+     * @param mixed $value                  The PHP variable to convert
+     * @param bool  $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
+     * @param bool  $objectSupport          true if object support is enabled, false otherwise
      *
      * @return string The YAML string representing the PHP array
      *
@@ -125,22 +125,21 @@ class Inline
                 if (false !== $locale) {
                     setlocale(LC_NUMERIC, 'C');
                 }
-                $repr = is_string($value) ? "'$value'" : (is_infinite($value) ? str_ireplace('INF', '.Inf', strval($value)) : strval($value));
+                $repr = is_string($value) ? "'$value'" : (is_infinite($value) ? str_ireplace('INF', '.Inf', (string) $value) : (string) $value);
 
                 if (false !== $locale) {
                     setlocale(LC_NUMERIC, $locale);
                 }
 
                 return $repr;
+            case '' == $value:
+                return "''";
             case Escaper::requiresDoubleQuoting($value):
                 return Escaper::escapeWithDoubleQuotes($value);
             case Escaper::requiresSingleQuoting($value):
-                return Escaper::escapeWithSingleQuotes($value);
-            case '' == $value:
-                return "''";
+            case preg_match(self::getHexRegex(), $value):
             case preg_match(self::getTimestampRegex(), $value):
-            case in_array(strtolower($value), array('null', '~', 'true', 'false')):
-                return "'$value'";
+                return Escaper::escapeWithSingleQuotes($value);
             default:
                 return $value;
         }
@@ -149,9 +148,9 @@ class Inline
     /**
      * Dumps a PHP array to a YAML string.
      *
-     * @param array   $value                  The PHP array to dump
-     * @param bool    $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
-     * @param bool    $objectSupport          true if object support is enabled, false otherwise
+     * @param array $value                  The PHP array to dump
+     * @param bool  $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
+     * @param bool  $objectSupport          true if object support is enabled, false otherwise
      *
      * @return string The YAML string representing the PHP array
      */
@@ -159,8 +158,9 @@ class Inline
     {
         // array
         $keys = array_keys($value);
-        if ((1 == count($keys) && '0' == $keys[0])
-            || (count($keys) > 1 && array_reduce($keys, function ($v, $w) { return (int) $v + $w; }, 0) == count($keys) * (count($keys) - 1) / 2)
+        $keysCount = count($keys);
+        if ((1 === $keysCount && '0' == $keys[0])
+            || ($keysCount > 1 && array_reduce($keys, function ($v, $w) { return (int) $v + $w; }, 0) === $keysCount * ($keysCount - 1) / 2)
         ) {
             $output = array();
             foreach ($value as $val) {
@@ -182,7 +182,7 @@ class Inline
     /**
      * Parses a scalar to a YAML string.
      *
-     * @param scalar $scalar
+     * @param string $scalar
      * @param string $delimiters
      * @param array  $stringDelimiters
      * @param int    &$i
@@ -212,8 +212,8 @@ class Inline
                 $i += strlen($output);
 
                 // remove comments
-                if (false !== $strpos = strpos($output, ' #')) {
-                    $output = rtrim(substr($output, 0, $strpos));
+                if (preg_match('/[ \t]+#/', $output, $match, PREG_OFFSET_CAPTURE)) {
+                    $output = substr($output, 0, $match[0][1]);
                 }
             } elseif (preg_match('/^(.+?)('.implode('|', $delimiters).')/', substr($scalar, $i), $match)) {
                 $output = $match[1];
@@ -234,7 +234,7 @@ class Inline
      * Parses a quoted scalar to YAML.
      *
      * @param string $scalar
-     * @param int     &$i
+     * @param int    &$i
      *
      * @return string A YAML string
      *
@@ -275,7 +275,7 @@ class Inline
     {
         $output = array();
         $len = strlen($sequence);
-        $i += 1;
+        ++$i;
 
         // [foo, bar, ...]
         while ($i < $len) {
@@ -334,7 +334,7 @@ class Inline
     {
         $output = array();
         $len = strlen($mapping);
-        $i += 1;
+        ++$i;
 
         // {foo: bar, bar:foo, ...}
         while ($i < $len) {
@@ -433,7 +433,7 @@ class Inline
                     case 0 === strpos($scalar, '!str'):
                         return (string) substr($scalar, 5);
                     case 0 === strpos($scalar, '! '):
-                        return intval(self::parseScalar(substr($scalar, 2)));
+                        return (int) self::parseScalar(substr($scalar, 2));
                     case 0 === strpos($scalar, '!!php/object:'):
                         if (self::$objectSupport) {
                             return unserialize(substr($scalar, 13));
@@ -446,23 +446,24 @@ class Inline
                         return;
                     case ctype_digit($scalar):
                         $raw = $scalar;
-                        $cast = intval($scalar);
+                        $cast = (int) $scalar;
 
                         return '0' == $scalar[0] ? octdec($scalar) : (((string) $raw == (string) $cast) ? $cast : $raw);
                     case '-' === $scalar[0] && ctype_digit(substr($scalar, 1)):
                         $raw = $scalar;
-                        $cast = intval($scalar);
+                        $cast = (int) $scalar;
 
-                        return '0' == $scalar[1] ? octdec($scalar) : (((string) $raw == (string) $cast) ? $cast : $raw);
+                        return '0' == $scalar[1] ? octdec($scalar) : (((string) $raw === (string) $cast) ? $cast : $raw);
                     case is_numeric($scalar):
-                        return '0x' == $scalar[0].$scalar[1] ? hexdec($scalar) : floatval($scalar);
+                    case preg_match(self::getHexRegex(), $scalar):
+                        return '0x' === $scalar[0].$scalar[1] ? hexdec($scalar) : (float) $scalar;
                     case '.inf' === $scalarLower:
                     case '.nan' === $scalarLower:
                         return -log(0);
                     case '-.inf' === $scalarLower:
                         return log(0);
                     case preg_match('/^(-|\+)?[0-9,]+(\.[0-9]+)?$/', $scalar):
-                        return floatval(str_replace(',', '', $scalar));
+                        return (float) str_replace(',', '', $scalar);
                     case preg_match(self::getTimestampRegex(), $scalar):
                         return strtotime($scalar);
                 }
@@ -495,4 +496,14 @@ class Inline
         $~x
 EOF;
     }
+
+    /**
+     * Gets a regex that matches a YAML number in hexadecimal notation.
+     *
+     * @return string
+     */
+    private static function getHexRegex()
+    {
+        return '~^0x[0-9a-f]++$~i';
+    }
 }
--- a/vendor/symfony/yaml/Symfony/Component/Yaml/LICENSE
+++ b/vendor/symfony/yaml/Symfony/Component/Yaml/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2014 Fabien Potencier
+Copyright (c) 2004-2015 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
--- a/vendor/symfony/yaml/Symfony/Component/Yaml/Parser.php
+++ b/vendor/symfony/yaml/Symfony/Component/Yaml/Parser.php
@@ -20,18 +20,20 @@ use Symfony\Component\Yaml\Exception\ParseException;
  */
 class Parser
 {
-    const FOLDED_SCALAR_PATTERN = '(?P<separator>\||>)(?P<modifiers>\+|\-|\d+|\+\d+|\-\d+|\d+\+|\d+\-)?(?P<comments> +#.*)?';
+    const BLOCK_SCALAR_HEADER_PATTERN = '(?P<separator>\||>)(?P<modifiers>\+|\-|\d+|\+\d+|\-\d+|\d+\+|\d+\-)?(?P<comments> +#.*)?';
+    // BC - wrongly named
+    const FOLDED_SCALAR_PATTERN = self::BLOCK_SCALAR_HEADER_PATTERN;
 
-    private $offset         = 0;
-    private $lines          = array();
-    private $currentLineNb  = -1;
-    private $currentLine    = '';
-    private $refs           = array();
+    private $offset = 0;
+    private $lines = array();
+    private $currentLineNb = -1;
+    private $currentLine = '';
+    private $refs = array();
 
     /**
-     * Constructor
+     * Constructor.
      *
-     * @param int     $offset The offset of YAML document (used for line numbers in error messages)
+     * @param int $offset The offset of YAML document (used for line numbers in error messages)
      */
     public function __construct($offset = 0)
     {
@@ -41,23 +43,23 @@ class Parser
     /**
      * Parses a YAML string to a PHP value.
      *
-     * @param string  $value                  A YAML string
-     * @param bool    $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
-     * @param bool    $objectSupport          true if object support is enabled, false otherwise
+     * @param string $value                  A YAML string
+     * @param bool   $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
+     * @param bool   $objectSupport          true if object support is enabled, false otherwise
      *
-     * @return mixed  A PHP value
+     * @return mixed A PHP value
      *
      * @throws ParseException If the YAML is not valid
      */
     public function parse($value, $exceptionOnInvalidType = false, $objectSupport = false)
     {
-        $this->currentLineNb = -1;
-        $this->currentLine = '';
-        $this->lines = explode("\n", $this->cleanup($value));
-
         if (!preg_match('//u', $value)) {
             throw new ParseException('The YAML value does not appear to be valid UTF-8.');
         }
+        $this->currentLineNb = -1;
+        $this->currentLine = '';
+        $value = $this->cleanup($value);
+        $this->lines = explode("\n", $value);
 
         if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) {
             $mbEncoding = mb_internal_encoding();
@@ -91,22 +93,21 @@ class Parser
                 // array
                 if (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) {
                     $c = $this->getRealCurrentLineNb() + 1;
-                    $parser = new Parser($c);
-                    $parser->refs = & $this->refs;
+                    $parser = new self($c);
+                    $parser->refs = &$this->refs;
                     $data[] = $parser->parse($this->getNextEmbedBlock(null, true), $exceptionOnInvalidType, $objectSupport);
                 } else {
                     if (isset($values['leadspaces'])
-                        && ' ' == $values['leadspaces']
                         && preg_match('#^(?P<key>'.Inline::REGEX_QUOTED_STRING.'|[^ \'"\{\[].*?) *\:(\s+(?P<value>.+?))?\s*$#u', $values['value'], $matches)
                     ) {
                         // this is a compact notation element, add to next block and parse
                         $c = $this->getRealCurrentLineNb();
-                        $parser = new Parser($c);
-                        $parser->refs = & $this->refs;
+                        $parser = new self($c);
+                        $parser->refs = &$this->refs;
 
                         $block = $values['value'];
                         if ($this->isNextLineIndented()) {
-                            $block .= "\n".$this->getNextEmbedBlock($this->getCurrentLineIndentation() + 2);
+                            $block .= "\n".$this->getNextEmbedBlock($this->getCurrentLineIndentation() + strlen($values['leadspaces']) + 1);
                         }
 
                         $data[] = $parser->parse($block, $exceptionOnInvalidType, $objectSupport);
@@ -114,7 +115,10 @@ class Parser
                         $data[] = $this->parseValue($values['value'], $exceptionOnInvalidType, $objectSupport);
                     }
                 }
-            } elseif (preg_match('#^(?P<key>'.Inline::REGEX_QUOTED_STRING.'|[^ \'"\[\{].*?) *\:(\s+(?P<value>.+?))?\s*$#u', $this->currentLine, $values) && (false === strpos($values['key'],' #') || in_array($values['key'][0], array('"', "'")))) {
+                if ($isRef) {
+                    $this->refs[$isRef] = end($data);
+                }
+            } elseif (preg_match('#^(?P<key>'.Inline::REGEX_QUOTED_STRING.'|[^ \'"\[\{].*?) *\:(\s+(?P<value>.+?))?\s*$#u', $this->currentLine, $values) && (false === strpos($values['key'], ' #') || in_array($values['key'][0], array('"', "'")))) {
                 if ($context && 'sequence' == $context) {
                     throw new ParseException('You cannot define a mapping item when in a sequence');
                 }
@@ -131,6 +135,11 @@ class Parser
                     throw $e;
                 }
 
+                // Convert float keys to strings, to avoid being converted to integers by PHP
+                if (is_float($key)) {
+                    $key = (string) $key;
+                }
+
                 if ('<<' === $key) {
                     if (isset($values['value']) && 0 === strpos($values['value'], '*')) {
                         $isInPlace = substr($values['value'], 1);
@@ -144,8 +153,8 @@ class Parser
                             $value = $this->getNextEmbedBlock();
                         }
                         $c = $this->getRealCurrentLineNb() + 1;
-                        $parser = new Parser($c);
-                        $parser->refs = & $this->refs;
+                        $parser = new self($c);
+                        $parser->refs = &$this->refs;
                         $parsed = $parser->parse($value, $exceptionOnInvalidType, $objectSupport);
 
                         $merged = array();
@@ -181,8 +190,8 @@ class Parser
                         $data[$key] = null;
                     } else {
                         $c = $this->getRealCurrentLineNb() + 1;
-                        $parser = new Parser($c);
-                        $parser->refs = & $this->refs;
+                        $parser = new self($c);
+                        $parser->refs = &$this->refs;
                         $data[$key] = $parser->parse($this->getNextEmbedBlock(), $exceptionOnInvalidType, $objectSupport);
                     }
                 } else {
@@ -192,10 +201,17 @@ class Parser
                         $data[$key] = $this->parseValue($values['value'], $exceptionOnInvalidType, $objectSupport);
                     }
                 }
+                if ($isRef) {
+                    $this->refs[$isRef] = $data[$key];
+                }
             } else {
-                // 1-liner optionally followed by newline
-                $lineCount = count($this->lines);
-                if (1 === $lineCount || (2 === $lineCount && empty($this->lines[1]))) {
+                // multiple documents are not supported
+                if ('---' === $this->currentLine) {
+                    throw new ParseException('Multiple documents are not supported.');
+                }
+
+                // 1-liner optionally followed by newline(s)
+                if ($this->lines[0] === trim($value)) {
                     try {
                         $value = Inline::parse($this->lines[0], $exceptionOnInvalidType, $objectSupport, $this->refs);
                     } catch (ParseException $e) {
@@ -245,10 +261,6 @@ class Parser
 
                 throw new ParseException($error, $this->getRealCurrentLineNb() + 1, $this->currentLine);
             }
-
-            if ($isRef) {
-                $this->refs[$isRef] = end($data);
-            }
         }
 
         if (isset($mbEncoding)) {
@@ -261,7 +273,7 @@ class Parser
     /**
      * Returns the current line number (takes the offset into account).
      *
-     * @return int     The current line number
+     * @return int The current line number
      */
     private function getRealCurrentLineNb()
     {
@@ -271,7 +283,7 @@ class Parser
     /**
      * Returns the current line indentation.
      *
-     * @return int     The current line indentation
+     * @return int The current line indentation
      */
     private function getCurrentLineIndentation()
     {
@@ -308,9 +320,16 @@ class Parser
             $newIndent = $indentation;
         }
 
-        $data = array(substr($this->currentLine, $newIndent));
+        $data = array();
+        if ($this->getCurrentLineIndentation() >= $newIndent) {
+            $data[] = substr($this->currentLine, $newIndent);
+        } else {
+            $this->moveToPreviousLine();
+
+            return;
+        }
 
-        if ($inSequence && $oldLineIndentation === $newIndent && '-' === $data[0][0]) {
+        if ($inSequence && $oldLineIndentation === $newIndent && isset($data[0][0]) && '-' === $data[0][0]) {
             // the previous line contained a dash but no item content, this line is a sequence item with the same indentation
             // and therefore no nested list or mapping
             $this->moveToPreviousLine();
@@ -320,8 +339,8 @@ class Parser
 
         $isItUnindentedCollection = $this->isStringUnIndentedCollectionItem($this->currentLine);
 
-        // Comments must not be removed inside a string block (ie. after a line ending with "|")
-        $removeCommentsPattern = '~'.self::FOLDED_SCALAR_PATTERN.'$~';
+        // Comments must not be removed inside a block scalar
+        $removeCommentsPattern = '~'.self::BLOCK_SCALAR_HEADER_PATTERN.'$~';
         $removeComments = !preg_match($removeCommentsPattern, $this->currentLine);
 
         while ($this->moveToNextLine()) {
@@ -331,7 +350,7 @@ class Parser
                 $removeComments = !preg_match($removeCommentsPattern, $this->currentLine);
             }
 
-            if ($isItUnindentedCollection && !$this->isStringUnIndentedCollectionItem($this->currentLine)) {
+            if ($isItUnindentedCollection && !$this->isStringUnIndentedCollectionItem($this->currentLine) && $newIndent === $indent) {
                 $this->moveToPreviousLine();
                 break;
             }
@@ -386,11 +405,11 @@ class Parser
     /**
      * Parses a YAML value.
      *
-     * @param string  $value                  A YAML value
-     * @param bool    $exceptionOnInvalidType True if an exception must be thrown on invalid types false otherwise
-     * @param bool    $objectSupport          True if object support is enabled, false otherwise
+     * @param string $value                  A YAML value
+     * @param bool   $exceptionOnInvalidType True if an exception must be thrown on invalid types false otherwise
+     * @param bool   $objectSupport          True if object support is enabled, false otherwise
      *
-     * @return mixed  A PHP value
+     * @return mixed A PHP value
      *
      * @throws ParseException When reference does not exist
      */
@@ -410,10 +429,10 @@ class Parser
             return $this->refs[$value];
         }
 
-        if (preg_match('/^'.self::FOLDED_SCALAR_PATTERN.'$/', $value, $matches)) {
+        if (preg_match('/^'.self::BLOCK_SCALAR_HEADER_PATTERN.'$/', $value, $matches)) {
             $modifiers = isset($matches['modifiers']) ? $matches['modifiers'] : '';
 
-            return $this->parseFoldedScalar($matches['separator'], preg_replace('#\d+#', '', $modifiers), intval(abs($modifiers)));
+            return $this->parseBlockScalar($matches['separator'], preg_replace('#\d+#', '', $modifiers), (int) abs($modifiers));
         }
 
         try {
@@ -427,15 +446,15 @@ class Parser
     }
 
     /**
-     * Parses a folded scalar.
+     * Parses a block scalar.
      *
-     * @param string  $separator   The separator that was used to begin this folded scalar (| or >)
-     * @param string  $indicator   The indicator that was used to begin this folded scalar (+ or -)
-     * @param int     $indentation The indentation that was used to begin this folded scalar
+     * @param string $style       The style indicator that was used to begin this block scalar (| or >)
+     * @param string $chomping    The chomping indicator that was used to begin this block scalar (+ or -)
+     * @param int    $indentation The indentation indicator that was used to begin this block scalar
      *
-     * @return string  The text value
+     * @return string The text value
      */
-    private function parseFoldedScalar($separator, $indicator = '', $indentation = 0)
+    private function parseBlockScalar($style, $chomping = '', $indentation = 0)
     {
         $notEOF = $this->moveToNextLine();
         if (!$notEOF) {
@@ -490,18 +509,24 @@ class Parser
             $this->moveToPreviousLine();
         }
 
-        // replace all non-trailing single newlines with spaces in folded blocks
-        if ('>' === $separator) {
+        // folded style
+        if ('>' === $style) {
+            // folded lines
+            // replace all non-leading/non-trailing single newlines with spaces
             preg_match('/(\n*)$/', $text, $matches);
-            $text = preg_replace('/(?<!\n)\n(?!\n)/', ' ', rtrim($text, "\n"));
+            $text = preg_replace('/(?<!\n|^)\n(?!\n)/', ' ', rtrim($text, "\n"));
             $text .= $matches[1];
+
+            // empty separation lines
+            // remove one newline from each group of non-leading/non-trailing newlines
+            $text = preg_replace('/[^\n]\n+\K\n(?=[^\n])/', '', $text);
         }
 
-        // deal with trailing newlines as indicated
-        if ('' === $indicator) {
-            $text = preg_replace('/\n+$/s', "\n", $text);
-        } elseif ('-' === $indicator) {
-            $text = preg_replace('/\n+$/s', '', $text);
+        // deal with trailing newlines
+        if ('' === $chomping) {
+            $text = preg_replace('/\n+$/', "\n", $text);
+        } elseif ('-' === $chomping) {
+            $text = preg_replace('/\n+$/', '', $text);
         }
 
         return $text;
@@ -510,7 +535,7 @@ class Parser
     /**
      * Returns true if the next line is indented.
      *
-     * @return bool    Returns true if the next line is indented, false otherwise
+     * @return bool Returns true if the next line is indented, false otherwise
      */
     private function isNextLineIndented()
     {
@@ -538,7 +563,7 @@ class Parser
     /**
      * Returns true if the current line is blank or if it is a comment line.
      *
-     * @return bool    Returns true if the current line is empty or if it is a comment line, false otherwise
+     * @return bool Returns true if the current line is empty or if it is a comment line, false otherwise
      */
     private function isCurrentLineEmpty()
     {
@@ -548,7 +573,7 @@ class Parser
     /**
      * Returns true if the current line is blank.
      *
-     * @return bool    Returns true if the current line is blank, false otherwise
+     * @return bool Returns true if the current line is blank, false otherwise
      */
     private function isCurrentLineBlank()
     {
@@ -558,7 +583,7 @@ class Parser
     /**
      * Returns true if the current line is a comment line.
      *
-     * @return bool    Returns true if the current line is a comment line, false otherwise
+     * @return bool Returns true if the current line is a comment line, false otherwise
      */
     private function isCurrentLineComment()
     {
@@ -581,7 +606,7 @@ class Parser
 
         // strip YAML header
         $count = 0;
-        $value = preg_replace('#^\%YAML[: ][\d\.]+.*\n#su', '', $value, -1, $count);
+        $value = preg_replace('#^\%YAML[: ][\d\.]+.*\n#u', '', $value, -1, $count);
         $this->offset += $count;
 
         // remove leading comments
@@ -600,16 +625,16 @@ class Parser
             $value = $trimmedValue;
 
             // remove end of the document marker (...)
-            $value = preg_replace('#\.\.\.\s*$#s', '', $value);
+            $value = preg_replace('#\.\.\.\s*$#', '', $value);
         }
 
         return $value;
     }
 
     /**
-     * Returns true if the next line starts unindented collection
+     * Returns true if the next line starts unindented collection.
      *
-     * @return bool    Returns true if the next line starts unindented collection, false otherwise
+     * @return bool Returns true if the next line starts unindented collection, false otherwise
      */
     private function isNextLineUnIndentedCollection()
     {
@@ -639,9 +664,9 @@ class Parser
     }
 
     /**
-     * Returns true if the string is un-indented collection item
+     * Returns true if the string is un-indented collection item.
      *
-     * @return bool    Returns true if the string is un-indented collection item, false otherwise
+     * @return bool Returns true if the string is un-indented collection item, false otherwise
      */
     private function isStringUnIndentedCollectionItem()
     {
--- a/vendor/symfony/yaml/Symfony/Component/Yaml/Unescaper.php
+++ b/vendor/symfony/yaml/Symfony/Component/Yaml/Unescaper.php
@@ -59,7 +59,7 @@ class Unescaper
     }
 
     /**
-     * Unescapes a character that was found in a double-quoted string
+     * Unescapes a character that was found in a double-quoted string.
      *
      * @param string $value An escaped character
      *
--- a/vendor/symfony/yaml/Symfony/Component/Yaml/Yaml.php
+++ b/vendor/symfony/yaml/Symfony/Component/Yaml/Yaml.php
@@ -17,8 +17,6 @@ use Symfony\Component\Yaml\Exception\ParseException;
  * Yaml offers convenience methods to load and dump YAML.
  *
  * @author Fabien Potencier <fabien@symfony.com>
- *
- * @api
  */
 class Yaml
 {
@@ -38,15 +36,13 @@ class Yaml
      * you must validate the input before calling this method. Passing a file
      * as an input is a deprecated feature and will be removed in 3.0.
      *
-     * @param string  $input                  Path to a YAML file or a string containing YAML
-     * @param bool    $exceptionOnInvalidType True if an exception must be thrown on invalid types false otherwise
-     * @param bool    $objectSupport          True if object support is enabled, false otherwise
+     * @param string $input                  Path to a YAML file or a string containing YAML
+     * @param bool   $exceptionOnInvalidType True if an exception must be thrown on invalid types false otherwise
+     * @param bool   $objectSupport          True if object support is enabled, false otherwise
      *
      * @return array The YAML converted to a PHP array
      *
      * @throws ParseException If the YAML is not valid
-     *
-     * @api
      */
     public static function parse($input, $exceptionOnInvalidType = false, $objectSupport = false)
     {
@@ -80,15 +76,13 @@ class Yaml
      * The dump method, when supplied with an array, will do its best
      * to convert the array into friendly YAML.
      *
-     * @param array   $array                  PHP array
-     * @param int     $inline                 The level where you switch to inline YAML
-     * @param int     $indent                 The amount of spaces to use for indentation of nested nodes.
-     * @param bool    $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
-     * @param bool    $objectSupport          true if object support is enabled, false otherwise
+     * @param array $array                  PHP array
+     * @param int   $inline                 The level where you switch to inline YAML
+     * @param int   $indent                 The amount of spaces to use for indentation of nested nodes.
+     * @param bool  $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
+     * @param bool  $objectSupport          true if object support is enabled, false otherwise
      *
      * @return string A YAML string representing the original PHP array
-     *
-     * @api
      */
     public static function dump($array, $inline = 2, $indent = 4, $exceptionOnInvalidType = false, $objectSupport = false)
     {
--- a/vendor/symfony/yaml/Symfony/Component/Yaml/composer.json
+++ b/vendor/symfony/yaml/Symfony/Component/Yaml/composer.json
@@ -3,7 +3,7 @@
     "type": "library",
     "description": "Symfony Yaml Component",
     "keywords": [],
-    "homepage": "http://symfony.com",
+    "homepage": "https://symfony.com",
     "license": "MIT",
     "authors": [
         {
@@ -12,14 +12,17 @@
         },
         {
             "name": "Symfony Community",
-            "homepage": "http://symfony.com/contributors"
+            "homepage": "https://symfony.com/contributors"
         }
     ],
     "require": {
         "php": ">=5.3.3"
     },
     "autoload": {
-        "psr-0": { "Symfony\\Component\\Yaml\\": "" }
+        "psr-0": { "Symfony\\Component\\Yaml\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
     },
     "target-dir": "Symfony/Component/Yaml",
     "minimum-stability": "dev",
--- a/viewforum.php
+++ b/viewforum.php
@@ -264,7 +264,7 @@ gen_forum_auth_level('forum', $forum_id, $forum_data['forum_status']);
 $limit_days = array(0 => $user->lang['ALL_TOPICS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
 
 $sort_by_text = array('a' => $user->lang['AUTHOR'], 't' => $user->lang['POST_TIME'], 'r' => $user->lang['REPLIES'], 's' => $user->lang['SUBJECT'], 'v' => $user->lang['VIEWS']);
-$sort_by_sql = array('a' => 't.topic_first_poster_name', 't' => array('t.topic_last_post_time', 't.topic_last_post_id'), 'r' => (($auth->acl_get('m_approve', $forum_id)) ? 't.topic_posts_approved + t.topic_posts_unapproved + t.topic_posts_softdeleted' : 't.topic_posts_approved'), 's' => 't.topic_title', 'v' => 't.topic_views');
+$sort_by_sql = array('a' => 't.topic_first_poster_name', 't' => array('t.topic_last_post_time', 't.topic_last_post_id'), 'r' => (($auth->acl_get('m_approve', $forum_id)) ? 't.topic_posts_approved + t.topic_posts_unapproved + t.topic_posts_softdeleted' : 't.topic_posts_approved'), 's' => 'LOWER(t.topic_title)', 'v' => 't.topic_views');
 
 $s_limit_days = $s_sort_key = $s_sort_dir = $u_sort_param = '';
 gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param, $default_sort_days, $default_sort_key, $default_sort_dir);
--- a/viewonline.php
+++ b/viewonline.php
@@ -187,7 +187,7 @@ while ($row = $db->sql_fetchrow($result))
 
 		if (!$row['session_viewonline'])
 		{
-			$view_online = ($auth->acl_get('u_viewonline')) ? true : false;
+			$view_online = ($auth->acl_get('u_viewonline') || $row['user_id'] === $user->data['user_id']) ? true : false;
 			$logged_hidden_online++;
 
 			$username_full = '<em>' . $username_full . '</em>';
--- a/viewtopic.php
+++ b/viewtopic.php
@@ -1821,11 +1821,20 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)
 		($user->data['user_id'] == ANONYMOUS || $auth->acl_get('f_reply', $forum_id))
 	);
 
+	// Only display the quote button if the post is quotable.  Posts not approved are not quotable.
+	$quote_allowed = ($quote_allowed && $row['post_visibility'] == ITEM_APPROVED) ? true : false;
+
 	$delete_allowed = $force_delete_allowed || ($user->data['is_registered'] && (
 		($auth->acl_get('m_delete', $forum_id) || ($auth->acl_get('m_softdelete', $forum_id) && $row['post_visibility'] != ITEM_DELETED)) ||
 		(!$s_cannot_delete && !$s_cannot_delete_lastpost && !$s_cannot_delete_time && !$s_cannot_delete_locked)
 	));
 
+	$softdelete_allowed = ($auth->acl_get('m_softdelete', $forum_id) ||
+		($auth->acl_get('f_softdelete', $forum_id) && $user->data['user_id'] == $poster_id)) && ($row['post_visibility'] != ITEM_DELETED);
+
+	$permanent_delete_allowed = ($auth->acl_get('m_delete', $forum_id) ||
+		($auth->acl_get('f_delete', $forum_id) && $user->data['user_id'] == $poster_id));
+
 	// Can this user receive a Private Message?
 	$can_receive_pm = (
 		// They must be a "normal" user
@@ -1888,7 +1897,7 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)
 		'U_EDIT'			=> ($edit_allowed) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=edit&amp;f=$forum_id&amp;p={$row['post_id']}") : '',
 		'U_QUOTE'			=> ($quote_allowed) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=quote&amp;f=$forum_id&amp;p={$row['post_id']}") : '',
 		'U_INFO'			=> ($auth->acl_get('m_info', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "i=main&amp;mode=post_details&amp;f=$forum_id&amp;p=" . $row['post_id'], true, $user->session_id) : '',
-		'U_DELETE'			=> ($delete_allowed) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=delete&amp;f=$forum_id&amp;p={$row['post_id']}") : '',
+		'U_DELETE'			=> ($delete_allowed) ? append_sid("{$phpbb_root_path}posting.$phpEx", 'mode=' . (($softdelete_allowed) ? 'soft_delete' : 'delete') . "&amp;f=$forum_id&amp;p={$row['post_id']}") : '',
 
 		'U_SEARCH'		=> $user_cache[$poster_id]['search'],
 		'U_PM'			=> $u_pm,
@@ -1927,6 +1936,7 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)
 		'L_IGNORE_POST'		=> ($row['foe']) ? sprintf($user->lang['POST_BY_FOE'], get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username'])) : '',
 		'S_POST_HIDDEN'		=> $row['hide_post'],
 		'L_POST_DISPLAY'	=> ($row['hide_post']) ? $user->lang('POST_DISPLAY', '<a class="display_post" data-post-id="' . $row['post_id'] . '" href="' . $viewtopic_url . "&amp;p={$row['post_id']}&amp;view=show#p{$row['post_id']}" . '">', '</a>') : '',
+		'S_DELETE_PERMANENT'	=> $permanent_delete_allowed,
 	);
 
 	$user_poster_data = $user_cache[$poster_id];
