Пример #1
0
        print "</div>\n";
    }
    mysql_free_result($Result);
    print "</td></tr>\n";
}
// Закончили вывод списка участников
// ============ Новый участник
// Возможность добавлять участников заканчивается вместе с возможностью создавать команды
// Обычный пользователь может добавлять новых участников при редактировании своей команды
// Модератор/Администратор могут создавать новые команды с другим участником вместо себя
//if (($AllowEdit == 1) && CanCreateTeam($Administrator, $Moderator, $OldMmb, $RaidStage, $TeamOutOfRange) &&
//	(($viewmode <> "Add") || $Moderator || $Administrator))
// 21.03.2016 Определяем, когда можно добавлять нового пользователя
// при добавлении команды можно только модераторам или администраторам
// при правке - в зависимости от типа команды
if ($viewmode != 'Add' and CRights::canEditTeam($UserId, $RaidId, $TeamId) or $viewmode == 'Add' and (CSql::userAdmin($UserId) or CSql::userModerator($UserId, $RaidId)) and CSql::raidStage($RaidId) < 7) {
    print '<tr><td class="input" style="padding-top: 10px;">' . "\n";
    // Предупредим команды в зачете о том, что они могут добавлять участников только до закрытия регистрации
    if ($TeamUser and !$TeamOutOfRange) {
        print 'Добавление новых участников в команду разрешено до ' . $RegistrationEnd . ".<br/>\n";
        //print('После этой даты они могут участвовать в ММБ только в виде самостоятельной команды вне зачета.<br/>'."\n");
    }
    print '<input type="text" name="NewTeamUserEmail" size="50" value="Email нового участника" tabindex="' . ++$TabIndex . '"' . CMmbUI::placeholder('Email нового участника') . 'title="Укажите e-mail пользователя, которого Вы хотите добавить в команду. Пользователь может запретить добавлять себя в команду в настройках своей учетной записи.">' . "\n";
    print "</td></tr>\n";
}
// 20/02/2014 Пользовательское соглашение
if ($viewmode == "Add" && $AllowEdit == 1) {
    print '<tr><td class="input" style="padding-top: 10px; font-size: 80%;">' . "\n";
    print '<b>Условия участия (выдержка из <a href="' . $RaidRulesLink . '">положения</a>):</b><br/>' . "\n";
    // Ищем последнее пользовательское соглашение
    $ConfirmFile = trim($MyStoreHttpLink) . CSql::raidFileName(null, 8, true);
Пример #2
0
        print "</div>\n";
    }
    mysql_free_result($Result);
    print "</td></tr>\n";
}
// Закончили вывод списка участников
// ============ Новый участник
// Возможность добавлять участников заканчивается вместе с возможностью создавать команды
// Обычный пользователь может добавлять новых участников при редактировании своей команды
// Модератор/Администратор могут создавать новые команды с другим участником вместо себя
//if (($AllowEdit == 1) && CanCreateTeam($Administrator, $Moderator, $OldMmb, $RaidStage, $TeamOutOfRange) &&
//	(($viewmode <> "Add") || $Moderator || $Administrator))
// 21.03.2016 Определяем, когда можно добавлять нового пользователя
// при добавлении команды можно только можераторам или администраторам
// при правке - в зависимости от типа команды
if ($viewmode != 'Add' and ($TeamId == CSql::userTeamId($UserId, $RaidId) or CSql::userAdmin($UserId) or CSql::userModerator($UserId, $RaidId)) and !CSql::teamOutOfRange($TeamId) and CSql::raidStage($RaidId) < 2 or $viewmode != 'Add' and ($TeamId == CSql::userTeamId($UserId, $RaidId) or CSql::userAdmin($UserId) or CSql::userModerator($UserId, $RaidId)) and CSql::teamOutOfRange($TeamId) and CSql::raidStage($RaidId) < 7 or $viewmode == 'Add' and (CSql::userAdmin($UserId) or CSql::userModerator($UserId, $RaidId)) and CSql::raidStage($RaidId) < 7) {
    print '<tr><td class="input" style="padding-top: 10px;">' . "\n";
    // Предупредим команды в зачете о том, что они могут добавлять участников только до закрытия регистрации
    if ($TeamUser and !$TeamOutOfRange) {
        print 'Добавление новых участников в команду разрешено до ' . $RegistrationEnd . ".<br/>\n";
        print 'После этой даты они могут участвовать в ММБ только в виде самостоятельной команды вне зачета.<br/>' . "\n";
    }
    print '<input type="text" name="NewTeamUserEmail" size="50" value="Email нового участника" tabindex="' . ++$TabIndex . '"' . CMmbUI::placeholder('Email нового участника') . 'title="Укажите e-mail пользователя, которого Вы хотите добавить в команду. Пользователь может запретить добавлять себя в команду в настройках своей учетной записи.">' . "\n";
    print "</td></tr>\n";
}
// 20/02/2014 Пользовательское соглашение
if ($viewmode == "Add" && $AllowEdit == 1) {
    print '<tr><td class="input" style="padding-top: 10px; font-size: 80%;">' . "\n";
    print '<b>Условия участия (выдержка из <a href="' . $RaidRulesLink . '">положения</a>):</b><br/>' . "\n";
    // Ищем последнее пользовательское соглашение
    $sql = "select rf.raidfile_id, rf.raidfile_name\n\t\tfrom RaidFiles rf\n\t\twhere rf.raidfile_hide = 0 and rf.filetype_id = 8\n\t\torder by rf.raid_id DESC, rf.raidfile_id DESC\n\t\tLIMIT 0,1";
Пример #3
0
function RecalcUsersRank($raidId)
{
    // Смотрим статус переданного
    $raidStage = CSql::raidStage($raidId);
    // Если финиш не закрылся, то пересчитывать нужно по предыдудщему
    if ($raidStage < 5) {
        // Находим предыдущий закрытый
        $sql = " select MAX(r.raid_id) as maxraidid\n\t\t         from Raids r \n\t        \t where r.raid_closedate IS NOT NULL";
        $maxRaidId = CSql::singleValue($sql, 'maxraidid');
    } else {
        $maxRaidId = $raidId;
    }
    // Обнуляем рейтинг  по всем пользовтелям
    $sql = " update Users u\tSET user_rank = NULL, user_r6 = NULL, \n  \t\t\t\tuser_minraidid = NULL,  user_maxraidid = NULL,\n  \t\t\t\tuser_noinvitation = NULL, user_maxnotstartraidid = NULL\n  \t\t";
    $rs = MySqlQuery($sql);
    // Сбрасываем признак неявки команды  по всем ММБ с весны 2012
    $sql = " update Teams t \n\t\t\tinner join Distances d\n\t        \ton t.distance_id = d.distance_id\n\t\t SET t.team_dismiss = NULL \n\t\t where d.raid_id  >= 19\n\t\t       and  d.raid_id = {$maxRaidId}\n  \t\t";
    $rs = MySqlQuery($sql);
    // Устанавливаем    признак неявки команды  по всем ММБ с весны 2012
    $sql = "\n\t\tupdate  Teams t\n\t\t\tinner join Distances d\n\t        \ton t.distance_id = d.distance_id\n\t\t\tleft outer join \n\t\t\t(\n\t\t\t \tselect tlp.team_id, count(*) as points\n\t\t\t \tfrom TeamLevelPoints tlp\n\t\t\t\tgroup by tlp.team_id\n        \t\t) teamdismiss\n            \t\ton t.team_id = teamdismiss.team_id\n\t\tSET t.team_dismiss = 1\n\t\twhere d.distance_hide = 0 \n\t\t       and t.team_hide = 0 \n\t\t       and  COALESCE(t.team_outofrange, 0) = 0\n\t\t       and  d.raid_id <= {$maxRaidId}\n\t\t       and  d.raid_id >= 19\n\t       \t       and  COALESCE(teamdismiss.points, 0) = 0\n                ";
    $rs = MySqlQuery($sql);
    // Добавил проверку на сход
    // проверка на ошибки идёт по полю, посчитанному в пересчете результатов
    $sql = "\n\t\tupdate Users u\n\t\tinner join \n\t\t(select tu.user_id, SUM(COALESCE(tu.teamuser_rank, 0.00)) as rank, \n\t\t\tSUM(COALESCE(tu.teamuser_rank, 0.00) * POW(0.9, {$maxRaidId} \n\t\t\t- d.raid_id \n\t\t\t- (select count(*) \n\t\t\t\tfrom RaidDevelopers rd \n\t\t\t\twhere rd.raiddeveloper_hide = 0\n\t\t\t\t\tand rd.raid_id > d.raid_id\n\t\t\t\t\tand rd.user_id =  tu.user_id\n\t\t\t))) as r6,\n\t\t\tSUM(COALESCE(tu.teamuser_rank, 0.00) * POW(0.9, {$maxRaidId} \n\t\t\t- d.raid_id)) as r6old\n\t        from TeamUsers tu \n\t\t\tinner join Teams t\n\t\t\ton tu.team_id = t.team_id\t\n\t\t\tinner join Distances d\n\t        \ton t.distance_id = d.distance_id\n\t\t\tleft outer join \n\t\t\t(\n\t\t \tselect tld.teamuser_id,  MIN(lp.levelpoint_order) as minorder\n\t\t \tfrom TeamLevelDismiss tld\n\t\t\t \tinner join LevelPoints lp\n\t\t\t \ton tld.levelpoint_id = lp.levelpoint_id\n\t\t\t group by tld.teamuser_id\n                        ) c\n\t\t\ton tu.teamuser_id = c.teamuser_id\n\t\twhere d.distance_hide = 0 \n\t\t       and tu.teamuser_hide = 0\n\t\t       and t.team_hide = 0 \n\t\t       and  COALESCE(t.team_outofrange, 0) = 0\n\t\t       and  COALESCE(t.team_result, 0) > 0\n\t\t       and COALESCE(t.team_minlevelpointorderwitherror, 0) = 0\n\t\t       and  COALESCE(c.minorder, 0) = 0\n\t\t       and  d.raid_id <= {$maxRaidId}\n\t\tgroup by tu.user_id\n \t\t) a\n\t\ton a.user_id = u.user_id\n\t\tSET u.user_rank = a.rank, u.user_r6 = a.r6, u.user_r6old = a.r6old\n                ";
    $rs = MySqlQuery($sql);
    // теперь считаем  минимальный и максимальный ключ ММБ по всем пользователям
    // добавил учет невыходов на старт
    // добавил учет невыходов на старт для команды
    $sql = "\n\t\tupdate Users u\n\t\tinner join \n\t\t(select tu.user_id, MIN(d.raid_id) as minraidid, \n\t\t\tMAX(d.raid_id) as maxraidid \n\t        from TeamUsers tu \n\t\t\tinner join Teams t\n\t\t\ton tu.team_id = t.team_id\t\n\t\t\tinner join Distances d\n\t        \ton t.distance_id = d.distance_id\n\t\t\tleft outer join \n\t\t\t(\n\t\t\t\tselect tld.teamuser_id\n\t\t\t\tfrom TeamLevelDismiss tld\n\t\t\t\t\tinner join LevelPoints lp\n\t\t\t\t \ton tld.levelpoint_id = lp.levelpoint_id\n\t\t\t\tgroup by tld.teamuser_id\n\t\t\t\thaving MIN(lp.levelpoint_order) = 1\n\t\t\t) dismiss\n\t\t\ton  tu.teamuser_id = dismiss.teamuser_id\n\t\twhere d.distance_hide = 0 \n\t\t       and dismiss.teamuser_id is null\n\t\t       and COALESCE(t.team_dismiss, 0) = 0\n\t\t       and tu.teamuser_hide = 0\n\t\t       and t.team_hide = 0 \n\t\t       and  COALESCE(t.team_outofrange, 0) = 0\n\t\t       and  d.raid_id <= {$maxRaidId}\n\t\tgroup by tu.user_id\n\t\t) a\n\t\ton a.user_id = u.user_id\n\t\tSET u.user_minraidid = a.minraidid, u.user_maxraidid = a.maxraidid\n                ";
    $rs = MySqlQuery($sql);
    // теперь считаем  максимальный ключ ММБ по всем пользователям по невыходу на старт
    $sql = "\n\t\tupdate Users u\n\t\tinner join \n\t\t(select tu.user_id, \n\t\t\tMAX(d.raid_id) as maxnotstartraidid \n\t        from TeamUsers tu \n\t\t\tinner join Teams t\n\t\t\ton tu.team_id = t.team_id\t\n\t\t\tinner join Distances d\n\t        \ton t.distance_id = d.distance_id\n\t\t\tleft outer join \n\t\t\t(\n\t\t\t\tselect tld.teamuser_id\n\t\t\t\tfrom TeamLevelDismiss tld\n\t\t\t\t\tinner join LevelPoints lp\n\t\t\t\t \ton tld.levelpoint_id = lp.levelpoint_id\n\t\t\t\tgroup by tld.teamuser_id\n\t\t\t\thaving MIN(lp.levelpoint_order) = 1\n\t\t\t) dismiss\n\t\t\ton  tu.teamuser_id = dismiss.teamuser_id\n\t\twhere d.distance_hide = 0 \n\t\t       and tu.teamuser_hide = 0\n\t\t       and t.team_hide = 0 \n\t\t       and COALESCE(t.team_outofrange, 0) = 0\n\t\t       and d.raid_id <= {$maxRaidId}\n\t       \t       and (dismiss.teamuser_id is not null or COALESCE(t.team_dismiss, 0) = 1)\n\t\tgroup by tu.user_id\n\t\t) a\n\t\ton a.user_id = u.user_id\n\t\tSET u.user_maxnotstartraidid = a.maxnotstartraidid\n                ";
    $rs = MySqlQuery($sql);
    // теперь считаем флаг у тех кто не вышел (?!) или дисквалифицирован
    $sql = "\n\t\tupdate Users u\n\t\tinner join \n\t\t(select tu.user_id, dismiss.teamuser_id as dismissteamuser, \n\t\t\tCOALESCE(disq.disqualification, 0) as disqualification, \n\t\t\tCOALESCE(t.team_dismiss, 0)  as dismissteam\n\t        from TeamUsers tu \n\t\t\tinner join Teams t\n\t\t\ton tu.team_id = t.team_id\t\n\t\t\tinner join Distances d\n\t        \ton t.distance_id = d.distance_id\n\t\t\tleft outer join \n\t\t\t(\n\t\t \t\tselect tlp.team_id,  count(*) as disqualification\n\t\t \t\tfrom TeamLevelPoints tlp\n\t\t\t\twhere COALESCE(tlp.error_id, 0) = 15 \n\t\t\t\tgroup by tlp.team_id\n                        ) disq\n                        on t.team_id = disq.team_id\n\t\t\tleft outer join \n\t\t\t(\n\t\t\t\tselect tld.teamuser_id\n\t\t\t\tfrom TeamLevelDismiss tld\n\t\t\t\t\tinner join LevelPoints lp\n\t\t\t\t \ton tld.levelpoint_id = lp.levelpoint_id\n\t\t\t\tgroup by tld.teamuser_id\n\t\t\t\thaving MIN(lp.levelpoint_order) = 1\n\t\t\t) dismiss\n\t\t\ton  tu.teamuser_id = dismiss.teamuser_id\n \t\twhere d.distance_hide = 0 \n\t\t       and tu.teamuser_hide = 0\n\t\t       and t.team_hide = 0 \n\t\t       and  COALESCE(t.team_outofrange, 0) = 0\n\t\t       and  d.raid_id = {$maxRaidId}\n\t\tgroup by tu.user_id\n\t\t) a\n\t\ton a.user_id = u.user_id\n\t\tSET u.user_noinvitation = 1\n\t\tWHERE   a.dismissteamuser is not null\n\t  \t\tor COALESCE(a.disqualification, 0) > 1 \n\t \t\tor COALESCE(a.dismissteam, 0) = 1\n                ";
    $rs = MySqlQuery($sql);
    // теперь ставим флаг у тех кто не участоввал в последних 8 ммб
    $sql = "\n\t\tupdate Users u\n\t\tSET u.user_noinvitation = 1\n\t\tWHERE {$maxRaidId} - 8  \n\t\t\t- (select count(*) \n\t\t\t\tfrom RaidDevelopers rd \n\t\t\t\twhere rd.raiddeveloper_hide = 0\n\t\t\t\t\tand rd.user_id =  u.user_id\n\t\t\t  ) >= COALESCE(u.user_maxraidid, 0)\n\t\t      and  u.user_maxraidid is not null\n                ";
    $rs = MySqlQuery($sql);
    return 1;
}
Пример #4
0
 public static function canViewRaidResult($userId, $raidId)
 {
     $Super = CSql::userAdmin($userId) || CSql::userModerator($userId, $raidId);
     $raidStage = CSql::raidStage($raidId);
     // Администратору или модератору можно всегда или после снятия флага "не показывать результаты"
     return $Super or $raidStage > 5;
 }
Пример #5
0
Файл: menu.php Проект: se-ti/mmb
/*
echo '-1 ';
echo $UserId;
echo '-2 ';
echo $RaidId;
echo '0 ';
echo !CSql::userTeamId($UserId, $RaidId);
echo '1 ';
echo CSql::userAdmin($UserId);
echo '2 ';
echo CSql::userModerator($UserId, $RaidId);
echo '3 ';
echo CSql::raidStage($RaidId);
echo '4 ';
*/
if ($UserId and $RaidId and (!CSql::userTeamId($UserId, $RaidId) or CSql::userAdmin($UserId) or CSql::userModerator($UserId, $RaidId)) and CSql::raidStage($RaidId) >= 1 and CSql::raidStage($RaidId) < 7) {
    print '<tr><td><a href="javascript:NewTeam();" title="Регистрация новой команды на выбранный выше ММБ">Новая команда</a></td></tr>' . "\r\n";
}
// !! реализовать показ ссылки на свою команду, если она существует !!
if (CSql::userTeamId($UserId, $RaidId)) {
    print '<tr><td><a href="' . $MyPHPScript . '?TeamId=' . CSql::userTeamId($UserId, $RaidId) . '" title="Просмотр карточки Вашей команды">Моя команда</a></td></tr>' . "\r\n";
}
// Команды
print '<tr><td><a href="?RaidId=' . $RaidId . '" title="Список зарегистрированных команд для выбранного выше ММБ">Команды</a></td></tr>' . "\r\n";
// Файлы
print '<tr><td><a href="?files&RaidId=' . $RaidId . '" title="Ссылки на карты, легенды и т.п. для выбранного выше ММБ">Файлы</a></td></tr>' . "\r\n";
// Впечатления
print '<tr><td><a href="?links&RaidId=' . $RaidId . '" title="Список впечатлений для выбранного выше ММБ">Впечатления</a></td></tr>' . "\r\n";
// Ввод/Правка марш-броска
if ($Administrator) {
    print '<tr><td><a href="javascript:NewRaid();" title="Создание марш-броска">Новый марш-бросок</a></td></tr>' . "\r\n";
Пример #6
0
    }
    function GetTeamPlace($teamId)
    {
        return isset($this->teamPlaces[$teamId]) ? $this->teamPlaces[$teamId] : 0;
    }
    function GetUserDistance($userId, $distanceId)
    {
        return isset($this->userDistance[$userId]) && isset($this->userDistance[$userId][$distanceId]) ? $this->userDistance[$userId][$distanceId] : null;
    }
}
$TabIndex = 0;
/*print('<form  name="RankUsersForm"  action="'.$MyPHPScript.'" method="post">'."\r\n");
	print('<input type="hidden" name="action" value="">'."\r\n");*/
$sql = " select MAX(r.raid_id) as maxraidid\n\t         from Raids r \n\t         ";
$maxRaidId = CSql::singleValue($sql, 'maxraidid');
$raidStage = CSql::raidStage($maxRaidId);
$ShowAllRaids = 0;
if ($raidStage > 6) {
    $ShowAllRaids = mmb_validate($_GET, 'rating', '') == 'all';
    $js = "window.location.search = '?rating' + (this.checked ? '=all' : ''); ";
    print 'Отображать все марш-броски (долгая загрузка) <input type="checkbox"  autocomplete="off" name="ShowAllRaids" ' . ($ShowAllRaids ? 'checked="checked"' : '') . ' tabindex="' . ++$TabIndex . '"
			title="Отображать все марш-броски" onchange="' . $js . '" />' . "\r\n";
}
//print('</form>'."\r\n");
print '<br/><br/>' . "\r\n";
print '<div style="margin-top: 15px; max-width: 1500px;" align="left">Рейтинг по версии slazav: по всем ММБ суммируется отношение времени лидера к времени участника.
	       <br/>Для марш-бросков с несколькими дистанциями это отношение дополнительно умножается на отношение  длины текущей дистанции к максимальной  из длин дистанций.
	        Рейтинг участника марш-броска не рассчитывается в следующих случаях: 1) команда вне зачёта; 2) команда не финишировала; 3) участник сошёл с дистанции.
	        Для марш-бросков до 2012 года сход участников не отражён в данных - можно сообщать о неточностях на общий адрес или в сообщество (ЖЖ)
	        <br/>R6 считается с уценкой каждого предыдущего ММБ на 0.9: последний марш-бросок берётся с весом 1, следующий 0.9, затем 0.9*0.9 и так далее.
	        Рейтинг пересчитывается при пересчете результатов очередного марш-броска.  
Пример #7
0
 if ($viewmode != "Add" && !CanEditTeam($Administrator, $Moderator, $TeamUser, $OldMmb, $RaidStage, $TeamOutOfRange)) {
     CMmb::setMessage('Изменения в команде запрещены');
     return;
 }
 // Определяем ключ предыдущего марш-броска, в который данный пользователь заявлялся, но не участвовал
 $NotStartPreviousRaidId = 0;
 if ($NewUserId > 0) {
     $NotStartPreviousRaidId = CheckNotStart($NewUserId, $RaidId);
 }
 $OutOfRaidLimit = IsOutOfRaidLimit($RaidId);
 $WaitTeamId = FindFirstTeamInWaitList($RaidId);
 // Добавляем/изменяем команду в базе
 $TeamActionTextForEmail = "";
 if ($action == "AddTeam") {
     // Дополнительная проверка на флаг.  Если регистрация закончена, то
     if (CSql::raidStage($RaidId) >= 2 or $OutOfRaidLimit > 0 or $WaitTeamId > 0) {
         $TeamOutOfRange = 1;
     } else {
         $TeamOutOfRange = 0;
     }
     $sql = "insert into Teams (team_num, team_name, team_usegps, team_mapscount, distance_id,\n\t\t\tteam_registerdt, team_greenpeace, team_outofrange, team_waitdt)\n\t\t\tvalues (";
     // Номер команды
     if ($OldMmb) {
         $sql = $sql . $pTeamNum;
     } else {
         $sql = $sql . "(select COALESCE(MAX(t.team_num), 0) + 1\n\t\t\t\tfrom Teams t\n\t\t\t\t\tinner join Distances d on t.distance_id = d.distance_id\n\t\t\t\twhere d.raid_id = {$RaidId})";
     }
     // Все остальное
     $sql .= ", '{$pTeamName}', {$pTeamUseGPS}, {$pTeamMapsCount}, {$pDistanceId}, NOW(),\n\t\t\t{$pTeamGreenPeace}, {$TeamOutOfRange}";
     // Если превышен лимит команл или есть команда в списке ожидания, то не регистрируем в зачет
     if ($OutOfRaidLimit > 0 or $WaitTeamId > 0) {
Пример #8
0
        return;
    }
    // конец первичной проверки входных данных
    $UserId = CMmbAuth::getUserId($Login, $Password);
    CMmbLogger::i('Login', "'{$Login}';" . $_SERVER['REMOTE_ADDR'] . ";{$UserId}");
    if ($UserId <= 0) {
        //.$login." не найден!";
        //		CSql::closeConnection();
        CMmb::setErrorMessage('Неверный email или пароль.');
        return;
    }
    //Конец проверки пользователя и пароля
    $SessionId = StartSession($UserId);
    //	echo  cSql::raidStage($RaidId);
    // Если есть откртытй марш-бросок, то открываем список команд, а не список всех ММБ
    if (isset($RaidId) and CSql::raidStage($RaidId) < 7 and CSql::raidStage($RaidId) > 0) {
        CMmb::setViews('ViewRaidTeams', '');
    } else {
        CMmb::setViews('MainPage', '');
    }
    //$statustext = "ua Пользователь: ".$UserId.", сессия: ".$SessionId;
} elseif ($action == "UserInfo") {
    // Действие вызывается ссылкой под имененм пользователя
    CMmb::setViews('ViewUserData', '');
} elseif ($action == "ViewNewUserForm") {
    // Действие вызывается ссылкой Новый пользователь
    CMmb::setViews('ViewUserData', 'Add');
} elseif ($action == "UserChangeData" or $action == "AddUser") {
    // Действие вызывается либо при регистрации нового пользователя лиюо при сменен данных старого
    $view = "ViewUserData";
    $pUserEmail = trim(mmb_validate($_POST, 'UserEmail'));