-*- mode: text; mode: auto-fill; coding: utf-8 -*-
$Id$

Версия 3.2.2 (r8803) (20141228)
================================
См. http://ejudge.ru/wiki/index.php/%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B8_3.2.2

Версия 3.2.1 (r8798) (20141220)
================================
См. http://ejudge.ru/wiki/index.php/%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B8_3.2.1

Версия 3.2.0 (r8787) (20141201)
================================
См. http://ejudge.ru/wiki/index.php/%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B8_3.2.0

Версия 3.1.0 (r8684) (20141025)
================================
См. http://ejudge.ru/wiki/index.php/%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B8_3.1.0

Версия 3.0.2 (r8625) (20140917)
================================
См. http://ejudge.ru/wiki/index.php/%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B8_3.0.2

Версия 3.0.1 (r8587) (20140903)
================================
См. http://ejudge.ru/wiki/index.php/%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B8_3.0.1

Версия 3.0.0 (r8569) (20140828)
================================
См. http://ejudge.ru/wiki/index.php/%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B8_3.0

Версия 2.3.29 (r7680) (20131214)
================================
См. http://ejudge.ru/wiki/index.php/%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B8_2.3.29

Версия 2.3.28 (r7518) (20131031)
================================
См. http://ejudge.ru/wiki/index.php/%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B8_2.3.28

Версия 2.3.27 (r7368) (20130213)
================================
См. http://ejudge.ru/wiki/index.php/%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B8_2.3.27

Версия 2.3.26 (r7266) (20121220)
================================
См. http://ejudge.ru/wiki/index.php/%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B8_2.3.26

Версия 2.3.25 (r7190) (20121124)
================================
См. http://ejudge.ru/wiki/index.php/%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B8_2.3.25

Версия 2.3.24 (r7019) (20120901)
================================
См. http://ejudge.ru/wiki/index.php/%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B8_2.3.24

Версия 2.3.23 (r6909) (20120622)
================================
См. http://ejudge.ru/wiki/index.php/%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B8_2.3.23

Версия 2.3.22 (r6849) (20120523)
================================
См. http://ejudge.ru/wiki/index.php/%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B8_2.3.22

Версия 2.3.21 (r6728) (20120406)
================================
См. http://ejudge.ru/wiki/index.php/%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B8_2.3.21

Версия 2.3.20 (r6602) (20111228)
================================
См. http://ejudge.ru/wiki/index.php/%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B8_2.3.20

Версия 2.3.19 (r6397) (20110706)
================================
В исходные файлы системы добавлены файлы для пробного турнира.
Файлы находятся в каталоге contest-1. Файлы пробного турнира
используют новую раскладку по каталогам. В пробном турнире по
умолчанию доступ к CGI-программам открыт для всех IP-адресов.

При выполнении настроечного скрипта, сгенерированного программой
ejudge-setup, выводится предупреждение о том, что все существовавшие
настройки будут уничтожены.

При сборке системы автоматически генерируется настроечный скрипт
ejudge-install.sh со значениями по умолчанию. Ранее необходимо
было запускать ejudge-setup. При необходимости изменить
параметры по умолчанию все равно может использоваться
ejudge-setup.

В конфигурационный файл турнира contest.xml добавлены два новых
элемента <logo_url> и <css_url>, которые позволяют
специфицировать URL для логотипа данного турнира и URL для
стилевого файла данного турнира.

Везде, где требуется вводить e-mail, он проверяется на
соответствие правилам формирования e-mail. 

Добавлена поддержка GNU Haskell (ghc). Данный язык пока помечен
как небезопасный. Спасибо vrandik.

Добавлена поддержка архивов программ и утилит сборки, таких как
make.

ej-compile
----------
Лог-файл для программы переименован в ej-compile.log. Он
по-прежнему находится в каталоге CONTESTS_HOME_DIR/compile/var.

Вывод программы проверки стиля на стандартный поток вывода сохраняется
для последующего показа.

ej-contests
-----------
Лог-файл для программы переименован в ej-contests.log.

Текст, выведенный на стандартный вывод программой проверки стиля,
отображается при просмотре исходного кода посылки привилегированным
пользователем.

ejudge-contests-cmd
-------------------
Добавлены команды 'dump-languages', 'get-contest-status',
'get-contest-sched', 'get-contest-duration',
'get-contest-description' на основе патча от germanilyin.

ej-jobs
-------
Лог-файл для программы переименован в ej-jobs.log.

ej-super-server
---------------
Лог-файл для программы переименован в ej-super-server.log.

Добавлена возможность редактирования базы пользователей через
веб-интерфейс. Консольная программа ejudge-edit-users более
поддерживаться не будет.

В таблицу турниров добавлены прямые ссылки на редактирование
пользователей и редактирование настроек турнира.

ej-users
--------
Лог-файл для программы переименован в ej-users.log.

style_archive
-------------
Добавлена поддержка для архивов для сборки программ с помощью
утилит сборки таких, как make. Поддерживаются следующие новые
переменные окружения и параметры командной строки:
EJ_MAKE_MODE (-m)	включить режим проверки архива для
			сборки. По умолчанию включен режим
                        проверки архива тестов.
EJ_PROGRAM_DIR (-p)	имя каталога с файлами для сборки,
                        который должен находится в
                        архиве. Значение по умолчанию -
                        solution.
EJ_SCRIPT_NAME (-s)     название скрипта для сборки, который
			должен находиться в архиве. Значение по
                        умолчанию - Makefile.

Версия 2.3.18 (r6245) (20110410)
================================
Добавлена поддержка языка Кумир. При настройке компиляторов
автоматически находится интерпретатор ckumir.

Усовершенствовано определение версии интерпретатора языка perl.

Для компиляции ejudge более не требуется библиотека reuse. Все
необходимые файлы интегрированы в исходный код ejudge.

ej-batch
--------
Новая программа для пакетного тестирования. Программе передаётся
ZIP-файл, сформированный по определенным правилам, который
содержит исходные коды программ на тестирование и XML-файл
описания. Тестирование выполняется в пакетном режиме, и на
выходе формируется ZIP-файл с результатами тестирования, который
содержит XML-файл описания результатов и протоколы
тестирования.

ej-compile
----------
Для компиляторов поддерживается установка ограничений на максимальный
размер адресного пространства и стека. В раздел описания языковых
процессоров добавлены конфигурационные переменные 'max_vm_size' и
'max_stack_size'. Эти переменные могут устанавливаться как в
конфигурационном файле турнира, так и в глобальном конфигурационном
файле сервера компиляции (${CONTESTS_DIR}/compile/conf/compile.cfg).
Значение, установленное в конфигурационном файле турнира, имеет
приоритет перед значением, заданным в конфигурационном файле сервера
компиляции.

Конфигурационная переменная 'max_vm_size' задает максимальный размер
виртуального адресного пространства процесса компиляции. Например,
max_vm_size=256M
ограничивает размер виртуального адресного пространства 256
мегабайтами (точнее, 256*1024*1024 байт). Размер виртуального
адресного пространства определяется как сумма размера кода программы,
глобальных переменных, подгружаемых динамических библиотек, кучи и
стека. По умолчанию размер виртуального адресного пространства не
ограничен, если только не установлено ограничение на уровне системы
(см. вывод команды 'ulimit -a').

Конфигурационная переменная 'max_stack_size' задает максимальный
размер системного стека. По умолчанию этот размер равен 8 мегабайтам.

Конфигурационная переменная 'max_file_size' задает максимальный размер
файлов, которые смогут создавать компиляторы.

Поддерживаются глобальные конфигурационные переменные
'compile_max_vm_size', 'compile_max_stack_size',
'compile_max_file_size', позволяющие задавать ограничения на ресурсы
для всех компиляторов одновременно. Эти глобальные конфигурационные
переменные могут задаваться как в конфигурационном файле сервера
компиляции, так и в конфигурационном файле турнира.

Значения ограничений, установленные для конкретного языкового
процессора, имеют приоритет над значениями, установленными глобально.
Значения ограничений, установленные в конфигурационном файле турнира,
имеют приоритет над значениями, установленными в конфигурационном
файле сервера компиляции.

ej-contests
-----------
При сдаче исходного кода в кодировке UCS2 файл автоматически
конвертируется в кодировку UTF8. Для определения кодировки UCS2
используется эвристический алгоритм.

Добавлена новая глобальная конфигурационная переменная
'separate_user_score'. Если данная конфигурационная переменная
установлена в 1, турнир работает в режиме одновременного хранения
предварительных и окончательных результатов тестирования
программ. Предварительные (или пользовательские - user)
результаты тестирования - это результаты тестирования программы
на подмножестве всех тестов. Предварительные результаты
тестирования доступны участникам во время турнира. Окончательные
результаты тестирования - результаты тестирования программы на
всех тестах. Во время турнира окончательные результаты
тестирования участникам недоступны, но отображаются в качестве
результатов тестирования для административных пользователей. В
любой момент проведения турнира или после его окончания
администратор турнира может включить отображение окончательных
результатов тестирования для участников, тогда участники вместо
предварительных результатов будут видеть окончательные.

Этот режим работы доступен только для турниров по системе KIROV.

Режим работы предназначен для турниров, на которых решения во
время тура тестируются только на некоторых тестах (так
называемых on-line тестах), а после окончания тура - на всех
тестах. В системе ejudge решения всегда тестируются на всех
тестах, но участники будут получать информацию о результатах
тестирования только на части тестов, хотя администраторам
доступна и полная информация.

В раздел описания задачи добавлена конфигурационная переменная
'full_user_score'. Данная переменная позволяет указывать, сколько
предварительных баллов получает решение, которое прошло все нескрытые
тесты, либо получило предварительный статус тестирования OK. Данная
конфигурационная переменная аналогична переменной 'full_score', но
задает максимальное количество баллов для предварительного
тестирования. Данная переменная используется только для турниров типа
KIROV, которые работают в режиме 'separate_user_score'. Значение
данной переменной наследуется из абстрактной задачи, если не задано в
задаче. Если ни в конкретной, ни в абстрактной задаче значение поля не
задано, оно полагается равным 0.

Расширена поддержка правил видимости тестов, задаваемых с помощью
конфигурационной переменной 'open_tests' раздела описания задачи.
Теперь допускается указывать тип видимости теста. Поддерживаются
следующие типы видимости тестов:
normal        правила видимости тестов определяются общими настройками
              турнира, данный тип видимости является типом по
              умолчанию, для тестов, для которых тип видимости не
              указан.
full          полная видимость теста: показываются входные данные,
              результат работы программы, вердикт проверки, балл за
              тест
fullifmarked  полная видимость, но только если данная посылка имеет
              статус marked, а в противном случае тест является
              невидимым
brief         показывается вердикт проверки и балл за тест. Это -
              стандартный режим показа тестов для турниров KIROV.
exists        существование. Показывается, что такой тест существует,
              но ни вердикт проверки, ни балл за тест.
hidden        тест полностью скрыт. Не показывается ни вердикт
              проверки, ни балл, ни факт самого существования теста
Спецификация видимости записывается после диапазона тестов через
двоеточие. Пример спецификации тестов:
open_tests="1-3:full,4-10:brief,11-15:hidden"
тесты 1-3 показываются полностью, тесты 4-10 показываются в краткой
форме, а тесты 11-15 являются скрытыми

Добавлена конфигурационная переменная 'final_open_tests' секции
определения задачи. Данная переменная задает видимость тестов в режиме
финального показа тестов. Турнир может быть переключен в режим
финального показа тестов администратором турнира (см. ниже). Например,
final_open_tests="1-10:full,11-15:fullifmarked"
Тесты 1-10 показываются полностью, а тесты 11-15 показываются
полностью только для решений, имеющих статус marked. Значение данной
переменной не наследуется из абстрактной задачи.

Добавлена конфигурационная переменная 'score_latest_or_unmarked',
которая модифицирует способ подсчета баллов за задачу следующим
образом. Если среди посылок данного пользователя по данной задаче
имеются посылки со статусом marked (отмеченные), то оценивается
последняя такая посылка. В противном случае оценивается посылка,
набравшая максимальное количество баллов. Значение данной переменной
наследуется из абстрактной задачи.

Добавлена конфигурационная переменная 'extid', позволяющая задать
"внешний" идентификатор задачи. Внешний идентификатор задачи
используется программой тестирования пакетного режима ej-batch.

В административный интерфейс new-master добавлена новая страница
настройки режима работы турнира "Contest settings". С ее помощью
можно включать или выключать видимость исходных кодов посылок
для участников, видимость протоколов тестирования участниками,
видимость основных результатов тестирования участниками (в
режиме отображения предварительных результатов тестирования) и
режим видимости тестов. Теперь для выполнения этих действий не
требуется модифицировать конфигурационный файл serve.cfg.

В раздел описания задачи добавлены конфигурационные переменные,
позволяющие устанавливать ограничения на ресурсы, доступные процессу.
'max_core_size'       Максимальный размер core-файла, который будет
                      создан ядром ОС в случае, если выполнение
                      процесса завершилось аварийно. Как правило, этот
                      размер установлен в 0.
'max_file_size'       Максимальный размер файлов, с которыми может
                      работать процесс. В случае попытки записи в файт
                      так, что его размер превысит максимальный
                      разрешенный, процесс будет прерван сигналом, то
                      есть завершится аварийно.
'max_open_file_count' Максимальное количество файловых дескрипторов,
                      доступных одному процессу. Если это ограничение
                      превышено, попытка открытия файла будет
                      завершаться с ошибкой.
'max_process_count'   Максимальное количество процессов/нитей,
                      доступных одному пользователю. Если это
                      ограничение будет превышено, попытка создания
                      нового процесса с помощью системного вызова
                      fork() завершится ошибкой.

ej-run
------
При работе турнира в режиме 'separate_user_score' при запуске
программы оценивания (valuer) устанавливается переменная окружения
EJUDGE_USER_SCORE.

Помимо балла за пройденные тесты и флага marked в режиме турнира
'separate_user_score' программа оценивания должна возвращать три целых
числа: предварительный статус тестирования (OK или PE), балл за
предварительные тесты, количество пройденных предварительных тестов.
Вместо каждого из этих чисел программа оценивания может вывести -1,
тогда соответствующее значение будет вычислено по стандартным
правилам.

Добавлена опция командной строки -s, которая позволяет задавать
игнорируемые для тестирования архитектуры из командной строки.
В командной строке можно указать опцию несколько раз, например,
ej-run -s win32 -s dos conf/serve.cfg
В этом случае игнорируется значение конфигурационной переменной
skip_testing раздела [tester], но для указанных в опциях -s
архитектурах флаг skip_testing устанавливается.

libchecker
----------
Добавлена функция valuer_parse_input для чтения входных данных
программы оценивания решения.

serve-control
-------------
На формах редактирования настроек турнира добавлены ссылки на страницы
wiki-справочника ejudge.

style_c
-------
Программа проверки стиля форматирования программ на языках Си и
Си++. В настоящий момент программа выполняет только совсем
базовые проверки на отсутствие управляющих символов в коде
программы (в том числе табуляции), на кратность величин отступов
значению 4, на максимальную длину строки кода.

Версия 2.3.17 (r6036) (20101104)
================================
Исправления ошибок. В частности, работоспособны интерактивные задачи.

ej-contests
-----------
Добавлена новая конфигурационная переменная 'interactor_time_limit'
раздела определения задач. Данная конфигурационная переменная
позволяет устанавливать ограничение процессорного времени на работу
программы-интерактора для интерактивных задач.

Версия 2.3.16 (r5984) (20100817)
================================
Добавлена концепция групп пользователей. Каждая группа имеет
уникальный числовой идентификатор (group_id) и уникальное имя
(group_name). Пользователи могут объединяться в группы по
произвольному принципу. Каждая группа может включать более
одного пользователя и каждый пользователь может состоять членом
более одной группы. Группы пользователей могут использоваться при
фильтрации посылок для ограничения времени сдачи отдельных задач.

ej-compile
----------
Поддерживается режим "только проверка стиля", при котором
поступивший файл не компилируется, а запускается программа
проверки стиля. Результат работы программы проверки стиля
считается результатом компиляции.

ej-contests
-----------
У каждой посылки может быть установлен флаг "отмечена"
(marked). Флаг может быть установлен как вручную, как и
проверяющей программой.

В выражении фильтра поддерживается предикат "marked", который
выбирает только "отмеченные" посылки. Поддерживается предикат
"latest_marked", который выбирает последнюю отмеченную посылку
для пары (пользователь,задача).

В выражении фильтра поддерживается предикат inusergroup(GROUP_NAME),
который выбирает пользователей, принадлежащих указанной группе
пользователей.

Поддерживается новый тип задач "tests". Для этого типа задач
требуется написание тестов по заданному условию задачи. Тесты
проверяются на наборе программ, среди которых есть как
правильные, так и неправильные. Правильные программы должны
пройти все тесты, а неправильные - не пройти хотя бы один тест
каждая. Документация по новому типу задач доступна на
EjudgeWiki.

Поддерживается альтернативная раскладка файлов. В альтернативной
раскладке файлы группируются по задачам вместо группировки
файлов по назначению. Документация по альтернативной раскладке
файлов доступна на EjudgeWiki.

Поддерживается выполнение произвольной программы в момент завершения
турнира. Имя программы задается с помощью глобальной конфигурационной
переменной contest_stop_cmd.

Добавлены глобальные конфигурационные переменные
advanced_layout, disable_auto_refresh, problems_dir, contest_stop_cmd.
Документация по новым конфигурационным переменным доступна на
EjudgeWiki.

Добавлены конфигурационные переменные binary,
valuer_sets_marked, ignore_unmarked, style_checker_env,
test_checker_env, style_checker_cmd, test_checker_cmd,
open_tests раздела описания задач. Документация по новым
конфигурационным переменным доступна на EjudgeWiki.

Добавлена конфигурационная переменная style_checker_env раздела
описания языкового процессора. Документация по новым
конфигурационным переменным доступна на EjudgeWiki.

Добавлена глобальная конфигурационная переменная 'load_user_group'.
Добавлены конфигурационные переменные раздела описания задач
'group_start_date', 'group_deadline'.

При просмотре таблицы текущих результатов привилегированный
пользователь может задать выражение фильтра посылок для задач,
пользователей и посылок. Таким образом можно ограничивать таблицу
текущих результатов определенными пользователями или определенным
временем.

Турниры корректно загружаются и работают, даже если в
конфигурационном файле турнира не определен ни один языковой
процессор.

Исправлена ошибка добавления записи в середину журнала посылок
при хранении журнала посылок в БД MySQL.

Конфигурационная переменная 'enable_text_form' раздела описания задачи
работает и для обычных (STANDARD) задач на сдачу программ. Если
значение переменной установлено в 1, на странице сдачи отображается
как окно для непосредственного ввода текста программы, так и диалог
для выбора файла для сдачи. Пользователь может сдать программу на
проверку либо скопировав ее текст в окно, либо приложив файл.
Сдать и текст программы, и приложенный файл одновременно нельзя.

ej-nwrun
--------
При тестировании под win32 корректно работает одновременный
ввод/вывод в файлы и стандартные потоки. Для этого в
конфигурационный файл турнира добавлены конфигурационные
переменные combined_stdin и combined_stdout.

ej-super-server
---------------
При выполнении операции "Check contests settings" в режиме
альтернативной раскладки файлов в каждом каталоге задачи
запускается утилита make, если в этом каталоге присутствует
Makefile.

При выполнении операции "Check contests settings" выполняется
проверка тестов с помощью проверяющей программы для тестов, если
она указана в секции описания задачи.

ejudge-edit-users
-----------------
Поддерживается редактирование групп пользователей.

libchecker
----------
Добавлен новый заголовочный файл checkutils.h, предназначенный
для использования в случае, когда программа не является
проверяющей программой, но использует функции библиотеки
libchecker.

Добавлены новые функции checker_in_open, checker_out_open,
checker_corr_open, checker_eof, checker_eoln,
checker_skip_eoln_ex, checker_read_file_by_line_ex,
checker_read_line_ex, checker_read_buf_ex, checker_read_int_ex,
checker_read_unsigned_int_ex, checker_read_long_long_ex,
checker_read_unsigned_long_long_ex, checker_read_double_ex,
checker_read_long_double_ex. Описание новых функций доступно на
EjudgeWiki.

Все функции чтения данных, кроме checker_read_file контролируют
допустимость управляющих символов во входных данных. В текстовом
файле могут появляться только пробельные управляющие символы.
Символы, для которых выполняется условие
((c < ' ' && !isspace(c)) || c == 127)
являются недопустимыми в текстовом файле и в случае обнаружения
таких символов выдается соответствующая ошибка.

Функции чтения вещественных чисел проверяют, что каждое число
является отдельным элементом ввода (то есть последовательностью
непробельных символов, ограниченной пробельными символами,
началом или концом файла). В предыдущих версиях строка "-1-1"
считывалась как два числа -1 и -1, в этой версии будет выдана
ошибка.

style_archive
-------------
Новая программа для проверки корректности архивов, сдаваемых на
проверку для задач типа "tests". Описание программы доступно на
EjudgeWiki.

Версия 2.3.15 (r5762) (20100131)
================================
Реализована поддержка тестирования программ на платформе
Windows. Описание процедуры добавления поддержки компиляторов
Windows находится по адресу:
http://www.ejudge.ru/wiki/index.php/Win32-%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5

ejudge.xml
----------
Поддерживаются элементы <default_clardb_plugin>,
<default_rundb_plugin>, которые позволяют устанавливать
плагины по умолчанию для хранения базы посылок и базы
сообщений. Например,
<default_rundb_plugin>mysql</default_rundb_plugin>
по умолчанию для хранения базы посылок будет использоваться
MySQL.

ejudge-setup
------------
Добавлена поддержка настройки элементов <default_clardb_plugin>,
<default_rundb_plugin>.

ej-contests
-----------
При щелчке мышкой по номеру строки в административном интерфейсе
просмотра текста программы в окно комментария вставляется номер
строки.

В административный интерфейс просмотра текста программы
добавлены кнопки "Проигнорировать посылку" и "Пометить посылку
как успешную".

В раздел описания задачи конфигурационного файла serve.cfg
добавлена переменная `disable_ctrl_chars'. Если переменная
установлена в 1, при сдаче текстов программ запрещается
использование управляющих символов, кроме \r и \n.
В частности, запрещается использование \t.

Добавлен новый статус посылок: STYLE_ERR (Coding style
violation), предназначенный для отслеживания нарушений правил
оформления программ. Этот статус подобен статусу COMPILE_ERR, то
есть программы со статусом Coding style violation не
тестируются.

Добавлена поддержка автоматической проверки стиля оформления
программ. Для этого в раздел языков программирования добавлена
конфигурационная переменная `style_checker_cmd'. В этой
переменной можно указать имя программы, которая выполняет
проверку стиля оформления программ. Проверка стиля оформления
программы выполняется до компиляции программы. Если программа
проверки стиля завершается успешно, тестируемая программа
передается на компиляцию. Если программа проверки стиля
завершается неуспешно, диагностируется "Ошибка оформления
программы".

По умолчанию скрипты проверки стиля оформления программы
размещаются в каталоге проверяющих программ, то есть `checkers'
в каталоге турнира.

Поддерживается несколько серверов компиляции программ.
С помощью глобальной переменной extra_compile_dirs указываются
каталоги обмена для серверов компиляции. Например,
extra_compile_dirs = "win32_compile"
extra_compile_dirs = "compile2"
указывает, что каталог обмена с сервером компиляции с номером 1
называется CONTESTS_HOME_DIR/win32_compile/var/compile, а
каталог обмена с сервером компиляции с номером 2 называется
CONTESTS_HOME_DIR/compile2/var/compile
Сервер компиляции с номером 0 - это основной сервер компиляции,
каталог обмена которого указывается в переменной compile_dir.

В разделе описания языков программирования поддерживается
переменная `compile_dir_index', которая позволяет указать номер
используемого сервера компиляции.

В разделе описания языков программирования добавлена
конфигурационная переменная `disable_security'. Если эта
переменная установлена в 1, то для посылок на этом языке
программирования отключаются ограничения безопасности.

В выражение фильтра добавлен примитив "group". Он возвращает
строку из поля `group' первого участника регистрационной
записи.

В выражение фильтра добавлен примитив "arch". Он возвращает
строку архитектуры текущего языка программирования.

В административный интерфейс добавлены средства управления
очередью тестирования. Просмотр текущего состояния очереди
тестирования доступен по ссылке "View testing queue" наверху
главной страницы административного интерфейса.
С очередью тестирования поддерживаются следующие команды:
  * снять одну посылку с тестирования
  * повысить приоритет одной посылки
  * понизить приоритет одной посылки
  * снять все посылки с тестирования
  * повысить приоритет всех посылок
  * понизить приоритет всех посылок
При снятии посылки с тестирования она получает статус
"Pending check".

Добавлены конфигурационные переменные секции описания задачи
`combined_stdin', `combined_stdout'. Если установлена какая-либо
из этих переменных, то включается режим комбинированного ввода
или вывода: стандартный поток и файл.

В протоколе тестирования сохраняется максимальное количество
использованной памяти, если такая информация доступна со стороны
ОС.

Оптимизирована генерация таблицы текущих результатов.

ej-super-server
---------------
Поддерживается редактирование конфигурационной переменной
`disable_ctrl_chars'.

При добавлении нового компилятора в турнир при редактировании
турнира идентификатор языка программирования всегда
устанавливается равным идентификатору языка в сервере
компиляции. В предыдущих версиях идентификатор языка назначался
по-другому, в каждом турнире независимо от других, поэтому при
хранении посылок в БД один и тот же идентификатор языка мог
означать разные языки программирования в зависимости от
турнира. Начиная с данной версии вновь добавляемые в турнир
языки имеют идентификаторы, заданные в конфигурационном файле
сервера компиляции. Для нормализации существующих турниров
предназначена новая программа `ej-fix-db'.

При редактировании турнира с помощью CGI-программы serve-control
поддерживается включение дополнительных серверов компиляции (в
частности, сервера компиляции на Win32). На страницу
"Global settings (serve.cfg)" добавлен параметр
"Enable Win32 languages". Если его значение установлено в YES,
то поддежка Win32-компиляторов активируется.

Обратите внимание, что для того, чтобы в список поддерживаемых
компиляторов при редактировании турнира добавились
Win32-компиляторы после установки параметра "Enable Win32
languages" необходимо сохранить турнир, а потом снова его
открыть.

ej-fix-db
---------
Эта новая программа предназначена для нормализации
идентификаторов языков программирования в таблице runs базы
данных MySQL.

Программа изменяет идентификаторы языков программирования в
конфигурационных файлах всех турниров таким образом, чтобы они
соответствовали идентификаторам языков в конфигурационном файле
сервера компиляции. Одновременно модифицируется таблица runs в
БД.

Программа может запускаться произвольное число раз. Если все
конфигурационные файлы и таблица runs уже корректна, никаких
изменений не проиходит.

ej-nwrun
--------
Эта новая программа предназначена для запуска тестируемых
программ. Программа `ej-nwrun' получает параметры запуска,
исполняемый файл программы и тестовые данные, запускает
тестируемую программу, а затем передает результат работы
программы.

Для обмена с другими частями системы ejudge используются
разделяемые каталоги.

В настоящее время с программой ej-nwrun взаимодействует только
программа ej-run и только в синхронном режиме. Поэтому
распараллеливание тестирования с помощью ej-nwrun пока не
поддерживается.

ej-compile
----------
Добавлена опция командной строки -r, которая позволяет указать
строку, которая будет заменять строку CONTESTS_HOME_DIR в путях
в конфигурационном файле.

Например, если при конфигурировании ejudge значение
CONTESTS_HOME_DIR было установлено в /home/judges, то если
указать в командной строке параметр запуска
ej-compile -r j:
то все префиксы /home/judges в путях в конфигурационном файле
compile.cfg будут заменены на j:
Таким образом, путь /home/judges/compile будет заменен на путь
j:/compile  

В конфигурационном файле поддерживается префикс /TMPDIR в
путях. При запуске программы он заменяется на текущий путь к
каталогу временных файлов системы.

Версия 2.3.14 (r5589) (20090905)
================================
В основном исправления ошибок.

contest.xml
-----------
Обрабатываются элементы <file_group>, <file_mode>, <dir_group>,
<dir_mode>, которые позволяют настраивать права доступа и
идентификатор группы для создаваемых системой файлов и каталогов.

В конфигурационных элементах, задающих анкету пользователя,
поддерживается возможность выбора значения из набора фиксированных
значений.
<field id="field3" separator=":" options="значение 1:значение 2:
значение 3">Выберите значение</field>

Атрибут options перечисляет возможные значения, которые разделяются
символом, определенным в атрибуте `separator'.

ej-contests
-----------
Таблица текущих результатов недоступна из интерфейса
непривилегированного пользователя ни при каких условиях.

В интерфейсе привилегированного пользователя доступна операция
изменения времени окончания турнира.

При просмотре исходного кода в интерфейсе привилегированного
пользователя доступны новые операции:
Submit a comment and mark OK    прокомментировать программу и отметить
                                ее как OK
Just ignore the run             Отметить посылку как IGNORED
Jusk OK the run                 Отметить посылку как OK

Улучшено форматирование исходного кода посылок в интерфейсе
привелигированного пользователя.

В конфигурационном файле турнира поддерживается новая глобальная
конфигурационная переменная `memoize_user_results'. Если она
установлена в 1, в фильтре посылок становится возможным использование
конструкции `total_score', возвращающей целое значение - суммарный
балл участника.

В фильтре посылок поддерживается бинарная операция `~=' -
сопоставление с образцом. Слева от знака операции записывается
строковое выражение, а справа - образец. В образце допускаются
регулярные выражения.

Версия 2.3.13 (r5532) (20081229)
================================
Улучшен запуск и остановка ejudge. Программы проверяют, что они уже
запущены, по списку процессов и никогда не запускаются, если уже
работают.

Для единообразия переименованы многие программы:
командный интерфейс пользователя:
        new-server-cmd          ->	ejudge-contests-cmd
        edit-userlist           ->      ejudge-edit-users
        execute                 ->      ejudge-execute
        job-server-cmd          ->      ejudge-jobs-cmd
серверные программы:
        compile                 ->      ej-compile
        compile-control         ->      ej-compile-control
        new-server              ->      ej-contests
        new-server-control      ->      ej-contests-control
        convert-clars           ->      ej-convert-clars
        convert-runs            ->      ej-convert-runs
        job-server              ->      ej-jobs
        job-server-control      ->      ej-jobs-control
        run                     ->      ej-run
        serve                   ->      ej-serve
        super-serve             ->      ej-super-server
        super-serve-control     ->      ej-super-server-control
        userlist-server         ->      ej-users
        userlist-server-control ->      ej-users-control      

ej-contests
-----------
Добавлены новые переменные `stand_column', `stand_name',
`internal_name' секции описания задачи.

Переменная `stand_name' позволяет задавать название столбца задачи в
таблице текущих результатов турнира. Если переменная не определена, то
в качестве названия столбца используется короткое имя задачи
`short_name'.

Переменная `stand_column' позволяет отображать результаты по данной
задаче в столбце, относящемся к другой задаче, имя которой задается в
значении переменной. Столбец, относящийся к задаче с установленным
значением `stand_column', не показывается. Значением `stand_column'
должно быть либо значение `stand_name', либо значение `short_name'
некоторой другой задачи, у которой не должна быть установлена
`stand_column'. Например:

[problem]
short_name = "A-1"
stand_name = "A"

[problem]
short_name = "A-2"
stand_column = "A"

[problem]
short_name = "A-3"
stand_column = "A"

Результаты по задачам "A-1", "A-2" и "A-3" будут отображены в столбце
"A". Отдельных столбцов для "A-2" и "A-3" в таблице не будет.
Переменной `stand_name' соответствует форматная подстановка %PS.

Значение переменной `internal_name' может использоваться в качестве
компоненты пути к тестам или проверяющим программам. Этой переменной
соответствует форматная подстановка %PL. Пример использования:

[problem]
short_name = "A"
internal_name = "abc"
long_name = "An Abc problem"
test_dir = "%PL"

В этом случае файлы с тестами будут размещаться не в каталоге
`tests/A', а в каталоге `tests/abc'.

На странице привилегированных пользователей доступны ссылки
"View users for IP addresses" и "View IP addresses for users".
По первой ссылке отображается таблица, в которой для каждого IP-адреса
в турнире перечисляется список пользователей, входивших с этого
адреса. По второй ссылке отображается таблица, в которой для каждого
пользователя перечисляется список IP-адресов, с которых он заходил в
турнир.

Добавление новых записей по CSV-таблице (ссылка "Add new runs in CSV
format") возможно в трех режимах:
"Create new submits, fail if a submit already exists" - в котором
добавляются только новые записи
"Modify existing submits, fail if a submit does not exist" - в котором
только модифицируются существующие записи
"Create non-existing submits and modify existing submits" - если
запись существует, то она модифицируется, а в противном случае
создается.

При ручной установке статуса посылки в OK автоматически
устанавливается максимальное количество баллов за задачу.

На странице просмотра непривилегированных пользователей выводится
информация о суммарном числе посылок и о суммарном размере посылок.

В XML-условиях задач поддерживаются подстановки переменных в вариантах
ответов.

Поддерживаются интерактивные задачи. В интерактивных задачах ход
тестирования определяется не только фиксированными тестовыми данными,
но и выводом тестируемой программы. Для интерактивных задач
параллельно с тестируемой программой запускается
программа-интерактор. Стандартный вывод тестируемой программы
направляется на стандартный ввод программы-интерактора, а стандартный
ввод тестируемой программы соединяется со стандартным выводом
программы-интерактора. Правила описания программы-интерактора описаны
на странице:
http://ejudge.ru/wiki/index.php/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B-%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D1%8B

Для интерактивных задач должна быть установлена переменная
`interactor_cmd' раздела описания задачи. Кроме того, может быть
установлена переменная `interactor_env' для установки массива
переменных окружения.

ej-super-server
---------------
Полностью реализовано новое редактирование настроек турнира.
Особенность нового режима редактирования - не нужно нажимать на кнопку
"Change" при изменении значения параметра.

Версия 2.3.12 (r5351) (20081118)
================================
Корректно поддерживаются Google Chrome и другие браузеры на движке
WebKit.

Упрощены конфигурационные настройки для использования MySQL. Теперь
общие параметры подключения к БД, такие как имя базы, логин, пароль
задаются в секции конфигурирования плагина mysql_common следующим
образом:
  <plugins>
    <plugin type="common" name="mysql" load="yes">
      <config>
        <password_file>ejudge_password.txt</password_file>
        <database>ejudge</database>
      </config>
    </plugin>
    <plugin type="rldb" name="mysql" load="yes">
      <config/>
    </plugin>
    <plugin type="cldb" name="mysql" load="yes">
      <config/>
    </plugin>
    <plugin type="uldb" name="mysql" load="yes" default="yes">
      <config/>
    </plugin>
  </plugins>
Обратите внимание, что пароли для доступа к БД могут быть вынесены в
отдельный файл с помощью <password_file>. Указанный файл может быть
доступен на чтение только пользователю, из-под которого работают
серверные программы ejudge. Если не указан абсолютный путь к файлу, он
ищется в том же каталоге, в котором расположен ejudge.xml.

Файл пароля должен содержать две строки: в первой строке записывается
логин пользователя для доступа к MySQL, во второй строке записывается
пароль.

Для всех конфигурационных переменных, требующих задания времени,
например, <registration_deadline> и пр., поддерживаются различные
форматы задания времени:
2008/11/18 16:20:33 (формат по умолчанию)
16:20:33 2008/11/18
16:20               (если дата опущена, подразумевается сегодня)
2008/11/18          (если время опущено, подразумевается 00:00:00)
2008-11-18 16:20:33 (формат дат MySQL)
16:20 18/11         (подразумевается текущий год)

Клиентская часть теперь использует dojo-1.2 вместо dojo-0.4.

Исправлены несколько ошибок при разборе IP-адресов и масок.

ejudge-upgrade-web
------------------
Этот скрипт обновляет каталог ejudge веб-сервера, необходимый
для работы клиентской веб-части. Скрипт скачивает dojo-1.2,
инсталлирует его в каталоге $(HTDOCS)/ejudge, а также создает
необходимые символические ссылки на файлы и CGI-программы. Если
на веб-сервере не используются виртуальные хосты, и при
конфигурировании ejudge были правильно указаны значения опций
--with-httpd-htdocs-dir и --with-httpd-cgi-bin-dir, скрипт можно
запускать без аргументов:
ejudge-upgrade-web
В противном случае можно указать каталог корня документов и
CGI-программ, например так:
ejudge-upgrade-web /var/www/html /var/www/cgi-bin
У пользователя, запускающего скрипт должно быть достаточно прав
для записи в эти каталоги. Скачанный архив dojo-1.2 сохраняется
в домашнем каталоге пользователя и не скачивается повторно, если
он уже существует там.

contest.xml
-----------
Добавлен новый элемент <sched_time>, который позволяет задавать
запланированное время старта турнира в конфигурационном файле. При
создании таблиц турнира запланированное время старта копируется в
таблицы турнира, после чего может изменяться администратором турнира.

Добавлен атрибут "disable_member_delete" элемента <contest> вместо
флага DISABLE_MEMBER_DELETE. Элемент <client_flags> поддерживается для
совместимости при чтении, но при записи XML-файла элемент
<client_flags> уничтожается.

Флаг IGNORE_TIME_SKEW удален, но поддерживается при чтении.
Флаг DISABLE_TEAM удален, но поддерживается при чтении.

Атрибут "enable_forgot_password" переименован в
"enable_password_recovery". Атрибут "enable_forgot_password"
поддерживается для совместимости, но при записи XML-файла заменяется
на "enable_password_recovery".

Атрибут "new_managed" переименован в "managed".

В правах пользователей поддерживаются специальные множества прав
OBSERVER_SET, JUDGE_SET, MASTER_SET, которые заменяют собой
набор прав соответствующих уровней доступа.

userlist-server
---------------
Если в турнире разрешено восстановление паролей, то успешное
восстановление пароля сбрасывает флаг упрощенной регистрации
пользователя. Таким образом, пользователь сможет участвовать в
любых турнирах, а не только допускающих упрощенную регистрацию.

new-server
----------
Исправлены проблемы в отображении списка сообщений при
включенном режиме "только неотвеченные".

В случае, если пользователь, зарегистрированный по процедуре
упрощенной регистрации, пытается зарегистрироваться на обычный
турнир, выводится соответствующее сообщение об ошибке.

Добавлена глобальная конфигурационная переменная
`notify_clar_reply' (Global settings/Contestant's
capabilities/Enable e-mail clar notifications). Если она
установлена, то при отправке пользователю сообщения от жюри,
ответа на сообщение пользователя или комментария к посылке
пользователя, ему отсылается уведомительное письмо по
электронной почте. Уведомления по почте не рассылаются для
сообщений, отправляемых всем участникам.

Добавлена глобальная конфигурационная переменная
`notify_status_change' (Global settings/Contestant's
capabilities/Enable e-mail status change notifications). Если
она установлена, то при изменении статуса посылки пользователя
ему по электронной почте направляется уведомительное письмо.

serve-control
-------------
Поддерживается редактирование параметра задачи `xml_file'.

При попытке редактирования турнира, который уже открыт на
редактирование другим пользователем выдается соответствующее
сообщение.

Если турнир открыт на редактирование в другой сессии того же
самого пользователя, он может либо сбросить результаты
редактирования из другой сессии, либо продолжить редактирование
из другой сессии. В другой сессии дальнейшее редактирование
становится невозможным.

run
---
Если в параметре `start_env' указано просто имя переменной без
значения, например,
start_env="PATH"
тогда будет сохранено текущее значение этой переменной окружения.

Версия 2.3.11 (r5208) (20081012)
================================
Исправлены несколько ошибок версии 2.3.10. Если версия 2.3.10
установлена, рекомендуется произвести обновление до 2.3.11.

Исправлена проблема с падением производительности в случае
использования больших номеров турниров.

Хранение посылок в MySQL
------------------------
Поддерживается хранение базы посылок в базе данных MySQL.
Выбор вида хранения базы посылок выполняется для каждого турнира
отдельно. По умолчанию посылки хранятся в файлах. Чтобы
включить хранение базы посылок в базе данных MySQL необходимо
в конфигурационном файле serve.cfg турнира установить параметр
clardb_plugin = "mysql"

Поддержка MySQL реализована с помощью плагина cldb_mysql.so.
Конфигурационные параметры плагина определяются в файле
ejudge.xml. Минимальные конфигурационные настройки могут
выглядеть следующим образом:
  <plugins>
   <plugin type="rldb" name="mysql" load="yes">
      <config>
        <user>ejudge</user>
        <password>*********</password>
        <database>ejudge</database>
      </config>
    </plugin>
  </plugins>
База данных ejudge и пользователь ejudge с полными правами
работы с этой базой должны быть предварительно созданы,
например, с помощью phpMyAdmin.

При работе с базой посылок турнира она полностью загружается в
память при открытии турнира и не обновляется из MySQL. Однако
все записи в базу посылок немедленно приводят к обновлениям в
MySQL базе. Поэтому не рекомендуется изменять MySQL базу посылок
в то время, когда турнир загружен. Команда "Reload contest
settings" интерфейса администратора в числе прочего и перечитает
базу посылок из MySQL.

Только информация о посылках хранится в таблице. Исходный код и
протоколы тестирования по-прежнему хранятся в файлах.

convert-runs
------------
Новая программа для конвертации одного формата хранения базы
посылок в другой. Программа инсталлируется либо в каталог bin,
либо в каталог libexec/ejudge/bin, в зависимости от опции
--enable-hidden-server-bins скрипта configure. Например, для
перевода базы посылок некоторого турнира из файлового формата в
базу данных MySQL программа должна вызываться со следующими
аргументами:
convert-clars CONTEST-ID file mysql
Плагин rldb_mysql должен быть корректно настроен (см. выше) и
требуемая база должна быть создана.

new-server
----------
В URL запроса допускается указание символических названий для
параметра action. Например, action=reg_create_account_page.

Новая конфигурационная переменная раздела определения задачи
`disable_security'. Если она установлена, для соответствующей
задачи отменяются ограничения безопасности.

Версия 2.3.10 (r5160) (20081004)
================================
Хранение базы пользователей в MySQL
-----------------------------------
Поддерживается хранение базы пользователей в базе данных MySQL.
Поддержка MySQL реализована с помощью плагина uldb_mysql.so.
Конфигурационные параметры плагина определяются в файле
ejudge.xml. Минимальные конфигурационные настройки могут
выглядеть следующим образом:
  <plugins>
   <plugin type="uldb" name="mysql" load="yes" default="yes">
      <config>
        <user>ejudge</user>
        <password>*********</password>
        <database>ejudge</database>
      </config>
    </plugin>
  </plugins>
База данных ejudge и пользователь ejudge с полными правами
работы с этой базой должны быть предварительно созданы,
например, с помощью phpMyAdmin.

Для перехода от хранения базы пользователей в XML-файле к
хранению базы пользователей в MySQL необходимо настроить плагин,
создать базу данных, а затем выполнить команду
userlist-server --convert --from xml --to mysql
Обратный переход от базы данных к XML-файлу в данный момент не
поддерживается, но будет поддерживаться в следующей версии.

Запросы к базе данных по умолчанию кэшируются, но кэширование
можно отменить, указав атрибут cache_queries="no" в элементе
<config> конфигурации плагина. Кэшируется не вся база
пользователей, а только некоторая часть недавно запрошенных
записей. При полном заполнении кэша вытесняются записи, которые
не запрашивались дольше всего. Обновление базы выполняется сразу
же в базе данных MySQL, при этом соответствующая запись
удаляется из кэша, поэтому чтение, следующее за обновлением,
приведет к запросу на чтение из базы данных.

Кэшированием можно управлять и во время работы сервера
userlist-server, послав ему один из специальных сигналов
(см. далее).

Хранение сообщений в MySQL
--------------------------
Поддерживается хранение базы сообщений в базе данных MySQL.
Выбор вида хранения базы посылок выполняется для каждого турнира
отдельно. По умолчанию сообщения хранятся в файлах. Чтобы
включить хранение базы сообщений в базе данных MySQL необходимо
в конфигурационном файле serve.cfg турнира установить параметр
clardb_plugin = "mysql"

Поддержка MySQL реализована с помощью плагина cldb_mysql.so.
Конфигурационные параметры плагина определяются в файле
ejudge.xml. Минимальные конфигурационные настройки могут
выглядеть следующим образом:
  <plugins>
   <plugin type="cldb" name="mysql" load="yes">
      <config>
        <user>ejudge</user>
        <password>*********</password>
        <database>ejudge</database>
      </config>
    </plugin>
  </plugins>
База данных ejudge и пользователь ejudge с полными правами
работы с этой базой должны быть предварительно созданы,
например, с помощью phpMyAdmin.

При работе с базой сообщений турнира она полностью загружается в
память при открытии турнира и не обновляется из MySQL. Однако
все записи в базу сообщений немедленно приводят к обновлениям в
MySQL базе. Поэтому не рекомендуется изменять MySQL базу сообщений
в то время, когда турнир загружен. Команда "Reload contest
settings" интерфейса администратора в числе прочего и перечитает
базу сообщений из MySQL.

Устранены несколько мелких утечек памяти.

contest.xml
-----------
Добавлен элемент <reg_welcome_file>. Данный элемент позволяет
указать имя HTML-файла с текстом, который выводится при
регистрации на турнир с помощью CGI-программы new-register.

userlist-server
---------------
Если в качестве хранилища базы данных пользователей используется
MySQL, то обрабатываются следующие сигналы, позволяющие менять
стратегии кэширования во время работы программы:
USR1    сбрасывает кэш и запрещает дальнейшее кэширование
USR2    сбрасывает кэш
URG     разрешает кэширование

new-server
----------
Посылки одного приоритета компилируются и тестируются в том
порядке, в котором они поступили в систему (точнее, в порядке
возрастания их run_id).

На страницу администратора турнира добавлена ссылка
"Change judging priorities", которая позволяет изменять
приоритет тестирования для задач. Заданный таким образом
приоритет тестирования для задач прибавляется к глобальному
приоритету (глобальная переменная `priority_adjustment'),
приоритету пользователя (глобальная переменная
`user_priority_adjustment'), приоритету языка программирования
(переменная `priority_adjustment' секции определения языка
программирования), приоритету задачи (переменная
`priority_adjustment' секции определения задачи), приоритету
тестировщика (переменная `priority_adjustment' секции
определения тестировщика) и приоритету перетестирования (+10 к
приоритету в случае повторного тестирования посылки).

Приоритет изменяется от -16 до 15, причем -16 соответствует
максимальному приоритету. Значение приоритета по умолчанию - 0.

При отображении листинга программы на странице "View source"
привилегированного пользователя можно задавать кодировку, в
которой записана программа (выпадающий список "Charset").

На странице просмотра листинга программы ("View source")
привилегированного пользователя поддерживается возможность
отправки комментария к данной посылке. Комментарий заносится в
базу сообщений с заголовком "Run RUN-ID is commented" и доступен
автору посылки. Поддерживается возможность отправить комментарий
к посылке и одновременно отметить посылку как "Ignored".

На странице регистрации корректно обрабатывается ситуация, когда
установлен флаг `disable_name', но заданы поля формы, которые
необходимо заполнить.

Просмотр паролей участников доступен только привилегированным
пользователям с соответствующими привилегиями.

new-server-cmd
--------------
Поддерживается команда "force-start-virtual" для принудительного
запуска виртуального турнира у указанного пользователя.

convert-clars
-------------
Новая программа для конвертации одного формата хранения базы
сообщений в другой. Программа инсталлируется либо в каталог bin,
либо в каталог libexec/ejudge/bin, в зависимости от опции
--enable-hidden-server-bins скрипта configure. Например, для
перевода базы посылок некоторого турнира из файлового формата в
базу данных MySQL программа должна вызываться со следующими
аргументами:
convert-clars CONTEST-ID file mysql
Плагин cldb_mysql должен быть корректно настроен (см. выше) и
требуемая база должна быть создана.

run
---
Исправлена ошибка падения программы на очень больших выходных
файлах чекера.

clean-users
-----------
Убран из списка компилируемых программ.

Версия 2.3.9 (r4998) (20080808)
===============================
Исправлены несколько проблем в новой поддержке компиляторов языков
программирования. Шаблоны для скриптов компиляции (например, gcc.in)
могут размещаться как в каталоге ${prefix}/libexec/ejudge/lang/in, так
и в каталоге ${compile_home_dir}/scripts/in, причем последний каталог
более приоритетный, то есть если шаблон скрипта компиляции найден в
нем, то первый каталог не просматривается. В первый каталог
инсталлируются стандартные шаблоны скриптов компиляции при инсталляции
системы. В каталог ${compile_home_dir}/scripts/in пользователь может
помещать модифицированные версии стандартных скриптов компиляции или
свои скрипты компиляции.

Обработанные скрипты компиляции (например, gcc) находятся в каталоге
${compile_home_dir}/scripts. Они копируются туда при выполнении
настроечного скрипта, сгенерированного программой ejudge-setup, или
при выполнении программы ejudge-configure-compilers.

Удалены старые CGI-программы team, judge, master, register. Теперь это
все ссылки на новые программы new-client, new-judge, new-master и
new-register соответственно.

Существенно увеличено ограничение на максимальное число задач и языков
программирования в одном турнире. Вместо 255 оно равно 100000.

В глобальный конфигурационный файл ejudge.xml добавлен атрибут
"enable_contest_select" элемента <config>. Если этот атрибут
установлен в значение "истина" (например,
enable_contest_select="yes"), то когда используется
CGI-программа new-client участника турнира без указания номера
турнира (то есть, например, http://HOST/cgi-bin/new-client) до
аутентификации пользователя, пользователю показывается список
турниров, в которых он может принять участие. Этот список
отбирается среди открытых турниров, удовлетворяющих ограничениям
на IP-адрес пользователя.

Поддерживаются глобальные конфигурационные переменные
`standings_charset', `stand2_charset', `plog_charset', которые
позволяют устанавливать кодировку соответствующих выходных файлов.

serve-control
-------------
Улучшена обработка ситуации, когда на редактирование открывается
турнир при том, что другой турнир уже открыт на редактирование.

Версия 2.3.8 (r4898) (20080413)
===============================
Полностью переработана поддержка компиляторов и интерпретаторов
языков программирования. Определение и настройка поддерживаемых
компиляторов и интерпретаторов исключена из скрипта configure и
перенесена в программу начальной настройки ejudge-setup.
Для конфигурирования языков программирования после установки
предназначена новая программа ejudge-configure-compilers.

Упрощено добавление новых (не поддерживаемых в стандартной
конфигурации) языков программирования. Теперь достаточно
написать два скрипта: LANG-version.in для настройки и LANG.in
для работы. Параметры настройки для языков программирования
хранятся отдельно в файле LANG.cfg в каталоге файлов
конфигурации языков программирования (см. ниже).

"Заготовки" для скриптов настройки и компиляции LANG-version.in
и LANG.in теперь не обрабатываются скриптом configure, а
инсталлируются в каталог PREFIX/libexec/ejudge/lang/in. Они
обрабатываются (в них выполняются некоторые текстовые
подстановки) и копируются в каталог PREFIX/libexec/ejudge/lang
при работе программ ejudge-setup или ejudge-configure-compilers.

Добавлена поддержка для языков программирования PHP и Ruby.

compile
-------
Поддерживается новая глобальная конфигурационная переменная
`lang_config_dir' файла compile.cfg. Эта переменная позволяет указать
путь к каталогу, в котором хранятся конфигурационные файлы языков
программирования. Если переменная установлена, программа compile
работает в новом режиме конфигурации.

Новый режим конфигурации означает, что наличие или отсутствие того или
иного компилятора определяется не по наличию или отсутствию
соответствующей секции [language] в файле compile.cfg, а по
конфигурационному файлу LANG.cfg соответствующего компилятора или
интерпретатора. В частности, если переменная `version'
конфигурационного файла компилятора не пуста, компилятор или
интерпретатор может быть использован.

В новом режиме конфигурации файл compile.cfg содержит секции описания
для всех компиляторов или интерпретаторов, конфигурационные скрипты
которых (LANG-version.in) были обнаружены в каталоге конфигурационных
скриптов. Файл compile.cfg перегенерируется при каждом запуске
ejudge-configure-compilers, поэтому не должен редактироваться вручную.

configure
---------
Добавлена опция --enable-lang-config-dir=DIR, позволяющая настраивать
путь к каталогу файлов конфигурации языков программирования. По
умолчанию этот путь равен CONTESTS-HOME/compile/conf/lang.d, где
CONTESTS-HOME - это корневой каталог турниров (/home/judges по
умолчанию). Этот каталог создаётся и заполняется файлами
конфигурации при начальной настройке системы с помощью
ejudge-setup, и при обновлении конфигурации с помощью
ejudge-configure-compilers.

Опции --with-gcc, --with-gpp и т. д. помечены "устаревшими",
попытка их использования вызывает завершение configure со
следующим сообщением об ошибке:
ERROR:
The configure script now does not configure programming language
compilers. Options like --with-gcc are no longer supported.
To configure programming language compilers please use ejudge-setup
or ejudge-configure-compilers programs.
Для указания нестандартных путей к компиляторам и
интерпретаторам необходимо использовать программы ejudge-setup
или ejudge-configure-compilers.

В глобальный конфигурационный файл ejudge.xml добавлен атрибут
"disable_cookie_ip_check" элемента <config>. Если этот атрибут
установлен в значение "истина" (например,
disable_cookie_ip_check="yes"), то при проверке сессионного
ключа не будет проверяться IP-адрес, с которого идёт данное
обращение, на соответствие IP-адресу, использованному при
создании сессионного ключа. Включение этого режима существенно
понижает безопасность, но может помочь, когда клиентские
компьютеры подключаются к Интернету через корпоративные
балансировщики нагрузки.

ejudge-configure-compilers
--------------------------
Новая программа, предназначенная для обновления конфигурации
языков программирования. Программа может работать в пакетном и
визуальном режиме.

В пакетном режиме ее работа аналогична работе скрипта
configure. Диагностический вывод идет на стандартный поток
ошибок, вмешательства пользователя не требуется. Нестандартные
значения настроек указываются с помощью опций командной строки.
Пакетный режим активируется указанием опции --batch командной
строки.

В визуальном режиме для редактирования настроек предоставляется
визуальный интерфейс текстового режима, аналогичный интерфейсу
программы ejudge-setup.

В результате работы программы могут быть обновлены файлы
конфигурации языков программирования LANG.cfg, а так же файл
конфигурации сервера компиляции compile.cfg.

Программа поддерживает все опции настройки языков
программирования, которые до этого были реализованы в скрипте
configure, например, --with-gcc=PATH, и еще несколько
дополнительных опций. Для вывода полного списка опций командной
строки можно использовать команду
ejudge-configure-compilers --help

Полная документация по программе ejudge-configure-compilers
будет размещена в Wiki-разделе сайта.

ejudge-setup
------------
Добавлен новый пункт меню "Setup compilers", который позволяет
выполнить начальное конфигурирование языков программирования.

Обновлен тестовый турнир. В него добавлены решения для новых
поддерживаемых языков программирования: C#, Visual Basic .NET,
PHP, Ruby.

new-server
----------
В именах команд поддерживаются произвольные символы (в том числе,
кавычки, апострофы, амперсенты и т. д.).

Исправлены проблемы с переключением на русский язык отображения
страниц в некоторых дистрибутивах Linux (в частности Ubuntu).

Исправлены проблемы с дорешиванием турниров неограниченной
продолжительности, для которых было установлено время окончания
турнира.

Для языков программирования добавлен флаг "insecure". Установка
флага означает, что данный язык программирования по тем или иным
причинам не может использоваться в безопасном режиме проведения
турнира (задаваемым конфигурационной переменной secure_run),
например, язык не поддерживает необходимое ограничение прав
работающей программы, или же в ограниченном окружении программа
на этом языке неработоспособна.
Если в разделе описания языка программирования конфигурационного
файла serve.cfg этот флаг установлен в 1, этот язык
автоматически запрещается для использования непривилегированными
пользователями при работе турнира в безопасном режиме.

Для языка LANG флаг небезопастности изначально устанавливается в
конфирурационном файле LANG.cfg языка программирования скриптом
конфигурации LANG-version, затем копируется в конфигурационный
файл сервера компиляции compiler.cfg при работе программы
ejudge-configure-compilers, оттуда копируется в конфигурационный
файл турнира при редактировании настроек турнира с помощью
serve-control.

При отображении условий из XML-файла задачи автоматически
добавляется информация об именах входного и выходного файла,
ограничении времени и ограничении памяти.

run
---
Программа run не завершается по ошибке, если в конфигурационном файле
турнира нет задач, подлежащих автоматическому тестированию.

serve-control
-------------
При создании новых турниров с нуля режим сохранения полного архива
вывода программы `enable_full_archive' теперь отключен, а режим
навигации по задачам с помощью закладок (`problem_navigation')
включен.

Корректно поддерживается непустое значение CGI_PROG_SUFFIX.

userlist-server
---------------
Поддерживается атрибут "disable_cookie_ip_check" конфигурационного
файла ejudge.xml. Если он установлен, при проверке сессионного ключа
не требуется совпадение IP-адресов.

Версия 2.3.7 (r4802) (20080310)
===============================
Исправления ошибок и мелкие усовершенствования.

При создании файлов и каталогов права по умолчанию позволяют
запись для группы (g+w). При использовании соответствующего
значения umask (002) права на файлы и каталоги будут позволять
запись для группы. Обратите внимание, что значение umask по
умолчанию (обычно 022) не позволяет запись для группы. Чтобы это
исправить, выполните перед запуском ejudge команду
umask 002

Кодировка по умолчанию установлена в UTF-8. Исправлен ряд ошибок
компиляции, возникавших, когда при запуске configure не была
указана опция --enable-charset.

Исправлен ряд ошибок, возникавших, когда при запуске configure
не была указана опция --enable-local-dir.

Поддерживается компилятор gfortran, который заменяет g77 в новых
версиях GCC. Добавлена опция --with-gfortran скрипта configure.

В скриптах компиляции gcc и g++ перед вызовом компилятора
сбрасывается текущее языковое окружение. Это значит, что ошибки
компиляции будут выдаваться на английском языке.

contest.xml
-----------
Добавлен атрибут "disable_password_change" элемента <contest>.
Если этот атрибут установлен, участнику запрещено менять свой
пароль.

Добавлен элемент <keywords>. Элемент может использоваться для
указания произвольных ключевых слов, характеризующих турнир.

Добавлено полномочие RESTART. Пользователь с таким полномочием
может перезапускать программы userlist-server, super-serve,
compile, new-server из командной строки с помощью
соответствующих програм *-control.

new-server
----------
В базе данных сообщений (clarlog) сохраняется кодировка
сообщений. Это позволяет корректно отображать сообщения при
переносе базы на систему с другой кодировкой ejudge.

В файле serve.cfg поддерживается специальный комментарий
# -*- coding: CHARSET -*-
который позволяет задавать кодировку файла serve.cfg. Этот
комментарий должен быть первой строкой в файле.

Улучшен диалог отправки решений на проверку в интерфейсе
привилегированного пользователя (new-master/new-judge).

Добавлена конфигурационная переменная `use_ac_not_ok' раздела
описания задачи. Если эта конфигурационная переменная
установлена, то вместо статуса OK для решений, проходящих все
тесты, используется статус AC (accepted for testing).

В xml-файле протокола турнира (XML runlog) вместо числовых
идентификаторов пользователей, задач и языков используются
символические, то есть login для пользователей, short_name для
задач и языков.

new-server-cmd
--------------
Добавлена команда "schedule" для указания времени старта турнира.

serve-control
-------------
При записи файла serve.cfg в файл записывается его кодировка
(см. выше).

Поддерживается редактирование атрибута турнира
"disable_password_change" и элемента <keywords>.

При записи файла contest.xml корректно устанавливается его
кодировка.

При записи конфигурационного файла корректно поддерживается язык C#.

ejudge-control
--------------
Для команды stop поддерживается опция -s (slave mode). Если эта
опция указана, то сигналы завершения будут разосланы только тем
программам, которые запускались с опцией -s, то есть compile и
super-serve.

Версия 2.3.6 (r4700) (20080218)
===============================
В основном исправления замеченных ошибок.
Внесен ряд усовершенствований для облегчения распараллеливания
проверки на несколько компьютеров.

Изменена структура каталогов системы. Теперь файлы и каталоги, которые
должны быть локальными для каждого проверяющего компьютера,
размещаются в /var/lib/ejudge. В /home/ejudge (или в другом каталоге,
задаваемом с помощью опции --enable-contests-home-dir) оставлены каталоги,
которые должны быть общими для всех проверяющих компьютеров или могут
безопасно разделяться ими. Для совместимости с предыдущими версиями по
умолчанию сохраняется старое поведение. Чтобы активировать новое
поведение необходимо использовать опцию --enable-local-dir скрипта
configure.

При компиляции системы по умолчанию не используется флаг gcc
-Werror. Чтобы включить флаг -Werror используйте опцию скрипта
configure --enable-werror.

Исправлены ошибки компиляции, возникавшие, если в командной строке
configure не была задана опция --enable-charset.

Программы запуска dos-компиляторов (bppemu, и др.) предполагают, что
dosemu размещается в каталоге, задаваемом опцией --enable-local-dir.

configure
---------
Новая опция --enable-local-dir=DIR, которая позволяет задавать путь к
каталогу локальных (не разделяемых) файлов. Рекомендуемое значение
этой опции - /var/lib/ejudge. Если опция указана, то в этом каталоге
размещаются:
        o образ локального диска work-img для ограничения дискового
          пространства проверяемых программ;
        o каталог work-dir, в который монтируется образ дискового
          пространства;
        o рабочий каталог compile/work программы compile, в котором
          программа размещает компилируемую программу и запускает
          компилятор;
        o рабочий каталог <CONTEST_NUM>/work, в котором размещаются
          рабочие файлы при тестировании посылки заданного турнира.
Таким образом, если используется опция --enable-local-dir, то каталог
/home/judges (или тот каталог, который задан в опции
--enable-contests-home-dir) может безопасно монтироваться с клиентских
компьютеров по NFS.

Новая опция --enable-werror. Если она указана, то при компиляции
ejudge включается флаг -Werror. Рекомендуется только для
разработчиков.

ejudge-control
--------------
Добавлены два режима работы: slave и master.
В режиме работы slave запускаются только программы compile и
super-serve, которая сама запускается в режиме slave, то есть не
принимает и обрабатывает управляющие запросы (например, редактирование
турниров и пр.).
В режиме работы master запускаются все программы, кроме compile.
Программа super-serve запускается в master-режиме, то есть
тестирование турниров не обслуживается, но обслуживаются управляющие
запросы.

Режим работы master может использоваться на главном компьютере,
который обрабатывает запросы от пользователей, но сам тестирование не
выполняет. Режим работы slave может использоваться на тестирующих
компьютерах. По умолчанию система запускается в автономном режиме, то
есть данный компьютер как обрабатывает запросы пользователей, так и
выполняет тестирование.

Сводка новых опций:
	-s slave mode
	-m master mode
        -r обслуживать все контесты в slave mode (может использоваться
           только совместно с ключем -s) - см. super-serve ниже

super-serve
-----------
Исправлен ряд ошибок в поддержке суффиксов CGI файлов, устанавливаемых
с помощью опции --enable-cgi-suffix скрипта configure.

Уменьшен интервал проверки каталогов заданий на тестирование. Теперь в
случае распределенного тестирования задержка при запуске программы
тестирования не превышает 10 секунд (вместо 1 минуты).

Добавлен новый режим запуска master (задаётся ключем -m в командной
строке). В этом режиме не обрабатываются запросы на тестирование в
турнирах (то есть программы run не запускаются), но обрабатываются
запросы пользователей (например, на редактирование турниров). Данный
режим работы может использоваться на главном компьютере, который
принимает запросы от пользователей, но сам тестирование не
производит. См. выше описание ejudge-control.

Добавлен новый ключ `-r' для управления тестированием всех турниров в
режиме slave. Ключ `-r' может использоваться только совместно с ключем
`-s'. По умолчанию в режиме slave тестирование разрешено только для
тех турниров, у которых в XML-файле описания турниров явно прописано
разрешение на тестировании на данном компьютере, например:
  <slave_rules>
    <run_managed_on>pc1</run_managed_on>
    <run_managed_on>pc2</run_managed_on>
  </slave_rules>
Это фрагмент XML файла задает, что тестирование турнира разрешено в
режиме slave на компьютерах pc1 и pc2.
Если при старте программы super-serve в режиме slave указана опция -r,
то тестирование будет разрешено для всех турниров.
Опция -r может указываться и в командной строке программы
ejudge-control, см. выше. В этом случае она просто передается в
super-serve.

Поддерживаются опции --version и --help.

new-server
----------
Генерируемый HTML с текущими результатами теперь является корректным
XHTML.

Исправлен ряд ошибок, из-за которых не работал new-server-cmd.

Добавлена глобальная конфигурационная переменная stand_use_login.
Если она установлена в ненулевое значение, в таблице текущих
результатов турнира в столбце "User" используется поле `login'
пользователя, а не поле `name'.

Добавлена конфигурационная переменная `score_latest' раздела описания
задачи. Если она установлена в ненулевое значение, то в турнире по
системе KIROV вклад в общий результат участника будет давать последняя
посылка по этой задаче, а не лучшая. Опция может использоваться, когда
в турнирах по системе KIROV есть задачи, проверяемые в off-line
режиме.

new-server-cmd
--------------
Добавлены новые команды управления турниром:
	start-contest
        stop-contest
        continue-contest
        suspend-contest
        resume-contest
        suspend-printing
        resume-printing
        set-judging-mode
        set-accepting-mode
        set-testing-finished
        clear-testing-finished
        rejudge-all
Они соответсвуют командам, доступным через веб-интерфейс
администратора турнира.

super-serve
-----------
Поддерживается редактирование новых конфигурационных переменных
stand_use_login и score_latest.

ejudge-setup
------------
Поддерживается --enable-local-dir

execute
-------
Исправлена потенциальная ошибка компиляции (неиспользуемая переменная).

Версия 2.3.5 (r4652) (20080107)
===============================
Исправлена ошибка при генерации конфигурационного файла для
тестового турнира.

Версия 2.3.4 (r4646) (20071226)
===============================
Реализован модуль расширения для языка Python, который
предоставляет доступ к серверу базы пользователей.
Модуль расширения доступен в каталоге python.
Документация по использованию модуля расширения доступна по
ссылке http://localhost:8888/wiki/index.php/%D0%94%D0%BE%D1%81%D1%82%D1%83%D0%BF_%D0%BA_ejudge_%D0%B8%D0%B7_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC_%D0%BD%D0%B0_%D0%9F%D0%B8%D1%82%D0%BE%D0%BD%D0%B5

contest.xml
-----------
Добавлен новый атрибут `allow_reg_data_edit' элемента
<contest>. Если значение атрибута равно TRUE, то в ходе контеста
участник может в любой момент вернуться к редактированию личных
данных.

Элемент <field> может содержать текст. Этот текст будет
выводиться в качестве пояснения в форме редактирования
регистрационных данных. Например,
 <field id="inst" mandatory="yes">Название школы</inst>
вместо стандартного пояснения будет выведено указанное
пояснение.

Добавлен новый бит полномочий `PRIV_EDIT_REG'. Он должен быть
установлен для редактирования регистрационных настроек
привилегированных пользователей. При переходе на эту версию
может потребоваться добавить этот бит в настройки турниров.

Максимальный номер турнира увеличен до 999999.

Биты полномочий LIST_CONTEST_USERS и LIST_ALL_USERS заменены
одним битом LIST_USERS. При доступе ко всей базе пользователей
целиком он работает как LIST_ALL_USERS, а при доступе к турниру
- как LIST_CONTEST_USERS.

Удален бит полномочий GENERATE_TEAM_PASSWORDS. Вместо него
добавлены два бита EDIT_PASSWD и PRIV_EDIT_PASSWD. Они позволяют
просматривать и изменять регистрационные и турнирные пароли для
обычных и привилегированных пользователей соответственно. Биты
EDIT_PASSWD или PRIV_EDIT_PASSWD, установленные для всей базы
пользователей в файле ejudge.xml, позволяют просматривать и
модифицировать регистрационные пароли и турнирные пароли во всех
турнирах. Биты EDIT_PASSWD или PRIV_EDIT_PASSWD, установленные
для турнира, позволяют просматривать турнирные пароли в данном
турнире.

userlist.xml
------------
В базу пользователей добавлено много новых полей:
o турнирные регистрационные данные пользователя
	instnum	номер учебного заведения (номер школы). должен
        	быть числом.
	area	район области, например, "Ногинский р-н"
	zip	почтовый индекс
        street	улица, дом, квартира
        field0  дополнительное поле 0
        field1
        ...
        field9  всего 10 дополнительных текстовых полей, которые
	        можно использовать произвольным образом
o регистрационные данные члена команды (персональные)
	gender		пол
	discipline      дисциплина (предмет)

edit-userlist
-------------
Улучшена поддержка кодировки UTF-8. Горячие кнопки работают и в
русской раскладке в кодировке UTF-8.

Ширина полей увеличена с 128 до 256 символов.

execute
-------
Добавлена опция командной строки --security-violation, которая
включает режим обнаружения ошибок этого типа.

new-server
----------
Заголовок сообщения (clarification) обрезается корректно в
случае кодировки UTF-8.

Реализована поддержка модулей расширения (plugin) турниров.
В данной версии модули расширения турнира могут реализовывать
только генерацию всех видов протокола. В дальнейшем планируется
расширить функциональность модулей расширения (например,
генерацией таблицы результатов) и документировать интерфейс.

В выражение фильтра добавлены новые конструкции:
	missingsource	равен TRUE, если у посылки должен быть
			исходные код, но он по каким-то причинам
			отсутствует
	judge_id	возвращает целое значение, равное
			идентификатору проверки для данной посылки

При просмотре посылок непривилегированными пользователями
правильно отображаются только 15 последних посылок.

В таблице результатов отображаются поля из личных данных
участников команды, например, класс или группа.

В таблице посылок привилегированных пользователей события
VIRTUAL_STOP отображаются со знаком `!', если в режиме
виртуальной олимпиады посылки данного участника уже проверены.

Улучшена поддержка форматов файлов Microsoft Office, а так же
форматов .BMP и .GIF при приеме заданий типа output-only.

На страницу привилегированных пользователей добавлена ссылка
"View examination information", по которой отображается таблица
участников экзамена, содержащая логин, имя, экзаменационный
номер, шифр и т. д.

На странице привилегированных пользователей исправлена ошибка,
из-за которой заголовок таблицы текущих результатов отображался
дважды.

На страницу ошибки входа из-за неполных регистрационных данных
добавлена ссылка на страницу редактирования регистрационных
данных.

Если для турнира установлен флаг `force_registration', участники
автоматически регистрируются на турнир при первом входе в
редактирование регистрационных данных этого турнира.

Для личных турниров (у которых установлен флаг `personal') на
странице редактирования данных об участнике отображаются поля
первого члена команды.

На привилегированной странице просмотра информации об участниках
добавлена возможность выполнить операцию над диапазоном
идентификаторов участников.

Добавлена привилегированная команда назначения случайных шифров
участникам ("Assign random cyphers").

Для output-only задач поддерживается окно для ввода текстового
ответа. Таким образом, ответ может быть либо послан в файле в
одном из разрешенных форматов, либо введен непосредственно в
окно ввода. Для включения этой возможности должна быть
установлена конфигурационная переменная `enable_text_form'
раздела описания задачи.

Если в XML-файле турнира установлен флаг `allow_reg_data_edit',
в строке меню страницы непривилегированных пользователей
добавляется ссылка "Registration data".

В режиме вертикальной навигации задач поддерживается новый
параметр `group_name'. Когда у очередной задачи изменяется
группа, новая группа выводится в столбце навигации по задачам.

Новые глобальные конфигурационные переменные:
detect_violations	включить выявление ошибок "security violation"
contest_plugin_file	имя файла модуля расширения турнира

Новые конфигурационные переменные описания задачи:
enable_text_form	при сдаче задач типа output-only
			разрешить ввод ответа в текстовом виде
prev_runs_to_show	число отображаемых предыдущих посылок по
			каждой задаче
group_name		имя группы задач

При генерации печатных протоколов корректно обрабатываются
многие символы в кодировке UTF-8, которые не обрабатываются
непосредственно latex'ом.

Поддерживается генерация печатных протоколов, включающих задачи
типа output-only с картинками в форматах JPEG, BMP, GIF, PNG.

Перенумерация посылок отражается в журнале обработки посылок
(audit log).

Временно отключена возможность удаления пустых записей (squeeze)
в журнале посылок (runlog).

Добавлено новое форматное преобразование для отображения в
таблице текущих результатов: `%Vv' - вывод варианта
пользователя.

На привелигированные страницы добавлена ссылка на страницу
описания выражений фильтров.

С привелигированной страницы всегда доступна ссылка на условия
задач, если она установлена в элементе <problems_url>

Добавлена новая глобальная конфигурационная переменная
`stand_disq_attr' файла serve.cfg, которая позволяет устанавливать
атрибуты ячейки таблицы текущих результатов, для которых были
дисквалифицированные посылки.
stand_disq_attr = " bgcolor=\"#ffcccc\""

Добавлена новая конфигурационная переменная `stand_ignore_score'
раздела описания задачи  файла serve.cfg. Если эта переменная
установлена в 1, баллы за данную задачу не добавляются к сумме
всех баллов за турнир.

Добавлена новая конфигурационная переменная `score_view' раздела
описания задачи файла serve.cfg. Эта переменная позволяет
задавать отображение числовых баллов за задачу в символьные
строки. Например,
score_view = "0 0"
score_view = "1 -"
score_view = "2 +"
задаёт, что 0 баллов будет отображаться как "0", 1 балл - как
"-", а 2 балла - как "+".

Добавлена новая конфигурационная переменная `stand_last_column'
раздела описания задачи файла serve.cfg. Если эта переменная
установлена в 1, то столбец данной задачи в таблице текущих
результатов будет отображаться после столбцов с суммарным баллом и
количеством решенных задач. Таким образом можно определять "задачи",
которые на самом деле будут содержать дополнительную информацию
(например, оценку за курс), проставляемую в таблицу текущих
результатов.

register
--------
Если турнир обрабатывается новым сервером, то пользователь
перенаправляется на страницу `new-register'.

run
---
Добавлена поддержка обнаружения ошибки "Security violation
error". Для обнаружения ошибки необходима версия ядра Linux не
хуже чем 2.6.23.8 и последняя версия библиотеки reuse. Данный
тип ошибки возникает, когда программа пытается использовать
заведомо запрещённые системные вызовы, например, socket() или
fork(). По умолчанию поддержка обнаружения ошибки "Security
violation error" отключена, для включения необходимо установить
глобальную конфигурационную переменную `detect_violations'.

Корректно обрабатываются задачи с более чем 127 тестами.

new-server-cmd
--------------
Добавлена команда `unload' для выгрузки указанного турнира.
Команда может использоваться для принудительной перезагрузки
настроек турнира после их изменения.

Версия 2.3.3 (r4320) (20070825)
===============================
Дальнейшее развитие системы. Многочисленные усовершенствования,
чтобы облегчить распространение системы в бинарном виде (в виде
RPM и т. п.). Изменена структура каталогов инсталляции системы,
чтобы сделать её более подходящей для инсталляции с префиксом /usr.

Поддерживается усовершествованная система запуска программ в
защищённом окружении, реализованная в виде патча к ядрам 2.6.18
и 2.6.22. Для её поддержки не требуется библиотеки libcap.
Наличие поддержки защищённого режима полностью определяется при
запуске тестируемых программ. Таким образом, можно
скомпилировать систему ejudge на обычном ядре, и защищенный
режим будет активирован, когда программа будет запускаться на
усовершенствованном ядре, и наоборот, система, скомпилированная
под усовершенствованным ядром, будет нормально работать под
обычным ядром. Усовершенствованная система запуска программ
требует последней версии (4.3.2) библиотеки reuse.

Изменилось расположение файлов в каталоге ${libexecdir}/ejudge.
Стандартные проверяющие программы перенесены в подкаталог `checkers'.
Скрипты компиляции и запуска перенесены в каталог `lang'.
Если указана опция `--enable-hidden-server-bins', исполняемые файлы
находятся в подкаталоге `bin'.

Незначительно переработан формат конфигурационных файлов. Сохранена
полная совместимость с предыдущими версиями, но в новой версии нигде
не требуется задания абсолютных путей. Кроме того, улучшена поддержка
безопасного запуска программ. Для сохранения конфигурационных файлов в
новом формате достаточно открыть турнир на редактирование в
CGI-программе `serve-control' и сразу сохранить настройки.

Улучшена поддержка архитектуры x86_64. Система компилируется и работает
на архитектурах PPC и PPC64 (однако интенсивно не тестировалась).

configure
---------
Добавлена опция `--enable-hidden-server-bins'. Если опция
задана, то в каталог ${prefix}/bin не будут инсталлироваться
программы, не предназначенные для непосредственного запуска
пользователем, например, `new-server', `serve' и т. п. Каталог
${prefix}/bin в этом случае будет содержать только программы
`edit-userlist', `ejudge-control', `ejudge-config' и несколько
других.

contest.xml
-----------
Изменены правила, по которым определяется корневной каталог турнира
(root_dir). Если элемент <root_dir> не установлен или является
относительным путём, то базовым каталогом считается каталог
CONTESTS_HOME_DIR, устанавливаемый опцией --enable-contests-home-dir
скрипта configure. Если элемент <root_dir> не установлен, то корневым
каталогом турнира считается каталог с шестизначным номером турнира в
каталоге CONTESTS_HOME_DIR. Таким образом, в типичной конфигурации
ejudge теперь элемент <root_dir> является необязательным.

Предыдущие версии ejudge требовали, чтобы элемент <root_dir> был задан
и являлся абсолютным путём. Для постепенного перехода к новой
семантике программа `serve-control' выполняет нормализацию значения
элемента при сохранении настроек турнира. То есть, если <root_dir>
установлен, но так, что на самом деле достаточно относительного пути
или вообще значения по умолчанию, при сохранении настроек турнира
значение элемента <root_dir> будет обновлено.

В элемент `contest' добавлен атрибут "personal", который может
принимать значения "yes" или "no". Если атрибут установлен в значение
"yes", этот турнир считается личным. В личном турнире нет понятия
"участник команды", "запасной". При регистрации на личный турнир
личная информация (фамилия, имя и пр.) вводится непосредственно при
редактировании информации о городе, стране и т. п.

Добавлены элементы <team_menu_1_file>, <team_menu_2_file>,
<team_menu_3_file>, <team_separator_file>, которые могут
использоваться для тонкой настройки вида генерируемых страниц.

Добавлены элементы <dir_mode>, <dir_group>, <file_mode>, <file_group>,
которые позволяют задавать группу и права на создаваемые в процессе
создания турнира в программе `serve-control' файлы и каталоги.
Впрочем, данная возможность пока не реализована.

Добавлен элемент <default_locale>, который позволяет задавать язык
турнира по умолчанию. Если значение элемента равно "Russian", "ru",
"ru_RU", то языком по умолчанию будет русский. Это значит, что при
входе в турнир, если явно не выбран язык, будет включён русский язык.
Возможность последующего переключения языка на английский (или любой
другой) сохраняется.

Добавлен элемент <welcome_file>, который позволяет задавать имя файла,
в котором будет находиться текст, выдаваемый пользователю при
попадании на страницу входа в турнир ещё до ввода регистрационного
имени и пароля.

Добавлены элементы <slave_rules>, <run_managed_on>, которые
используются при работе программы `super-serve' в подчинённом режиме.
Элемент <slave_rules> используется как элемент верхнего уровня для
элемента <run_managed_on>. Элемент <run_managed_on> позволяет задавать
имя компьютера, на котором будет работать программа `run' для данного
турнира. Например, следующий фрагмент файла:
<slave_rules>
  <run_managed_on>pc1</run_managed_on>
</slave_rules>
указывает, что тестирование посылок данного турнира будет вестись на
компьютере `pc1'. При этом атрибут "run_managed" для данного турнира
может быть как установлен (тогда тестирование будет вестись
параллельно на двух компьютерах), так и нет.

Добавлен элемент <user_contest>, который позволяет иметь общую
регистрацию пользователей на несколько турниров. Значением элемента
является идентификатор (номер) турнира, который будет основным для
данного турнира. Все пользователи (в том числе привилегированные),
флаги регистрации, регистрационная информация для данного турнира
будет браться из турнира, идентификатор которого указан. Добавление
новых пользователей в текущий турнир будет автоматически добавлять их
в основной турнир. Основной турнир не может ссылаться на какой-либо
другой турнир, то есть у основного турнира элемент <user_contest> не
должен быть установлен.

При создании нового турнира по умолчанию включается флаг нового режима
обслуживания (`new_managed') и запрета турнирного пароля
(`disable_team_password').

userlist.xml
------------
В базу пользователей добавлены поля <exam_id> и <exam_cypher>.
Оба поля локальны для турнира.
<exam_id> может использоваться для задания номера экзаменационного
листа или другой информации (номера зачетной книжки), которая
позволяет однозначно идентифицировать пользователя.
<exam_cypher> может использоваться для задания "шифра" участника в тех
случаях, когда проверяющие не должны знать личных данных участника.

Добавлен флаг регистрации на турнир "INCOMPLETE", который
устанавливается автоматически, если регистрационные данные участника
не соответствуют требованиям, установленным в файле описания турнира,
то есть тогда, когда участник не заполнил какие-либо обязательные для
заполнения поля.

Добавлен флаг регистрации на турнир "DISQUALIFIED", который запрещает
указанному участнику вход в турнир (как и флаг BANNED). Если
установлен флаг "DISQUALIFIED", при попытке входа
дисквалифицированному пользователю будет выдано персональное сообщение
об его дисквалификации.

serve.cfg
---------
Изменены правила, по которым определяется корневной каталог турнира
(root_dir). Если глобальная переменная `root_dir' не установлена
или является относительным путём, то базовым каталогом считается
каталог CONTESTS_HOME_DIR, устанавливаемый опцией
--enable-contests-home-dir скрипта configure. Если глобальная
переменная `root_dir' не установлена, то корневым каталогом
турнира считается каталог с шестизначным номером турнира в
каталоге CONTESTS_HOME_DIR. Таким образом, в типичной конфигурации
ejudge теперь глобальная переменная `root_dir' является
необязательной.

Предыдущие версии ejudge требовали, чтобы глобальная переменная
`root_dir' была задана и являлась абсолютным путём. Для
постепенного перехода к новой семантике программа
`serve-control' выполняет нормализацию значения глобальной
переменной при сохранении настроек турнира. То есть, если `root_dir'
установлена, но так, что на самом деле достаточно относительного пути
или вообще значения по умолчанию, при сохранении настроек турнира
значение `root_dir' будет обновлено.

Новая глобальная переменная `disable_language'. Если значение
переменной не нулевое, при отображении таблицы посылок не
отображается столбец "Язык программирования".

Новая глобальная переменная `problem_tab_size', которая
позволяет устанавливать ширину закладки задачи в режиме
отображения закладок (`problem_navigation'). Ширина закладки
задаётся в пикселях.

Новая глобальная переменная `vertical_navigation', которая
включает отображение закладок задач в одном столбце страницы
(вместо строки). Закладки в этом случае будут расположены
вертикально с правой стороны страницы.

Новая глобальная переменная `disable_virtual_start', которая,
если установлена в ненулевое значение, запрещает пользователям
самостоятельно начинать виртуальный турнир. Виртуальный турнир
для выбранных пользователей может быть начат только
администратором турнира с помощью команды "Force start virtual
contest".

Новая глобальная переменная `disable_virtual_auto_judge'.
Переменная действует только для виртуальных турниров по системе
OLYMPIAD. Если значение переменной не равно 0, то сразу после
окончания виртуального турнира участника тестирование его
решений проводиться не будет. Тестирование решений должно
запускаться администратором турнира.

Новая глобальная переменная `enable_auto_print_protocol'.
Переменная действует только для турниров по системе OLYMPIAD (в
том числе и виртуальных). Если значение переменной не равно 0,
то сразу после окончания турнира для участника на печать будет
отправлен пользовательский протокол экзамена. Для печати
используется принтер, заданный в поле `printer_name' данного
пользователя. Если значение поля `printer_name' не установлено,
используется принтер по умолчанию.

Новая глобальная переменная `stand_fancy_style'. Если её
значение не равно 0, таблица текущих результатов отображается в
более красивом виде.

Новая глобальная переменная `stand_collate_name'. Если значение
переменной не равно 0, то в таблице текущих результатов
сливаются результаты участников с одинаковым именем. То есть, в
этом случае для идентификации участников используется имя
участника, а не его идентификатор. Каждому участнику команды
может быть выдано индивидуальное регистрационное имя (login),
но в итоговой таблице результатов их результаты будут
объединены, при условии, что у всех участников одной команды
одинаковое имя, и у участников, не входящих в команду, другое
имя.

Новая глобальная переменная `stand_enable_penalty', которая
работает в турнирах типа OLYMPIAD. В этом случае при отображении
таблицы текущих результатов будт учитываться штрафное время
участников, равное сумме штрафных времён по каждой задаче.
Штрафное время задачи вычисляется как количество минут,
прошедших от начала турнира до момента последней сдачи задачи,
принятой на проверку.

Новая глобальная переменная `plugin_dir', которая позволяет
задать базовый каталог для подгружаемых модулей задач. Значение
этой переменной по умолчанию - "../plugins", то есть
подгружаемые модули задач должны находиться в каталоге "plugins"
каталога турнира (на одном уровне с каталогами "conf",
"checkers", "tests" и т. д.).

Новые глобальные переменные
`user_exam_protocol_header_file',
`user_exam_protocol_footer_file',
`prob_exam_protocol_header_file',
`prob_exam_protocol_footer_file',
`full_exam_protocol_header_file',
`full_exam_protocol_footer_file'
позволяют задавать начало и конец разных типов файлов печатных
протоколов. Для генерации протокола используется LaTeX, таким
образом, в этих файлах должны находиться корректные заголовки и
окончания LaTeX файлов. `user' - это пользовательский протокол,
который печатается непосредственно по окончанию экзамена.
`prob' - это позадачный протокол. `full' - это полный протокол
(анонимный или неанонимный).

Новая переменная раздела описания задачи
`ignore_compile_errors'. Эта переменная позволяет переопределить
действие глобальной конфигурационной переменной
`ignore_compile_errors' для одной задачи. Например, если
глобальная переменная установлена (то есть ошибки компиляции
игнорируются при подсчёте результатов), строка
ignore_compile_errors = 0
раздела определения задачи позволит не игнорировать ошибки
компиляции только для данной задачи.

Новая переменная раздела описания задачи `ignore_penalty'.
Переменная работает только для турниров OLYMPIAD в режиме,
задаваемом глобальной конфигурационной переменной
`stand_enable_penalty'. Если значение переменной
`ignore_penalty' не равно 0, то для данной задачи штрафные баллы
всегда будут равны 0, независимо от времени её сдачи.

Новая переменная раздела описания задачи `min_tests_to_accept'.
Переменная работает только для турниров OLYMPIAD и позволяет
задать минимальное количество тестов, которое должна пройти
программа при предварительном тестировании, чтобы быть принятой
на проверку. Предположем, что всего предварительных тестов 3, из
них для принятия задачи на проверку достаточно только одного.
Тогда раздел описания задачи может содержать следующие строки:
tests_to_accept = 3
min_tests_to_accept = 1
Значение переменной наследуется от абстрактной задачи.

Новая переменная раздела описания задачи `disable_tab'.
Если значение этой переменной не равно 0, для данной задачи не будет
отображаться закладка (в режиме `problem_navigation').

Новая переменная раздела описания задачи `restricted_statement'.
Если значение этой переменной не равно 0, условие данной задачи
перестанет отображаться после конца турнира или после момента закрытия
сдачи этой задачи (установленного переменной `deadline'). По умолчанию
условия задач продолжают отображаться после окончания турнира или
закрытия сдачи задачи.

Новая переменная раздела описания задачи `advance_to_next'. Данная
переменная работает только для задач типа select-one (выбор одного
ответа из нескольких данных). Если значение переменной не равно 0,
после сдачи задачи (то есть нажатия на кнопку "Submit" или щелчка мыши
на варианте ответа для упрощенного режима (exam_mode)) происходит
автоматический переход на следующую задачу. Значение переменной
наследуется от абстрактной задачи.

Новая переменная раздела описания задачи `lang_time_adj_millis'.
Данная переменная аналогична переменной `lang_time_adj', то есть
позволяет задавать поправку к ограничению времени на тест в
зависимости от языка программирования, но значение поправки выражается
в миллисекундах. Переменная `lang_time_adj_millis' имеет приоритет над
переменной `lang_time_adj', то есть если задано значение первой
переменной, то вторая не используется.

Новая переменная раздела описания задачи `valuer_cmd'.
Данная переменная позволяет задать имя программы оценивания задачи.
Программа оценивания задачи получает на стандартном потоке ввода
последовательность результатов запуска программы на всех тестах и
должна выдать на стандартный поток вывода балл, в который оценивается
данное решение. Более подробно о формате входных данных и результата
для программы оценивания см. в соответствующем разделе. По умолчанию
программы оценивания находятся в том же каталоге, что и проверяющие
программы - в каталоге `checkers'. Значение переменной наследуется от
абстрактной задачи, при этом выполняются форматные подстановки.

Новая переменная раздела описания задачи `valuer_env'.
Эта переменная позволяет задать значения переменных окружения для
программы оценивания, заданной переменной `valuer_cmd'. Формат задания
переменных окружения аналогичен переменной `checker_env'.

Новая переменная раздела описания задачи `xml_file'.
Переменная позволяет задать имя файла с описанием задачи.
Формат этого файла находится в развитии. Текущая версия формата
обсуждается в соответствующем разделе. В перспективе предполагается,
что большинство настроек задачи будут браться из XML-файла задачи, а
секция описания задачи позволит переопределять настройки из XML-файла
и доопределять недостающие. Значение переменной наследуется от
абстрактной задачи, и при этом выполняются форматные подстановки.

Новая переменная раздела описания задачи `plugin_file'.
Данная переменная позволяет задать имя подгружаемого модуля (плагина)
задачи. В текущей версии системы ejudge плагин задачи используется
только для задач типа custom и отвечает за обработку данных формы,
поступающих при сдаче задачи. По умолчанию плагины задач находятся в
каталоге, задаваемом глобальной конфигурационной переменной
`plugin_dir'. Значение переменной наследуется от абстрактной задачи,
при этом выполняются форматные подстановки.

Новые переменные описания задачи `source_header' и `source_footer',
которые позволяют задавать имя файла с текстом, который будет
использоваться в начале и конце сданных решений при компиляции
программы. Например, условие задачи может требовать написания одной
функции или класса, а не целой программы. В этом случае при компиляции
в начало текста программы можно добавить, например, директивы
подключения необходимых библиотек, а в конец программы - главную
функцию программы, которая считывает входные данные из файла,
запускает пользовательскую функцию и записывает результат в выходной
файл. Таким образом на турнирах могут использоваться задачи в стиле
TopCoder. Значения переменных наследуются от абстрактной задачи, при
этом выполняются форматные подстановки. Особенность данных переменных
в том, что форматные подстановки выполняются непосредственно перед
компиляцией программы и, таким образом, могут использовать форматные
преобразования языка программирование. С помощью форматных
преобразования языка программирования можно использовать различные
файлы для разных языков программирования.

Новая переменная описания тестировщика `ignore_stderr'. Если значение
этой переменной не равно 0, то вывод тестируемой программы на
стандартный поток ошибок полностью игнорируется (перенаправляется в
/dev/null). В частности, если тестируемая программа запускается под
dosemu, диагностические сообщения dosemu будут проигнорированы и не
попадут в протокол тестирования. При редактировании настроек турнира с
помощью CGI-программы `serve-control' эта переменная устанавливается
для тестировщика архитектуры dos.

Новая переменная описания тестировщика `time_limit_adj_millis'.
Эта переменная аналогична переменной `time_limit_adj', но позволяет
задавать поправку к ограничению по времени в миллисекундах.

Новая переменная описания тестировщика `secure_exec_type'. Данная
переменная устанавливает тип безопасного запуска для данного
тестировщика. Поддерживаются следующие типы безопасного запуска:
none	никаких дополнительных настроек; используется, в частности,
        для компиляторов dos
static  статически скомпонованный исполняемый файл linux; такие файлы
        получаются в результате компиляции программ на языках gcc, g++, fpc
dll     динамически скомпонованный исполняемый файл linux; такие файлы
        получаются в результате компиляции программ на языках dcc
java    jar-файл с java байт кодом
если значение переменной не установлено, то используется старая
семантика (для совместимости), согласно которой настройки безопасного
запуска определяются значениями переменных `start_cmd', `start_env'.

Преимущество новой схемы в том, что при переключении режима
безопасного запуска с помощью глобальной конфигурационной переменной
`secure_run' вид разделов тестировщиков не изменяется. Кроме того, в
новой схеме не требуется использование программы `capexec' для
безопасного запуска статических исполняемых программ linux, и, таким
образом, лучше обнаруживаются ошибочные ситуации при работе
тестируемой программы.

В принципе, значение этой переменной не предназначено для ручного
редактирования. Правильное значение переменной автоматически
устанавливается программой `serve-control' при сохранении настроек
турнира. 

variant.map
-----------
Поддерживается версия 2 формата файла вариантов заданий. При чтении
поддерживаются файлы и версии 1, но при сохранении турнира в
CGI-программе `serve-control' файл варианта заданий записывается в
версии 2.

Версия 2 отличается от версии 1 следующим образом:
o версия 2 представляет собой корректный XML-файл, то есть в начале
файла присутствуется заголовок <?xml ... ?>, в заголовке используются
XML-комментарии <!-- ... -->;
o версия 2 поддерживает сквозные варианты, то есть для всех задач
турнира у данного участника будет один и тот же вариант. Для этого
используется следующий синтаксис:
LOGIN variant NUM1 [virtual NUM2]
где "variant" и "virtual" - ключевые слова, конструкция virtual NUM2
не обязательная
LOGIN - регистрационное имя пользователя, NUM1 - вариант пользователя,
NUM2 - необязательный виртуальный вариант. Виртуальный вариант - это
номер варианта, который может отображаться участнику. Например, в
турнире может быть 100 виртуальных вариантов по одному на каждого
участника и всего 4 реальных варианта. Впрочем, в текущей версии
ejudge ни реальный, ни виртуальный вариант участнику нигде не
отображается.

problem.xml
-----------
Для описания задач поддерживается новый формат файлов, основанный на
XML. Поддерживается описание свойств задачи (ограничение памяти,
времени, входные и выходные файлы), формулировка задачи в формате HTML
(возможно, на нескольких языках), варианты ответа и правильный ответ.
Полное описание файла смотрите в Wiki-разделе сайта www.ejudge.ru.

edit-userlist
-------------
Полностью поддерживается кодировка UTF8.

Во всех меню работает кнопка ESC для выхода.

Поддерживаются новые поля базы пользователей и новые флаги регистрации
(см. выше).

При редактировании списка пользователей, зарегистрированных на турнир,
поддерживается команда `v' - импорт информации о пользователях из
файла в формате CSV. Далее задаются имя CSV-файла и символ-разделитель
полей. Можно установить значения следующих полей базы данных
пользователей:
e-mail
password
name
team_password
inst
inst_en
instshort
instshort_en
fac
fac_en
facshort
facshort_en
homepage
city
city_en
country
country_en
region
location
spelling
printer_name
exam_id
exam_cypher
languages
phone
В личных турнирах можно дополнительно ко всем предыдущим устанавливать
значения следующих полей:
status
grade
firstname
firstname_en
middlename
middlename_en
surname
surname_en
group
group_en
occupation
occupation_en
birth_date
entry_date
graduation_date
При этом в качестве первичного ключа используется поле login.
Данная команда не позволяет создавать новых пользователей в базе
данных или создавать новые регистрации в турнире. Импорт информации
возможен только для уже существующих пользователей, зарегистрированных
на турнир. При этом статус их регистрации и флаги регистрации могут
быть произвольными.

ejudge-control
--------------
Поддерживается опция командной строки `-f'. Если опция задана, то она
передаётся всем запускаемым программам. Опция `-f' используется, когда
отдельные компоненты системы ejudge завершились аварийно, и не были
удалены файлы управляющих сокетов. В этом случае, если не указать
опцию -f, при запуске системы возникнет ошибка невозможности создания
нового управляющего сокета, так как старый не удалён.

ejudge-setup
------------
Поддерживается кодировка UTF8.

В сгенерированном настроечном скрипте не выполняется вызов `serve' в
режиме настройки.

Поддерживаются опции -u, -g, -C командной строки.

new-server
----------
Поддерживаются следующие новые конструкции в выражении фильтра
посылок:
name		string  имя пользователя (поле `name')
userincomplete  boolean флаг `INCOMPLETE' регистрации пользователя
userdisqualified boolean флаг `DISQUALIFIED' регистрации пользователя
cypher          string  шифр пользователя (поле `cypher')
examinator(ID)  string  пользователь ID является экзаменатором
examinable      boolean данная посылка проверяется вручную

Протокол проверки содержит информацию о максимальном времени работы
программы на всех тестах.

Поддерживается печать на принтере нескольких видов протоколов:
1) Протокол участника: содержит его личную информацию и данные им
ответы.
2) Позадачный анонимный протокол: содержит результаты проверки всех
посылок по некоторой задаче. Посылки идентифицируются шифром
участника.
3) Полный анонимный протокол: содержит результаты проверки посылок
участника. Удастник идентифицируется шифром.
4) Полный протокол: содержит результаты проверки посылок участника.
Участник полностью идентифицирован.

На главную страницу привилегированного пользователя добавлена ссылка
"View who is currently online", ведущая на страницу, отображающую
список пользователей, находящихся в турнире в данный момент. В список
попадают пользователи, которые выполнили какое-либо действие в турнире
за последние 65 секунд.

На страницу просмотра информации об участнике турнира добавлена
возможность дисквалификации участника. Дисквалификация отличается от
"бана" тем, что при дисквалификации можно задать текст (например,
причину дисквалификации), который будет отображаться
дисквалифицированному пользователю при его входе в турнир.

При получении архива посылок на странице "Download runs"
поддерживается структурирование архива по имени пользователя. Имя
файла может содержать имя пользователя, или файлы могут размещаться в
каталоге с именем пользователя. При этом для русских имён в кодировке
koi8-r выполняется их преобразование в translit, так как в противном
случае при развертывании архива в Windows имена искажаются.

При импорте информации о посылках в формате CSV ("Import CSV runs") в
качестве первичного ключа поддерживаются поля:
run_id
login,prob_id
name,prob_id	должно быть уникальным для каждого пользователя в турнире
cypher,prob_id	должно быть уникальным для каждого пользователя в турнире
В случае, если в качестве первичного ключа выступает пара полей, тип
турнира должен быть OLYMPIAD. Модифицироваться будут данные о
последней посылке, принятой на проверку.

Поддерживается возможность создания новых записей о посылках при
импорте информации о посылках в формате CSV. Для этого на странице
подтверждения операции необходимо установить флажок "Create new runs".

Поддерживается возможность назначения экзаменаторов на ручную проверку
задач.

Реализована поддержка регистрации новых пользователей, регистрации
пользователей на турнир и редактирования личных данных в турнире.
Для доступа к новой функциональности используется CGI-программа
`new-register' (которая на самом деле просто является другим именем
для `new-client'). Реализованная функциональность полностью заменяет
собой старую функциональность CGI-программы `register', дальнейшее
использование которой не рекомендуется. Новый сервис регистрации более
удобен, чем старый, имеет больше возможностей и интерфейс, аналогичный
новому клиентскому интерфейсу CGI-программы `new-client'.

Перенаправление на другую страницу сделано с помощью HTTP-поля
Location:, что устраняет 1-секундную задержку при перенаправлении.

Добавлена возможность принудительного начала виртуального турнира для
выделенных пользователей. Для этого необходимо перейти на страницу
просмотра обычных пользователей ("View regular users"), выделить
нужных пользователей и затем нажать на кнопку "Force start virtual
contest". Вместе с возможностью запрещать самостоятельное начало
виртуального турнира пользователем это позволяет реализовывать турниры
в "несколько смен".

Поддерживается установка и сброс флага "Testing finished"
(тестирование окончено). Данный флаг поддерживается только в турнирах
OLYMPIAD. Если он установлен, то отображение некоторых страниц
пользователей (в частности, страницы суммарной статистики по задачам и
протокола тестирования) несколько изменяется.

Поддерживается новый тип задач "CUSTOM". В этом типе задач форма
ответа на задачу должна находиться непосредственно в условии задачи
(кроме кнопки Submit - сдать решение). Для обработки посланной при
сдаче формы используется загружаемый модуль (плагин), который должен
быть указан для каждой такой задачи. Плагин в настоящее время
представляет собой динамическую библиотеку, написанную на языке Си.

Поддерживается генерация базы посылок в формате XML с исходным текстом
программ. Для этого нужно нажать на ссылку "Export XML runs with
source" вверху главной странице администратора. Для уменьшения размера
исходные тексты сжимаются gzip и конвертируются в base64.

Поддерживается режим дорешивания турнира. При активации режима
дорешивания с помощью кнопки "Start upsolving" можно выбрать несколько
режимов дорешивания:
Freeze contest stadings         не обновлять результаты турнира в
                                процессе дорешивания; сданные в
                                процессе дорешивания задачи не будут
                                отражаться в таблице текущих
                                результатов
Allow viewing source code       разрешить просмотр исходных текстов
                                посылок
Allow viewing run report        разрешить просмотр протокола
                                тестирования
Allow viewing full protocol     разрешить просмотр полного протокола
                                тестирования
Disable clarifications          запретить посылку вопросов жюри

На странице информации о турнире пользователей и на главной странице
привилегированных пользователей выводится статистика о посещаемости
турнира.

Многочисленные улучшения пользовательского интерфейса
непривилегированных пользователей (участников турнира). В частности,
при сдаче задачи язык программирования устанавливается в последний
использованный этим участников язык программирования.

Поддерживается описание задачи во внешнем XML-файле. См. далее.

Для задач типа select-one в режиме экзамена (exam_mode) поддерживается
сдача ответа без кнопки "Сдать ответ". При выборе варианта ответа
JavaScript на странице отсылает выбранный вариант. Если по данной
задаче данным пользователем посылок ещё не было, создаётся новая
посылка, а в противном случае изменяется существующая посылка.

Для задач типа select-one, все возможные варианты ответа и правильный
ответ для которой заданы в XML-файле задачи, поддерживается встроенная
проверка. При встроенной проверке не формируется запрос на
тестирование программе `run', а правильный ответ сравнивается с данным
участником непосредственно в сервере. В результате для задачи типа
select-one, заданной XML-файлом, не требуется ни каталога тестов, ни
проверяющей программы, то есть она полностью задаётся XML-файлом.

Корректно поддерживается суффикс CGI-программ, задаваемый с помощью
опции --enable-cgi-suffix скрипта configure.

Поддерживаются новые форматные преобразования:
%Uy	exam_id
%UY     exam_cypher
%VS     SID

super-serve
-----------
Поддерживается новая опция командной строки `-s' (slave mode).
В подчинённом режиме не создаётся управляющий UNIX-сокет и не
обрабатываются веб-запросы на управление турнирами. В XML-файлах
описания турнира игнорируются атрибуты "managed", "new_managed" и
"run_managed". Вместо этого обрабатываются элементы <slave_rules> и
вложенные в них элементы <run_managed_on>. Если имя компьютера,
заданное в элементе <run_managed_on>, совпадает с именем компьютера,
на котором работает `super-serve', то программа `super-serve' будет
контролировать программу тестирования `run' для данного турнира.

Подчинённый режим предназначен для использования на компьютерах, на
которых выполняется тестирование турниров в режиме распределённого
тестирования.

run
---
Удалена поддержка опции командной строки `-T'.

Поддерживается кодировка UTF8.

Поддерживается запуск программ оценивания решений, задаваемых с
помощью конфигурационной переменной `valuer_cmd' раздела описания
задачи.

На стандартный поток ввода программе оценивания подаётся следующая
информация:
N - количество тестов: целое число >=0 и < 100000
результаты запуска программы на каждом тесте задаются тремя числами:
S R T
где S - статус выполнения программы (0 - OK и т. д.),
R - балл, полученный за тест,
T - процессорное время работы на данном тесте (в миллисекундах)

libchecker
----------
Вместо кодировки UCS2 используется кодировка UCS4.
Соответственно, все функции, содержавшие в своём имени ucs2,
теперь содержат ucs4.

Добавлено семейство функций
`checker_{koi8r,cp866,cp1251,iso,mac,utf8}_to_ucs4_str', которые
конвертируют строку, заканчивающуюся байтом 0, (то есть строку
языка Си) из заданной кодировки в UCS4.

Добавлены функции `checker_ucs4_to_utf8_size',
`checker_ucs4_to_utf8r_str' для перевода из UCS4 в UTF8.
Добавлены функции `checker_ucs4_to_koi8',
`checker_ucs4_to_koi8r_str' для перевода из UCS4 в KOI8-R.

Добавлена функция `checker_is_utf8_locale' для проверки,
является ли текущая локаль локалью с кодировкой UTF8.

Заголовочные файлы теперь инсталлируются в каталог
${prefix}/include/ejudge.

cmp_huge_int
------------
Исправлена ошибка при чтении числа.

cmp_yesno
---------
Если установлена переменная окружения `CASE_INSENSITIVE', то
сравнение ответов ведётся без учёта регистра букв.

compile
-------
При запуске компилятора устанавливается ограничение на
процессорное, а не на реальное время. Это необходимо для
корректного завершения компиляторов типа gcc, которые в процессе
компиляции запускают несколько процессоров.

Исправлена ошибка, из-за которой в предыдущей версии ограничение
времени работы компилятора вообще не работало.

Опция `-T' более не поддерживается.

Версия 2.3.2 (r3929) (20070206)
===============================
Много-много изменений и усовершенствований.
Необходимая информация для миграции с версии 2.2.* на текущую
версию находится в файле UPGRADE.RUS.

Поддерживаются новые версии программ и библиотек:
	expat-2.0
	jdk-1.6
	httpd-2.2

configure
---------
CGI-программы по умолчанию устанавливаются в каталог
${prefix}/libexec/ejudge/cgi-bin, а не в ${prefix}/cgi-bin,
поэтому, возможно, потребуется обновить символические ссылки в
каталоге cgi-bin HTTP-сервера.

Поддерживается новая опция `--enable-new-server-socket', которая
позволяет задать путь по умолчанию к сокету для работы с
программой `new-server'.

Поддерживается новая опция `--enable-ajax', которая активирует
поддержку AJAX на стороне сервера в программе `new-server'.
Клиентская часть реализована с использованием DoJo Framework,
которую нужно будет сделать доступной на HTTP-сервере.

Поддерживается новая опция `--with-mysql', которая активирует
поддержку СУБД MySQL для хранения данных. В текущей версии не
реализована.

Поддерживается новая опция `--enable-style-prefix', которая
позволяет задать префикс URL для доступа к стилевым файлам.
По умолчанию опция имеет значение `/ejudge/', то есть URL для
доступа к стилевым файлам имеет вид: HOST/ejudge/file, то есть
стилевые файлы должны располагаться в каталоге ejudge корня HTML
документов веб-сервера. Если стилевые файлы предполагается
разместить в домашнем каталоге пользователя, опция может быть
установлена в /~USER/.

Многие параметры командной строки configure теперь имеют
значения по умолчанию:
--enable-socket-path		/tmp/userlist-socket
--enable-super-serve-socket	/tmp/super-serve-socket
--enable-new-server-socket	/tmp/new-server-socket
--enable-contests-home-dir	/home/judges
--enable-conf-dir		/home/judges/data
--enable-cgi-conf-dir		../cgi-data
Поэтому если значение параметра командной строки совпадает со
значением по умолчанию, его можно опустить.

На архитектуре x86_64-*linux* каталог для библиотечных файлов
автоматически устанавливается в ${exec_prefix}/lib64.

Поддерживается JDK 1.6.

В системе, в которую инсталлируется ejudge, не требуется наличие
программы `uudecode'. Упрощённая версия программы `uudecode'
включена в ejudge.

contest.xml
-----------
Добавлены новые элементы: <login_template>, <copyright_file>,
<priv_header_file>, <priv_footer_file>, <allowed_regions>,
<login_template_options>. Подробное описание новых элементов
находится в Wiki-разделе сайта www.ejudge.ru.

У элемента <contest> добавлены новые аттрибуты:
"new_managed", "assign_logins", "force_registration",
"disable_name", "enable_forgot_password", "exam_mode",
"disable_locale_change". Подробное описание новых элементов
находится в Wiki-разделе сайта www.ejudge.ru.

ejudge.xml
----------
Добавлены новые элементы: <plugin_dir>, <new_server_socket>,
<new_server_log>, <compile_servers>, <plugins>, <plugin>.
Подробное описание новых элементов находится в Wiki-разделе
сайта www.ejudge.ru.

У элемента <plugin> поддерживаются атрибуты: "name", "type",
"load", "default".

serve.cfg
---------
Добавлены новые глобальные конфигурационные переменные:
`disable_user_standings', `problem_navigation',
`appeal_deadline', `statement_dir', `description_file',
`disable_banner_page'.
Глобальная конфигурационная переменная `is_virtual' является
алиасом глобальной конфигурационной переменной `virtual'.
Подробное описание новых элементов находится в Wiki-разделе
сайта www.ejudge.ru.

Добавлены новые конфигурационные переменные задачи:
`manual_checking', `examinator_num', `check_presentation',
`ignore_exit_code', `disable_user_submit',
`disable_submit_after_ok', `max_vm_size', `max_stack_size',
`max_data_size', `enable_language', `require', `statement_file',
`alternatives_file', `type', `alternative', `stand_attr'.
Конфигурационная переменная `output_only' является алиасом
переменной `type'.
Подробное описание новых элементов находится в Wiki-разделе
сайта www.ejudge.ru.

Поддерживаются следующие типы задач:
	standard
	output-only
	short-answer
        text-answer
	select-one
	select-many

Добавлена новая конфигурационная переменная `memory_limit_type'
секции описания тестера. Переменная может принимать следующие
значения:
	default
	dos
	java

Переделана поддержка ограничения задач по памяти. Теперь
значение указывается в переменной max_vm_size или max_stack_size
в разделе описания задачи, а не в разделе тестировщика.

runs.log
--------
Изменен формат хранения записи о посылки. Теперь одна запись
занимает 128 байт и хранит больше информации.

test.inf
--------
Поддерживаются новые конфигурационные переменные:
	exit_code
	check_stderr

userlist.xml
------------
Поддерживаются следующие новые элементы в файле базы
пользователей: <region>, <birth_date>, <entry_date>,
<graduation_date>.

Поддерживаются новые атрибуты: "ssl", "role", "cnts_last_login",
"info_create", "recovery".

javac
-----
Поддерживается приём на тестирование java-программ без
ограничения имени класса.

new-server
----------
Реализована новая программа new-server, которая должна заменить
сервер турниров `serve'. new-server поддерживает обслуживание
нескольких турниров одновременно, реализует новый интерфейс
пользователя и т. д. Программа `serve' теперь считается
устаревшей и не рекомендуется к использованию в новых турнирах.

В форматных преобразованиях поддерживается %Mr, %Ur, означающее
поле "Region".

Поддерживаются виртуальные турниры по системе OLYMPIAD. Полное
тестирование решений участника производится непосредственно
после истечения его времени решения, либо когда он явно завершит
виртуальный турнир.

Администратору турнира доступны новые команды (по сравнению с
командами, доступными администратору в старой программе `serve'):
	"Clear displayed runs"
	"Ignore displayed runs"
	"Disqualify displayed runs"
	"Add new runs in CSV format"
	"Download runs"

Для непривилегированных пользователей поддерживается механизм
восстановления паролей.

При отображении страниц непривилегированных пользователей
используется JavaScript (AJAX). Впрочем, реализация AJAX неполна
и находится в активной разработке.

Поддерживается отображение условий задач на странице сдачи
решений.

Поддерживаются задачи с выбором правильного ответа из
предъявленных (как в тестах).

new-client
----------
Новый CGI-клиент для работы с программой `new-server'. Программа
`new-client' (и символические ссылки на неё: new-master,
new-judge и т. д.) заменяет старых CGI-клиентов `team',
`master', `judge'.

Пользовательский CGI-интерфейс для непривилегированных
пользователей радикально переделан.

Пользовательский интерфейс для привелегированных пользователей в
целом не изменился. Отдельные элементы переработаны и добавлено
много новых команд.

libchecker
----------
Строки, передаваемые в функции библиотеки, теперь имеют тип
`char' а не `unsigned char' для лучшей совместимости с C++.

Добавлены типы данных для разбора и хранения S-выражений.

Новая функция `checker_read_buf_2':
char *checker_read_buf_2(
	int ind,             // номер потока для чтения
	const char *name,    // имя считываемого параметра
	int eof_error_flag,  // 1, если EOF является ошибкой
	char *sbuf,          // адрес фиксированного буфера
	size_t ssz,          // размер фиксированного буфера
	char **pdbuf,        // адрес переменной для расш. буфера
	size_t *pdsz);       // адрес размера для расш. буфера
Функция считывает слово из указанного потока ввода. Перед
чтением пропускаются пробельные символы, слово представляет
собой последовательность непробельных символов, после которого
идёт конец файла или пробельный символ. Этот пробельный символ
остаётся во входном потоке.

Слово может считываться либо в буфер фиксированного размера,
либо в расширяемый буфер, либо в оба буфера. Чтобы задать чтение
в буфер фиксированного размера необходимо указать ненулевые
значения параметров `sbuf', `ssz'. Чтобы задать чтение в
расширяемый буфер необходимо указать ненулевые значения
параметров `pdbuf', `pdsz'.

Если заданы параметры только для буфера фиксированного размера,
слово считывается в него. Если считываемое слово не помещается в
буфер, работа проверяющей программы завершается с ошибкой
"Presentation error" или "Check failed" в зависимости от номера
потока.

Если заданы параметры только для расширяемого буфера, слово
считывается в него.

Если заданы параметры и буфера фиксированного размера, и
расширяемого буфера, то чтение сначала ведётся в буфер
фиксированного размера. Если считываемое слово превышает размер
буфера, то далее используется расширямый буфер.

В любом случае функция возвращает указатель на начало буфера, в
который считано слово, или NULL, если был достигнут конец файла
и параметр `eof_error_flag' равен 0.

Новая функция `checker_read_file_f':
void checker_read_file_f(
	FILE *f,         // поток для чтения из файла
	char **pbuf,     // буфер для чтения
	size_t *psize);  // размер файла после чтения
Функция считывает содержимое файла в память. Корректно
поддерживаются бинарные файлы. После содержимого файла в памяти
добавляется нулевой байт, таким образом, если файл текстовый, то
со считанным в память содержимым файла можно работать как с
текстовой строкой языка C.

Все функции вида `checker_read_team_*' переименованы в
`checker_read_out_*'. Старые имена сохранены для обратной
совместимости. Функция `checker_team_eof' переименована в
`checker_out_eof', функция `checker_team_close' переименована в
`checker_out_close'.

Новая функция: `checker_out_eoln':
void checker_out_eoln(int lineno);
функция пропускает все пробельные символы, кроме `\n'. Если
далее следует символ `\n' функция завершается. В противном
случае выдаётся "Presentation error".

Улучшена работа функций чтения целых чисел из потоков. Теперь
корректно обрабатывается переполнение при чтении.

Новые функции checker_eq_{float,double,long_double}_abs:
int checker_eq_TYPE_abs(TYPE v1, TYPE v2, TYPE eps);
Функции сравниваеют два числа заданного типа с плавающей точкой
с указанной абсолютной точностью. Если два числа равны с
указанной точностью, то функция возвращает значение 1. В
противном случае функция возвращает значение 0.

Новая функция `checker_read_sexpr':
checker_sexpr_t checker_read_sexpr(int ind);
Функция считывает S-выражение с указанного потока.

Новая функция `checker_eq_sexpr':
int checker_eq_sexpr(checker_sexpr_t l_corr, checker_sexpr_t l_out);
Функция сравнивает два S-выражения. Возвращается 1, если два
S-выражения равны, и 0 - в противном случае.

Новые функции `checker_{koi8r,cp866,cp1251,iso,mac}_to_ucs2':
int checker_CHARSET_to_ucs2(int c);
Функция конвертирует символ в указанной русской кодировке в
символ в кодировке ucs2.

Новые функции `checker_{koi8r,cp866,cp1251,iso,mac,utf8}_to_ucs2':
unsigned short *checker_CHARSET_to_ucs2_buf(
	const char *str,
	unsigned short* buf,
	size_t size);
Функции ковертируют строку `str' в указанной кодировке в строку
в кодировке UCS2. Длина конвертируемой строки задаётся
параметром `size', таким образом, в строке могут находится
нулевые байты. Для строк в кодировке UTF8 символы с кодом
больше 0xffff не поддерживаются. Адрес буфера результата
задаётся параметром `buf'. Буфер результата должен иметь
достаточный размер, то есть sizeof(short) * size байт.
Функция возвращает указатель на начало буфера результата, то
есть значение параметра `buf'.

Новая функция `checker_ucs2_tolower':
int checker_ucs2_tolower(int c);
Функция переводит символ в кодировке ucs2 в нижний регистр.
Поддерживаются пока только английские и русские буквы.

Новая функция `checker_ucs2_tolower_buf':
unsigned short *checker_ucs2_tolower_buf(
	unsigned short *buf,
	size_t size);
Функция переводит строку в кодировке ucs2 в нижний регистр.
Поддерживаются пока только английские и русские буквы.
Параметр `buf' задаёт адрес начала строки, а параметр `size' -
её размер.

Новая функция `checker_strcmp_ucs2':
int checker_strcmp_ucs2(
	const unsigned short *s1,
	const unsigned short *s2);
Функция сравнивает две строки в кодировке ucs2. Две строки
должны завершаться значением 0 типа `unsigned short' (по
аналогии со строками C).

Новая функция `checker_eq_str_rus_ucs2':
int checker_eq_str_rus_ucs2(
	const char *s1,
	const unsigned short *s2);
Функция сравнивает строку `s1' в одной из русских кодировок со
строкой `s2' в кодировке ucs2. Основное применение этой функции
- сравнение строки в русской кодировке, выведенной тестируемой
программой `s1', с заданной литеральной строкой `s2'. Для этого
литеральная строка должна быть предварительно конвертирована в
кодировку ucs2.

Новая функция `checker_eq_str_rus_ucs2_nocase':
int checker_eq_str_rus_ucs2_nocase(
	const char *s1,
	const unsigned short *s2);
Функция работает аналогично функции `checker_eq_str_rus_ucs2',
но сравнивает без учёта регистра букв.

Стандартные проверяющие программы
cmp_{float,double,long_double},
cmp_{float,double,long_double}_seq обрабатывают переменную
окружения `ABSOLUTE'. Если переменная `ABSOLUTE' установлена (в
произвольное значение), то сравнение выполняется в режиме
абсолютной погрешности, а не относительной, как по умолчанию.

Проверяющая программа `cmp_huge_int' сравнивает числа
произвольного размера (без ограничения 1 мб).

Новая стандартная проверяющая программа `cmp_sexpr' сравнивает
два S-выражения на равенство.

Новая стандартная проверяющая программа `cmp_yesno' сравнивает
ответы вида `Yes' и `No'. При этом в случае несовпадения
регистров букв результата работы программы и эталонного ответа
выдаётся "Presentation error".

compile
-------
Программа `compile' корректно работает в режиме демона. При
получении сигнала `SIGHUP' программа корректно перезапускает
себя, таким образом перечитывая конфигурационный файл. Кроме
того поддерживаются следующие новые параметры командной строки:
	-i	режим инициализации. В этом режиме создаются все
	        необходимые каталоги, затем `compile' завершает
                работу. Режим инициализации используется при
                установке и настроке системы ejudge.
	-D	режим демона.
	-u UID	задать uid пользователя для работы. Может
	        использоваться, только если `compile' запущена
                пользователем root. Используется при установке и
                настройке системы ejudge.
	-g GID	задать gid группы пользователей для работы.
		Может использоваться, только если `compile'
                запущен пользователем root. Используется при
                установке и настройке системы ejudge.
	-C DIR	в начале работы перейти в указанный каталог DIR.

compile-control
---------------
Новая программа для управления программой `compile' из командной
строки. Особенно полезна, когда программа `compile' работает в
режиме демона.
Использование:
	compile-control [stop|restart]

edit-userlist
-------------
При просмотре зарегистрированных пользователей доступна команда
`o', которая копирует информацию о пользователе из одного
турнира в другой.

ejudge-control
--------------
Новая программа для управления системой ejudge в целом из
командной строки. Поддерживаются следующие опции командной
строки:
	-u UID	задать uid пользователя для работы. Может
	        использоваться, только если `ejudge-control' запущен
                пользователем root.
	-g GID	задать gid группы пользователей для работы.
		Может использоваться, только если `ejudge-control'
                запущен пользователем root.
Поддерживаются следующие основные команды:
	start	запустить все необходимые программы (userlist-server, 
		super-serve, compile, new-server, job-server) в
                режиме демона.
	stop	завершить все программы, работающие в режиме демона.

job-server
----------
Корректно поддерживается `sendmail' для отправки писем.

Обрабатывается сигнал SIGHUP и вызывает перезапуск программы.

Поддерживаются новые команды "stop" и "restart".

Поддерживаются следующие опции командной строки:
	-u UID	задать uid пользователя для работы. Может
	        использоваться, только если `job-server' запущена
                пользователем root. Используется при установке и
                настройке системы ejudge.
	-g GID	задать gid группы пользователей для работы.
		Может использоваться, только если `job-server'
                запущен пользователем root. Используется при
                установке и настройке системы ejudge.
	-C DIR	в начале работы перейти в указанный каталог DIR.

super-serve
-----------
При редактировании вариантов поддерживаются новые команды:
	"Clear variants"
	"Random variants"

Поддерживаются следующие опции командной строки:
	-D	работать в режиме демона
	-u UID	задать uid пользователя для работы. Может
	        использоваться, только если `super-serve' запущена
                пользователем root. Используется при установке и
                настройке системы ejudge.
	-g GID	задать gid группы пользователей для работы.
		Может использоваться, только если `super-serve'
                запущен пользователем root. Используется при
                установке и настройке системы ejudge.
	-C DIR	в начале работы перейти в указанный каталог DIR.

job-server-control
------------------
Новая программа для управления демоном `job-server' из командной
строки. Использование:
	job-server-control [stop|restart]

new-server-control
------------------
Новая программа для управления сервером турниров `new-server' из
командной строки. Использование:
	new-server-control [stop|restart]

new-server-cmd
--------------
Новая программа для работы с сервером турниров `new-server' из
командной строки. Эта программа аналогична программе
`serve-cmd', которая работает со старым сервером турниров
`serve'. В настоящий момент реализованы следующие команды:
	login
	team-login
	user-login
	observer-login
	examiner-login
	chief-examiner-login
	coordinator-login
	judge-login
	admin-login
	master-login
	logout
	write-xml-runs
	export-xml-runs
	dump-runs
	dump-problems
	soft-update-stand
	suspend-testing
	resume-testing
	judge-suspended-runs
	has-transient-runs
	team-run-status
	run-status
	dump-source
	team-dump-source
	dump-clar
	team-dump-clar
	get-contest-name
	get-contest-type
	submit-run
	team-submit-run
	import-xml-runs
	dump-runs
	dump-master-runs
	dump-report
	full-import-xml-runs
По сравнению с программой `serve-cmd' не реализованы следующие команды:
	dump-team-report
	dump-standings
	dump-all-users

super-serve-control
------------------
Новая программа для управления демоном `super-serve' из командной
строки. Использование:
	super-serve-control [stop|restart]

userlist-server
---------------
Реализована поддержка загружаемых модулей для хранения базы
пользователей. В текущий момент поддерживается единственный
(встроенный) модуль: хранение базы в XML-файле. В разработке
находится загружаемый модуль хранения базы в MySQL.

Корректно поддерживается `sendmail' для отправки писем.

Поддерживаются следующие новые опции командной строки:
	-u UID	задать uid пользователя для работы. Может
	        использоваться, только если `userlist-server' запущена
                пользователем root. Используется при установке и
                настройке системы ejudge.
	-g GID	задать gid группы пользователей для работы.
		Может использоваться, только если `userlist-server'
                запущен пользователем root. Используется при
                установке и настройке системы ejudge.
	-C DIR	в начале работы перейти в указанный каталог DIR.

userlist-server-control
------------------
Новая программа для управления демоном `userlist-server' из командной
строки. Использование:
	userlist-server-control [stop|restart]

Версия 2.3.1 (r3198) (20060705)
===============================
Изменена структура базы данных пользователей. Теперь большинство
полей информации о пользователе сделаны локальными для турнира.
Например, поле `name' (имя пользователя) для одного и того же
пользователя (точнее, для одного и того же регистрационного
имени) может быть разным в каждом турнире. Раньше все поля
информации о пользователе были независящими от турнира, и,
например, изменение того же самого поля `name' для одного
турнира автоматически приводило к изменению отображении
информации о пользователе во всех других турнирах, даже уже
прошедших.

Для совместимости с уже накопленной базой пользователей
существующая информация о пользователях относится к так
называемому "турниру по умолчанию" (он для удобства имеет
идентификатор 0). Эта информация используется, когда для
пользователя не задана информация, относящаяся именно к данному
турниру. Однако, как только существующий пользователь (или
администратор) изменяет информацию о пользователе в рамках
некоторого турнира, для этого пользователя создается копия всей
информации, относящаяся именно к этому турниру, так что
измененные данные станут специфичными для этого турнира, а
данные для турнира по умолчанию останутся прежними.

Из доступных для редактирования обычным пользователем полей
общими (независимыми от турнира) являются только поля `login',
`e_mail' и `password'. Все остальные поля являются привязанными
к турниру.

Поле `read_only' информации о пользователе теперь означает, что
информация о пользователе не может изменяться ни для какого
турнира. Кроме того, пользователем не может изменяться и общая
информация о пользователе, кроме регистрационного пароля.

Добавлено поле `cnts_read_only', означающее, что пользователем
не может быть изменена информация о пользователе для данного
турнира (за исключением пароля участника).

Версия 2.2.0 (20060609)
=======================
То же самое, что версия 2.1.49. С этого момента в ветке 2.2
будут только исправляться ошибки. Все новые возможности будут
добавляться в ветку 2.3, которая по окончанию разработки станет
версией 3.0.

Версия 2.1.49 (20060609)
========================

Добавлена поддержка нового "языка" - текстовых файлов (txt). Это
позволяет сдавать на проверку обычные текстовые файлы (например,
в output-only задачах). Результатом компиляции текстового файла
является скрипт, который всегда возвращает код завершения 1.
Для тонкой настройки, какие языки могут использоваться для сдачи
каждой задачи можно использовать конфигурационную переменную
`disable_language' раздела описания задачи.

serve
-----
В генерируемый файл журнала посылок в XML-формате добавлена
дополнительная информация о времени турнира. В журнал посылок во
внешнем XML-формате добавлена информация об имени турнира.

Поддерживается автоматическая генерация журнала посылок как во
внутреннем, так и во внешнем формате через заданные интервалы
времени. С помощью новой глобальной конфигурационной переменной
`external_xml_update_time' задается интервал времени в секундах
между генерацией XML-файла во внешнем формате, а с помощью новой
глобальной конфигурационной переменной `internal_xml_update_time' 
задается интервал времени в секундах между генерацией XML-файла
во внутреннем формате. Файлы имеют следующие пути:
<contest_home>/var/status/dir/external.xml
<contest_home>/var/status/dir/internal.xml

super-serve, serve-control
--------------------------
Поддерживается редактирование новых глобальных конфигурационных
переменных `external_xml_update_time' и `internal_xml_update_time'.

testlib
-------
Текст сообщения, который выводится при вызове `quit' выводится
на стандартный поток ошибок, а не на стандартный поток вывода
(для возможности работы чекера в режиме оценивания решения).

run
---
Исправлена ошибка, из-за которой решения для DOS-компиляторов не
работали в режиме перенаправления стандартных потоков, когда run
запускался под управлением super-serve.

serve
-----
Поддерживаются задачи, в которых балл за задачу (или за каждый
тест) выставляется проверяющей программой. Раньше чекер давал
ответ ДА/НЕТ для каждого теста, а балл назначался исходя из
настроек задачи. Теперь чекер может оценивать тест в любое
количество баллов от 0 и до максимального балла за данный тест.

Для этого в разделе определения задачи поддерживается
конфигурационная переменная `scoring_checker'. Если эта
переменная установлена в значение 1, то балл за тест будет
проставляться чекером.

В турнирах по системе KIROV/OLYMPIAD чекер оценивает каждый тест
по отдельности, и суммарный балл за задачу равен сумме оценок
чекера по каждому тесту. В турнирах по системе MOSCOW балл за
задачу равен оценке чекера первого непройденного теста (в этом
случае, разумнее всего, чтобы у задачи был единственный тест).

Оценивающий чекер должен работать следующим образом. Код
завершения чекера, как обычно, обозначает результат проверки:
0       OK
4       PE
5       WA
все остальные коды интерпретируются как Check failed.

Если чекер вернул OK, то тест/задача всегда получает полный балл.
Если чекер вернул PE, то тест/задача получает 0.
Если чекер вернул WA, то на стандартный поток вывода он должен
записать единственное число - балл за тест/задачу. Кроме числа и
пробельных символов в стандартный поток вывода ничего выводиться
не должно (иначе - Check failed). Число должно быть >= 0 и
меньше максимального балла за задачу. Если выведено другое число
- Check failed.

run
---
Поддерживаются задачи с оценивающим чекером.

super-serve, serve-control
--------------------------
Поддерживается редактирование переменной `scoring_checker'
раздела описания задачи.

Поддерживается редактирование переменной `disable_language'
раздела описания задачи.

run
---
Для турниров по системе MOSCOW поддерживаются "скачки" в баллах,
то есть при оценивании задачи промежуточные баллы могут
пропускаться. Пусть для некоторой задачи есть 10 тестов,
максимальный балл равен 2, при этом решения оцениваются либо в
0 (если пройдены не все тесты), либо в 2 балла. Тогда переменная
`score_tests' для данной задачи должна быть установлена
следующим образом:
score_tests = "11"
то есть решение, которое прошло 10 тестов должно оцениваться в 1
балл, но такое решение (неявно) оценивается в два балла, поэтому
будет выбрана оценка 2 балла.
Таким образом, последовательность номеров тестов образует
неубывающую последовательность (то есть несколько подряд номеров
тестов могут быть равны - в этом случае будет выбран
максимальный балл.

serve
-----
Поддерживаются "output-only" задачи, то есть задачи, в которых
сдается файл с ответом, а не файл с исходным текстом программы.
Для этого добавлена конфигурационная переменная `output_only'
раздела описания задачи. Эта переменная может быть установлена и
в описании абстрактной задачи и будет наследоваться. Значение по
умолчанию - 0. Если переменная установлена в 1, соответствующая
задача является "output-only". Для output-only задач все равно
выполняется стадия "компиляции" и "запуска" (см. ниже).

compile
-------
Поддерживаются "output-only" задачи. В этом случае "компиляция"
программы заключается в копировании файла "исходного текста" (а
на самом деле ответа) в файл результата компиляции. Выбранный
язык в этом случае не играет никакой роли, так как компилятор
соответствующего языка не запускается.

run
---
Поддерживаются "output-only" задачи. В этом случае у задачи
должен быть единственный тест. "Запуск на выполнение"
заключается в копировании "исполняемого" файла в файл результата
работы, после чего он проверяется обычным образом с помощью
запуска проверяющей программы. 

super-serve, serve-control
--------------------------
Поддерживается редактирование переменной `output_only' раздела
описания задачи.

serve, master, judge
--------------------
При отправке сообщения участникам до начала турнира
администратор или судья может указать, что сообщение должно
стать видимым обычным участникам только после начала турнира.

execute
-------
Новая программа для запуска тестируемых программ из командной
строки. Программа `execute' позволяет установить все виды
ограничений (по времени, по памяти, по доступным операциям),
которые поддерживаются системой ejudge.

libchecker
----------
Библиотека портирована под Windows с использованием компилятора
gcc (gcc -mno-cygwin). В результате компиляции получаются .DLL и
.LIB файлы, которые могут использоваться любыми компиляторами
для Windows.

Версия 2.1.48 (20060430)
========================

contest.xml
-----------
Добавлен новый элемент `main_url'. Это элемент позволяет
задавать URL для главной страницы турнира и используется в
письме с регистрационными данными, отправляемом при регистрации
нового пользователя на турнир, например
<main_url>http://acm.univ.ru/contests/acm2006</main_url>

Добавлен новый атрибут `send_passwd_email'. Если этот атрибут
установлен в "yes", то письмо с регистрационными данными нового
пользователя высылается даже в случае, когда включена упрощенная
регистрация на турнир.

ejudge.xml
----------
Добавлены новые элементы `server_name', `server_name_en',
`server_main_url'. Элемент `server_name' позволяет задать имя
сервера, на котором установлена система ejudge, например
<server_name>Сервер турниров университета</server_name>
Элемент `server_name_en' позволяет задать имя сервера на
английском языке. Оно используется, когда при регистрации выбран
английский язык, например
<server_name_en>The university contest server</server_name_an>
Элемент `server_main_url' позволяет задать URL на сервере для
данной инсталляции системы ejudge в целом, например,
<server_main_url>http://acm.univ.ru/contests</server_main_url>
Значения этих элементов используются при отправке письма с
регистрационными данными при регистрации новых пользователей в
случае, когда идентификатор турнира не указан.

userlist-server
---------------
Изменены стандартные шаблоны писем, посылаемых при регистрации
нового пользователя. В письмах используются элементы
<server_name>, <server_name_en>, <server_main_url> файла
ejudge.xml и элементы <name>, <name_en>, <main_url> файла
конфигурации турнира contest.xml.

Поддерживается атрибут "send_passwd_email" файла contest.xml.

userlist-server, edit-userlist
------------------------------
В базу данных пользователей добавлено новое поле
`simple_registration', которое устанавливается в значение "yes",
если пользователь был зарегистрирован с помощью упрощенной
процедуры регистрации. Значение данного поля может быть изменено
администратором с помощью программы `edit-userlist'.

super-serve, serve-control
--------------------------
Поддерживается редактирование элемента <main_url> и атрибута
"send_passwd_email" файла конфигурации турнира contest.xml.

team, serve
-----------
Корректно отображаются бинарные файлы в команде "View source".

serve
-----
В раздел описания языка программирования файла serve.cfg
добавлено новая конфигурационная переменная `content_type'. Если
эта переменная установлена, то по команде "Download source"
CGI-программ master или judge или по команде "View source" будет
генерироваться страница с указанным значением поля
"Content-Type". Это поле полезно для "языков" с бинарным
представлением. Например, если в системе есть язык "Microsoft
Word", то для него можно установить поле content_type так:
content_type = "application/msword"

Имя файла при загрузке исходного текста формируется корректно
даже для бинарных языков.

serve, compile
--------------
Максимальное количество одновременно поддерживаемых языков
программирования увеличено до 100.

super-serve, serve-control
--------------------------
Поддерживается редактирование полей `binary' и `content_type'
раздела описания языка программирования.

Исправлена ошибка, из-за которой было невозможно редактирование
поля `acm_run_penalty'.

ejudge-setup
------------
Поддерживается редактирование начальных значений элементов
<server_name>, <server_name_en>, <server_main_url> файла
ejudge.xml.

Версия 2.1.47 (20060419)
========================

contest.xml
-----------
Добавлен новый атрибут `simple_registration'. Если этот атрибут
установлен, действует упрощенная схема регистрации пользователей
на турнир. Новому пользователю не высылается письмо со
сгенерированным паролем, а пароль отображается при успешной
регистрации, после чего можно перейти к редактированию личных
данных.

super-serve, serve-control
--------------------------
Поддерживается редактирование атрибута `simple_registration'
файла конфигурации турнира `contest.xml'.

Поддерживается редактирование новой глобальной конфигурационной
переменной `always_show_problems'.

Пользователи, для которых установлены биты привилегий,
автоматически регистрируются на турнир, и для них
устанавливается флаг невидимости.

При редактировании битов полномочий поддерживается выбор из
предопределенных наборов: "Observer", "Judge", "Master".

serve, team
-----------
Добавлена глобальная конфигурационная переменная
`always_show_problems'. Если переменная установлена в 1, то
ссылка на условия задач доступна участникам турнира до его
начала.

Добавлена конфигурационная переменная секции определения задачи
`acm_run_penalty'. Данная конфигурационная переменная действует
только в режимах турнира ACM или MOSCOW и позволяет задавать
штраф за неправильные попытки до сдачи задачи. Стандартное
значение штрафа, используемое на всех соревнованиях по системе
ACM равно 20. Например, можно установить значение штрафа в 0,
чтобы принимать задачи по системе "сдана/не сдана".
Переменная `acm_run_penalty' может быть определена в абстрактной
задаче, в это случае ее значение наследуется.

register
--------
Поддерживается упрощенный режим регистрации на турнир,
задаваемый с помощью атрибута `simple_registration'.

serve
-----
Исправлены ошибки отображения таблицы сводной статистики по
задачам на странице участника в режиме турнира KIROV.

ejudge-setup
------------
В конец генерируемого настроечного скрипта добавлена команда
пробного запуска программы `serve' для тестового турнира 1.

super-serve, serve-control
--------------------------
Редактирование конфигурационной переменной задачи `test_sets'
поддерживается.

Поддерживается новый стандартный чекер `cmp_huge_int'.

Исправлены несколько ошибок в процедуре проверки тестов задачи и
рекомпиляции чекера (команда "Check contest settings").

Поддерживается редактирование глобальной конфигурационной
переменной `always_show_problems'.

Поддерживается редактирование конфигурационной переменной задачи
`acm_run_penalty'.

userlist-server
---------------
Член команды не может быть удалён, если соответствующая команда
отмечена как "только для чтения" (read-only).

libchecker
----------
Добавлены новые функции `checker_in_eoln', `checker_team_eoln',
`checker_corr_eoln', которые проверяют, что в соответствующем
входном файле находится символ конца строки текста '\n'. При
этом пропускаются все пробельные символы и считывается сам
символ '\n'.

Добавлена новая стандартная проверяющая программа
`cmp_huge_int', которая сравнивает число в выходном файле
тестируемой программы и число в файле с правильным ответом.
Максимальная длина сравниваемых чисел - 1Мб. При этом перед
числом игнорируются пробельные символы, игнорируется знак '+',
если он присутствует. В числе игнорируются ведущие нули.

serve-cmd
---------
Добавлены новые команды team-dump-source, team-dump-clar,
team-run-status.
serve-cmd CONTEST-ID team-dump-source SESSION-FILE RUN-ID
	Выводит на стандартный поток вывода текст посылки
        RUN-ID. В турнире должен быть разрешен просмотр
        исходного кода посылок, кроме того, пользователь должен
        быть автором этой посылки.
serve-cmd CONTEST-ID team-run-status SESSION-FILE RUN-ID
	Выводит на стандартный поток вывода строку статуса
        посылки RUN-ID. Пользователь должен быть автором данной
        посылки.
serve-cmd CONTEST-ID team-dump-clar SESSION-FILE CLAR-ID
	Выводит на стандартный поток вывода текст сообщения
        CLAR-ID. Пользователь должен иметь право просматривать
        данное сообщение.

Версия 2.1.46 (20060319)
========================

configure
---------
Опция --with-g++ переименована в --with-gpp, потому что, как
оказалось, configure не распознает `+' в названиях опций.

serve
-----
В выражениях фильтра посылок поддерживаются два новых предиката:
latest[(N)]
	Равен TRUE, если после текущей посылки или посылки с
        номером N нет посылки того же пользователя по той же
        задаче, которая имеет статус "OK", "Partial solution"
        или "Accepted for testing". Предикат может
        использоваться в турнирах системы OLYMPIAD для отбора
        посылок, подлежащих тестированию.
afterok[(N)]
	Равен TRUE, если до текущей посылки или посылки с
        номером N есть посылка того же пользователя по той же
        задаче, которая имеет статус "OK". Предикат может
        использоваться в турнирах по системе ACM, KIROV, MOSCOW
        для отбора посылок, не влияющих на результат, или
        наоборот, для отбора посылок, влияющих на результат.

Для турниров по системе OLYMPIAD полностью реализовано "теневое"
тестирование решений. Когда турнир работает в режиме приёма
решений на проверку, администратор турнира может протестировать
полностью либо отдельную посылку (команда "Full rejudge" в
выпадающем меню изменения статуса данной посылки), либо
выбранное множество посылок (команда "Full rejudge displayed
runs"). Выбранные посылки будут протестированы на полном наборе
тестов и результаты тестирования будут доступны администратору
турнира и судьям турнира и будут отражены в текущей таблице
результатов. Таким образом протестированные посылки не требуют
перетестирования после завершения приема решений. Таким образом,
даже в ходе турнира по системе OLYMPIAD можно накапливать
результаты, которые по завершению турнира станут
окончательными. Во время турнира, пока турнир находится в режиме
приема решений на проверку, участникам доступна только
информация о предварительном тестировании посылки. Как только
турнир будет переключен в режим окончательного тестирования,
участники получат доступ к полным результатам тестирования.

Полное "теневое" тестирование ведётся с пониженным приоритетом
так, что посылки от пользователей будут обрабатываться в первую
очередь. Однако, текущая версия системы ejudge не позволяет
тестировать по одному тесту, то есть посылка тестируется на всех
тестах и тестирование посылки не может быть прервано посередине.
То есть, если полное тестирование посылки занимает заметное
время, это может создать очередь из посылок, принимаемых на
предварительное тестирование.

serve, master
-------------
Добавлена поддержка команды "Full rejudge displayed runs" для
теневого тестирования решений в турнирах по системе OLYMPIAD в
режиме приема решений на проверку.

run
---
Добавлены две глобальные конфигурационные переменные файла
`serve.cfg': skip_accept_testing, skip_full_testing.
Если первая переменная установлена, то программа `run' будет
игнорировать все запросы на тестирование на предварительных
тестах для турниров по системе OLYMPIAD. Если вторая переменная
установлена, программа `run' будет игнорировать все запросы на
полное тестирование для турниров по системе OLYMPIAD.

Корректно реализовано игнорирование пакетов. Игнорируемые пакеты
теперь не приводят к зацикливанию `run', если они не удаляются
из каталога обмена. Пакет `QUIT' (принудительное завершение)
теперь имеет наивысший приоритет.

capexec, libdropcaps.so
-----------------------
Исправления для поддержки ядер 2.6.*.

serve, team
-----------
Добавлена новая глобальная конфигурационная переменная
`disable_failed_test_view'. Если эта переменная установлена в 1,
то на странице участника не отображается номер первого
неправильного теста. Переменная работает только для турниров по
системе ACM или MOSCOW.

serve-control, super-serve
--------------------------
Поддерживается редактирование глобальной конфигурационной
переменной `disable_failed_test_view'.

Версия 2.1.45 (20060121)
========================

Обновлено руководство по инсталляции системы в файлах INSTALL и
INSTALL.RUS.

ejudge.xml
----------
В конфигурационный файл добавлены новые элементы
<job_server_log>, <job_server_spool>, <job_server_work>, которые
используются программой `job-server'. Элементы могут быть
опущены, тогда их значение будет установлено по умолчанию по
значению элемента <var_dir>.
Элемент <job_server_log> позволяет задать имя файла, который
будет использоваться как журнал работы программы `job-server' в
режиме демона. Если программа `job-server' запущена не в режиме
демона, сообщения об её работе выводятся на стандартный поток
вывода, и значение этого элемента не используется. Если элемент
<job_server_log> не задан, используется значение
$<var_dir>/job_server.log, где $<var_dir> - значение элемента
<var_dir> файла ejudge.xml.
Элемент <job_server_spool> позволяет задать каталог для очереди
заданий программы `job-server'. Если элемент <job_server_spool>
не задан, используется значение $<var_dir>/jspool, где
$<var_dir> - значение элемента <var_dir> файла ejudge.xml.
Элемент <job_server_work> позволяет задать рабочий каталог для
программы `job-server' и порождаемых ей заданий. Если элемент
<job_server_work> не задан, используется значение
$<var_dir>/jwork, где $<var_dir> - значение элемента <var_dir>
файла ejudge.xml.

contest.xml
-----------
Добавлена поддержка новых элементов <cf_notify_email>,
<clar_notify_email>, <daily_stat_email>. Они используются
сервером турнира `serve' для отсылки уведомлений о некоторых
событиях, возникающих в турнире.
<cf_notify_email> позволяет задать адрес (или адреса) e-mail, по
которым будет направляться уведомление, если тестирование
посылки завершается ошибкой, то есть посылка получает статус
CHECK_FAILED.
<clar_notify_email> позволяет задать адрес (или адреса) e-mail,
по которым будет направляться уведомление о поступлении в турнир
вопроса от участника.
<daily_stat_email> позволяет задать адрес (или адреса) e-mail,
по которым будет направляться письмо с суточной статистикой
работы турнира.

userlist-server
---------------
В базу данных участников в записи о регистрациях на турниры
добавлено поле "date" для хранения времени регистрации на
турнир.

libchecker
----------
Функции `checker_read_file_by_line' и
`checker_read_file_by_line_f' не используют больше стек для
размещения временного буфера. Это позволяет считывать в память
большие файлы.

serve
-----
Добавлена новая конфигурационная переменная `enable_compilation'
секции описания задачи файла `serve.cfg'. Переменная действует
только тогда, когда для задачи установлена переменная
`disable_testing'. Если в этом случае переменная
`enable_compilation' установлена в 1, то присланные решения по
этой задаче компилируются. Если компиляция завершилась успешно,
то для посылки устанавливается статус "Accepted for testing"
(RUN_ACCEPTED), а в противном случае устанавливается статус
"Compilation error" (RUN_COMPILE_ERR).

Поддерживается отсылка уведомлений по электронной почте в случае
возникновения ошибки CHECK_FAILED и в случае поступления вопроса
от участника турнира. Адрес, по которому отсылаются сообщения,
задаётся с помощью элементов <cf_notify_email>,
<clar_notify_email> соответственно.

Поддерживается новая глобальная конфигурационная переменная
`contest_finish_time' файла `serve.cfg'. Эта переменная
позволяет установить астрономическое время окончания турнира в
случае, когда его длительность не ограничена.

Поддерживается рассылка суточной статистики о турнире по адресу,
указанному в элементе <daily_stat_email> файла contest.xml.

База сообщений (clar.log) теперь хранится в бинарном формате.
При запуске `serve' перекодирует при необходимости базу из
старого формата в новый. В бинарном формате добавлена поддержка
IPv6 адресов (пока не используется), 64-битного типа time_t,
и поля `j_from', в котором хранится идентификатор пользователя,
пославшего сообщение от имени Жюри.

При просмотре сообщений привилегированным пользователем (в
CGI-программах `master' или `judge') выводится имя пользователя,
от имени которого было послан ответ судей участнику или
сообщение всем участникам.

super-serve
-----------
При генерации конфигурационного файла турнира `serve.cfg', если
включена поддержка языка Java, в параметрах запуска
java-программ на тестирование языковое окружение (переменная
окружения LANG) устанавливается в "C" (другими словами, все
языковые настройки отменяются). Это важно для того, чтобы числа
с плавающей точкой считывались и печатались в стандартном
формате.

Поддерживается редактирование новых элементов <cf_notify_email>,
<clar_notify_email>, <daily_stat_email> конфигурационного файла
contest.xml.

Поддерживается редактирование глобальной конфигурационной
переменной `contest_finish_time' файла `serve.cfg'.

super-serve, serve-control
--------------------------
Поддерживается редактирование новой конфигурационной переменной
`enable_compilation' раздела описания задачи файла `serve.cfg'.

run
---
Если проверяющая программа завершается по тайм-ауту из-за
сигнала, или возвращает нестандартный код завершения, в файл
вывода проверяющей программы добавляется диагностическое
сообщение.

job-server
----------
Новая программа, которая предназначена для выполнения задач из
очереди "неприоритетных" задач. Сервер турнира или сервер
пользователей может поставить задачу на выполнение в очередь
программе `job-server', если задача не должна быть выполнена
немедленно, и успешность выполнения задачи не очень важна.
Например, сервер турнира `serve' использует очередь программы
`job-server' для отсылки уведомлений о получении вопроса от
участника, о возникновении ошибки проверки задачи и для отсылки
суточной статистики.

Пока программа `job-server' поддерживает только отсылку
сообщений по электронной почте. Планируется добавление функции
проигрывания звука или голосовых сообщений, чтобы снять эту
функцию с программы `run'.

Программа `job-server' поддерживает опцию -D - работа в режиме
демона. В этом режиме программа уходит в фоновый режим и
записывает все диагностические сообщения в журнал работы.

job-server-cmd
--------------
Новая программа для управления сервером "неприоритетных" задач.
Текущая версия поддерживает только команду отправления сообщения
по электронной почте.

job-server-cmd mail CHARSET SUBJ FROM TO TEXT
здесь CHARSET - кодировка сообщения,
SUBJ - тема сообщения,
FROM - адрес отправителя,
TO - адрес получателя,
TEXT - текст сообщения.
Обратите внимание, что текст сообщения должен передаваться как
аргумент командной строки.

Версия 2.1.44 (20051207)
========================
В данной версии исправлены незначительные ошибки предыдущих
версий, а также внесены непринципиальные улучшения.

libchecker
----------
Проверяющая программа теперь может не устанавливать макрос
NEED_INFO в требуемое значение. Если этот макрос не установлен,
его значение полагается равным 0.

Библиотека может использоватся с проверяющими программами,
которые, на самом деле, её не используют. То есть командная
строка вида
gcc checker.c -o checker -lchecker
позволяет получить работоспособный чекер, если checker.c
является обычной программой на Си, а не программой, написанной
специально для libchecker.

В библиотеку добавлена новая функция `fatal_read':
void fatal_read(int streamno, char const *format, ...);
Эта функция печатает сообщение, переданное в качестве аргумента,
а затем завершает работу либо с кодом ошибки "Check failed",
если streamno равен 0 или 2, либо с кодом ошибки "Presentation
error", если streamno равен 1. Эта функция может использоваться
в функциях, которые читают входные данные сложной структуры для
сообщения об ошибке во входных данных.

serve
-----
Если в протоколе тестирования участника астрономическое время
оказывается меньше процессорного (такое может быть, так как
процессорное время округляется вверх до значения, кратного
периоду системного таймера), то процессорное время показывается
и как астрономическое.

Поддерживается новая команда `SRV_CMD_SUBMIT_RUN_2', в которой
задача и язык программирования задаются не своими
идентификаторами, а своими короткими именами (short_name). Эта
команда полезна в случае, когда идентификаторы задачи и языка
программирования неизвестны.

serve, team
-----------
Если файл, переданный в качестве исходного текста посылки,
содержит нулевой байт (то есть вместо исходного текста программ
был послан, например, исполняемый файл), и указанный язык
программирования не разрешает посылку бинарных данных, выводится
сообщение о неправильном формате посылаемых данных. В предыдущих
версиях сервер просто закрывал соединение, а клиент печатал
"Unexpected EOF from server".

serve-cmd
---------
Все команды поддерживают следующие опции:
	--ip IP
		Позволяет задать IP-адрес, который будет передан
                на сервер. По умолчанию этот адрес равен 127.0.0.1.
	--ssl
		Позволяет установить флаг защищенного
                соединения, который будет передан на сервер. По
                умолчанию этот флаг и так установлен.
	--no-ssl
		Позволяет сбросить флаг защищенного соединения,
                который будет передан на сервер. По умолчанию
                флаг защищенного соединения установлен.
	--session
		Указывает, что параметр, задающий имя файла, в
                котором находится идентификатор сессии, теперь
                непосредственно задаёт идентификатор сессии, то
                есть вместо имени файла задаётся 64-битное число
                в 16-ричном виде. В случае команд `login' или
                `team-login' эта опция задаёт, что идентификатор
                сессии будет напечатан на стандартный поток вывода.
Опции могут указываться в любом месте командной строки после
команды. Например,
serve-cmd 1 login --ip 192.168.0.1 --no-ssl session user password

Поддерживаются новые команды `team-login', `team-logout',
`team-submit-run'. Все опции, описанные выше, применимы и к этим
командам, поэтому далее они явно описываться не будут.
serve-cmd CONTEST-ID team-login SESSION-FILE USER PASSWORD
	Вход непривилегированного пользователя, аналогичный
        входу с помощью CGI-программы `team'. Указанный
        пользователь должен иметь право участия в указанном
        турнире (то есть быть зарегистрированным, не быть
        заблокированным и т. д.). В результате генерируется
        новый идентификатор сессии, который должен
        использоваться при дальнейших операциях от имени этого
        пользователя. Идентификатор сессии записывается в файл
        SESSION-FILE или печатается на стандартный поток вывода,
        если указана опция --session.
serve-cmd CONTEST-ID team-logout SESSION-FILE
	Завершение работы непривилегированного пользователя.
	Идентификатор сессии уничтожается.
serve-cmd CONTEST-ID team-submit-run SESSION-FILE PROBLEM LANGUAGE [SRC-FILE]
	Посылка решения непривилегированным пользователем.
	Действуют все ограничения, накладываемые на посылку
        решений, как и в CGI-программе `team'. PROBLEM - это
        короткое имя задачи, LANGUAGE - это короткое имя языка
        программирования, SRC-FILE - это файл с исходным текстом
        решения. Имя файла может быть опущено или задано как
        `-', тогда отсылаемый текст будет прочитан со
        стандартного потока ввода. В случае успешной отсылки,
        номер посылки печатается на стандартный поток вывода.

userlist-server
---------------
Поддерживается новая команда `ULS_FIX_PASSWORD' для коррекции
паролей.

edit-userlist
-------------
В группу команд модификации флагов пользователя `f' добавлена
команда "Fix passwords", которая корректирует пароль участника в
соответствии с новыми правилами проверки пароля: если турнирный
пароль (team_password) установлен, то он копируется в
регистрационный пароль (register_password). Эта команда может
быть применена ко множеству выделенных участников некоторого
турнира.

С помощью подкоманды "Clear field" может быть очищен турнирный
пароль одного участника или выбранной группы участников.

super-serve
-----------
Поддерживается автоматическая компиляция проверяющих программ,
написанных на C++ (спасибо Artem Melentev).

Версия 2.1.43 (20051117)
========================
Исправлен URL системы ejudge. Теперь это http://www.ejudge.ru.
Поддерживается компилятор GCC 4.0.*. Если при конфигурировании
системы в качестве компилятора по умолчанию используется GCC
4.0, то для компиляции включается флаг -Wno-pointer-sign.
Устранены все предупреждения компилятора, выдаваемые при уровне
оптимизации -O2.

Система ejudge портирована на Linux/x86_64.

fpc/testlib.pas
---------------
Исправлены ошибки работы с Unix-концами строк (Victor Matyukhin).

delphi/testlib.pas
------------------
Адаптирована последняя версия testlib Андрея Станкевича.

contest.xml
-----------
Поддерживаются два новых элемемента: <user_name_comment> и
<allowed_languages>. Элемент <user_name_comment> позволяет
задать произвольный HTML-текст, который будет выводиться в форме
регистрации на турнир CGI-программы register рядом с полем ввода
имени команды. Данный текст, например, может содержать
инструкции по выбору названия команды и пр. Элемент
<allowed_languages> позволяет ограничить языки и среды
программирования, которые пользователи могут указывать при
регистрации на турнир. Если элемент не задан, то поле
`Programming languages' регистрационной формы по прежнему будет
обычной строкой ввода. Если же элемент установлен, то вместо
строки будет выведена форма, в которой перечислены все
допустимые языки, каждый язык может быть помечен.
В элементе <allowed_languages> языки должны перечисляться через
запятую, например:
<allowed_languages>Borland C/C++, Borland Pascal, Delphi</allowed_languages>

Добавлена поддержка флага DISABLE_MEMBER_DELETE. Если этот флаг
установлен, в форме регистрации на турнир не отображается кнопка
удаления члена команды.

Добавлены новые элементы <users_table_format>, <users_table_format_en>,
<users_table_legend>, <users_table_legend_en>. Они позволяют
управлять видом таблицы зарегистрированных пользователей
турнира, выводимой CGI-программой `users'. Элементы <users_table_legend>, 
<users_table_legend_en> позволяют определять вид
строки-заголовка таблицы зарегистрированных пользователей. В
элементах задаётся текст, который будет выводиться в колонках
таблицы со второй по предпоследнюю. Первая колонка таблицы
всегда называется "NN" (порядковый номер в списке), а последняя - 
"Status" (или "Статус") - статус регистрации участника. Колонки
отделяются друг от друга символом "|". Например,
<users_table_legend>Id|Имя участника|Учебное заведение|Факультет</users_table_legend>
означает, что таблица зарегистрированных пользователей будет
содержать столбцы "NN", "Id", "Имя участника", "Учебное заведение",
"Факультет", "Статус". Элемент <users_table_legend_en>
используется, когда выводится таблица зарегистрированных
пользователей на английском языке (то есть locale_id == 0), а
элемент <users_table_legend> используется для вывода таблицы
зарегистрированных пользователей на локальном языке
(locale_id != 0) (например, русском). Если значение элемента не
установлено, то используется вид таблицы по умолчанию.

Элементы <users_table_format>, <users_table_format_en>
определяют информацию, которая будет выведена для каждого
участника турнира в таблице зарегистрированных участников. В
элементе могут использоваться форматные преобразования
(см. далее), а описание столбцов разделяются символом
"|". В первом столбце таблицы всегда выводится порядковый номер
участника в таблице, а в последнем столбце - статус
регистрации. Например, спецификация
<users_table_format>%Ui|%Un|%Ut|%Uf</users_table_format>
означает, что таблица будет состоять из 6 столбцов: порядкового
номера, идентификатора пользователя, имени пользователя, краткой
формы записи учебного заведения, краткой формы записи
факультета, статуса регистрации. Элемент <users_table_format_en>
используется для вывода таблицы на английском языке (то есть при
locale_id == 0), а элемент <users_table_format> - для вывода
таблицы на локальном языке, когда locale_id != 0 (например,
русском). Если значение элемента не установлено, используется
вид таблицы по умолчанию.

Элементы <users_table_format>, <users_table_legend> должны быть
либо оба установлены, либо не установлены, причём должны
описывать одинаковое количество столбцов. Аналогичное правило
действует для элементов <users_table_format_en>,
<users_table_legend_en>. Если правило нарушается, используется
вид таблицы по умолчанию. Из <users_table_format>,
<users_table_format_en> может быть установлен только один
элемент, тогда для другого будет использоваться значение по
умолчанию.

serve
-----
Добавлена поддержка новой глобальной конфигурационной переменной
`users_on_page' файла `serve.cfg'. Если эта переменная
установлена в положительное значение, таблица результатов
турнира будет разбиваться на страницы по заданному числу
пользователей на страницу. Пока разбиение на страницы работает
только для турниров по системе KIROV.

Добавлены новые глобальные конфигурационные переменные
`stand_fail_attr' и `stand_trans_attr'. Эти переменные позволяют
определить атрибут ячейки таблицы текущих результатов, если для
данного пользователя и для данной задачи есть посылки в
состоянии "Check failed" и "Compiling..." или "Running..."
соответственно. Атрибут `stand_fail_attr' может использоваться
для наглядного выделения проблемных мест турнира, а атрибут
`stand_trans_attr' может использоваться для индикации того, что
в данный момент посылки тестируются, что может привести к
изменению таблицы.

Добавлена новая глобальная конфигурационная переменная
`stand_show_att_num' файла конфигурации турнира `serve.cfg'.
Данная переменная действует только в режимах турнира KIROV или
OLYMPIAD. Если эта переменная установлена в ненулевое значение,
в таблице результатов турнира для каждого участника и каждой
задачи рядом с количеством баллов за задачу отображается
количество попыток. Если задача была полностью сдана, то
отображается количество попыток до момента первой сдачи задачи
(включая и успешную попытку). Если задача не сдана полностью,
отображается текущее количество попыток по данной задаче.

Добавлена новая глобальная конфигурационная переменная
`stand_sort_by_solved' файла конфигурации турнира `serve.cfg'.
Данная переменная действует только в режимах работы турнира
KIROV или OLYMPIAD. Если эта переменная установлена в ненулевое
значение, то сортировка участников для распределения их по
местам ведётся по убыванию решенных задач, и затем по убыванию
количества баллов (в обычной системе KIROV сортировка ведётся
только по убыванию количества набранных баллов).

Добавлена новая конфигурационная переменная `lang_time_adj'
раздела определения задачи файла `serve.cfg'. Данная
конфигурационная переменная позволяет задавать поправку к
максимальному времени тестирования на 1 тесте (time_limit) в
зависимости от языка программирования. Поправка задаёт
дополнительное время в секундах и должна быть больше 0 и не
больше 100. конфигурационная переменная `lang_time_adj' может
быть задана несколько раз, определяя таким образом поправки для
нескольких языков в данной задаче. Каждая спецификация поправки
имеет вид:
LANG=ADJ
где LANG - это короткое имя языка программирования, а ADJ -
целое число. Например,
lang_time_adj="dcc=1"
lang_time_adj="java=10"
Для некоторой задачи задаёт, что для программ для Delphi время
тестирования должно быть увеличено на 1 секунду по сравнению с
заданным в поле `time_limit', а для программ на Java - на 10
секунд.

Добавлена новая глобальная конфигурационная переменная
`disable_submit_after_ok' конфигурационного файла `serve.cfg'.
Если эта переменная установлена в 1, то участникам запрещается
посылка уже сданных задач. Сданные задачи не появляются в списке
задач, доступных для сдачи.

Добавлена новая конфигурационная переменная `skip_testing'
раздела описания задачи. Если для некоторой задачи эта
переменная установлена, программа `run' будет пропускать запросы
на тестирование данной задачи, однако запрос будет доступен
другим программам `run'. Данная конфигурационная переменная
может использоваться для балансировки нагрузки по задачам между
несколькими программами `run' на нескольких проверяющих
компьютерах совместно с директивами условной компиляции,
например:
[problem]
short_name = "Z"
@if host == "host1"
skip_testing
@endif
В этом случае программа `run', запущенная на компьютере "host1",
будет игнорировать запросы на тестирование задачи "Z".

Добавлен новый тип турнира "Moscow". Этот тип турнира -
модификация турниров типа ACM. В отличие от ACM, в турнире
Moscow задачи могут оцениваться в произвольшое количество баллов
>= 1. Тестирование посылки ведется до первой неудачи, и в
зависимости от количества прошедших тестов посылка оценивается в
0, 1, 2 ... N баллов. Полное количество баллов за задачу
определяется конфигурационной переменной `full_score'. Для
каждой задачи, которая оценена более чем в 1 балл, должна быть
определена конфигурационная переменная `score_tests'. Если
задача оценивается в N баллов, переменная `score_tests' должна
задавать N-1 число. Числа разделяются пробелами. Каждое число
задает номер теста, числа должны образовывать возрастающую
последовательность, причем последнее число должно быть меньше
общего количества тестов по данной задаче. K-е число в этом
списке задаёт количество тестов, которые должна пройти посылка,
чтобы быть оцененной в K баллов. Например, для следующей
спецификации:
full_score = 5
score_tests = "10 20 30 40"
и общего количества тестов по задаче 50, если задача прошла 0-9
тестов, то она оценивается в 0 баллов, если 10-19 тестов - то в
1 балл, 20-29 тестов - 2 балла, 30-39 тестов - 3 балла, 40-49
тестов - 4 балла, 50 тестов - 5 баллов.

Добавлены новые конфигурационные переменные для управления
внешним видом таблицы текущих результатов участников.
Глобальная конфигурационная переменная `stand_row_attr'
позволяет определять атрибуты строк таблицы. Эти атрибуты
используются, когда к строке таблицы неприменимы другие
атрибуты, задаваемые глобальными конфигурационными переменными
`stand_v_row_attr', `stand_r_row_attr', `stand_u_row_attr',
`stand_self_row_attr', `stand_contestant_status_attr'.
Конфигурационная переменная `stand_row_attr' должна быть
определена либо 5, либо 6 раз, задавая таким образом массив из 5
или 6 атрибутов. Массив используется следующим образом:
stand_row_attr[0] - это атрибут строки заголовка таблицы,
stand_row_attr[1], stand_row_attr[2] - атрибуты четных и
нечетных строк таблицы соответственно,
stand_row_attr[3], stand_row_attr[4] - атрибуты четных и
нечетных строк таблицы соответственно, эти две группы атрибутов
используются попеременно при изменении количества решенных
задач у команд.
stand_row_attr[5] (если определен) - атрибуты строк таблицы, в
которых отображается суммарная информация по всем участникам
турнира. Пример использования переменной `stand_row_attr':
stand_row_attr = " bgcolor=\"#cccccc\" valign=\"top\""
stand_row_attr = " bgcolor=\"#eeffff\" valign=\"top\""
stand_row_attr = " bgcolor=\"#ddffff\" valign=\"top\""
stand_row_attr = " bgcolor=\"#ffeeff\" valign=\"top\""
stand_row_attr = " bgcolor=\"#ffddff\" valign=\"top\""
stand_row_attr = " bgcolor=\"#cccccc\" valign=\"top\""

Для совместимости со стандартным видом таблицы в предыдущих
версиях системы, если ни глобальная конфигурационная переменная
`stand_table_attr', ни глобальная конфигурационная переменная
`stand_row_attr' не установлена, переменная `stand_row_attr'
устанавливается в значение " border=\"1\"".

Добавлена глобальная конфигурационная переменная
`stand_page_table_attr', которая позволяет задавать атрибут
таблички ссылок на страницы текущих результатов, если включено
разбиение таблицы текущих результатов на страницы.

Добавлена глобальная конфигурационная переменная
`stand_page_row_attr', которая позволяет задавать атрибуты строк
таблицы ссылок на страницы текущих результатов, если включено
разбиение таблицы текущих результатов на страницы. Эта
переменная должна быть определена 4 раза, формируя массив
атрибутов из 4 элементов. Массив используется следующим образом:
stand_page_row_attr[0] - атрибут первой строки таблицы: номера
страниц,
stand_page_row_attr[1] - атрибут второй строки таблицы: места
stand_page_row_attr[2] - атрибут третьей строки таблицы: число
решенных задач (набранный балл для Moscow),
stand_page_row_attr[3] - атрибут четвертой строк таблицы:
набранные баллы (штрафной балл для Moscow, ACM).
Пример использования переменной:
stand_page_row_attr = " bgcolor=\"#ccddcc\" valign=\"top\" align=\"center\""
stand_page_row_attr = " bgcolor=\"#ccddcc\" valign=\"top\""
stand_page_row_attr = " bgcolor=\"#ccddcc\" valign=\"top\""
stand_page_row_attr = " bgcolor=\"#ccddcc\" valign=\"top\""

Добавлена глобальная конфигурационная переменная
`stand_page_col_attr', которая позволяет задавать атрибуты
столбцов таблицы ссылок на страницы таблицы текущих результатов,
если включено разбиение таблицы текущих результатов на страницы.
Эта переменная должна быть определена 2 раза, формируя массив
атрибутов из 2 элементов. Массив используется следующим образом:
stand_page_col_attr[0] - атрибут первого столбца таблицы
(названия строк),
stand_page_col_attr[1] - атрибут всех остальных столбцов
таблицы. Пример использования переменной:
stand_page_col_attr = ""
stand_page_col_attr = " width=\"60\""

Добавлена новая глобальная конфигурационная переменная
`stand_page_cur_attr', которая позволяет задавать атрибуты
текста "Page N of M.", выводимого, когда включено разбиение
таблицы текущих результатов на страницы.

В протоколе тестирования участника отображается астрономическое
время тестирования задачи.

userlist
--------
В базе данных пользователей изменена поддержка поля `Phone' в
данных по пользователю и данных по членам команды. Ранее
поддерживался элемент <phones>, в котором находился список
элементов <phone>, однако эта структура нигде не использовалась
и её редактирование не поддерживалось. Теперь элемент <phones>
удалён, а <phone> представляет собой обычную строку.
Редактирование <phone> поддерживается всеми программами.

userlist-server
---------------
Исправлена ошибка, появившаяся в предыдущей версии, связанная с
некорректным удалением cookie при смене пароля.

Поддерживается редактирование поля `phone'.

Изменена политика аутентификации пользователей CGI-программы
`team'. Теперь если у турнира установлен флаг
`disable_team_password', то проверяется только регистрационный
пароль (поле `register_password'), а если флаг
`disable_team_password' не установлен, то проверяется только
пароль участника (поле `team_password'), а регистрационный
пароль игнорируется. В предыдущих версиях проверялись оба
пароля и принимался любой.

Данное изменение может привести к тому, что участники не смогут
войти в работающий турнир, если для турнира был неправильно
установлен флаг `disable_team_password', для тех участников,
которые поменяли пароль в CGI-программе `team'. Для устранения
этой проблемы администратор турнира должен вручную исправить
соответствующие поля данных участника (например, скопировать
пароль участника в регистрационный пароль) с помощью команды `o'
программы edit-userlist.

Добавлены новые команды протокола для операций с паролями одного
участника: генерация случайного пароля и копирование одного
пароля в другой. См. команды `o', `y' программы edit-userlist.

register,userlist-server
------------------------
При регистрации нового пользователя проверяется статус отсылки
e-mail сообщения. Если отсылка завершилась неуспешно,
пользователю возвращается соответствующий код ошибки.

Программа `register' обрабатывает код новый код ошибки
регистрации и отображает соответствующее диагностическое
сообщение.

super-serve
-----------
Улучшена поддержка турниров с вариантными задачами. Ссылка на
страницу редактирования таблицы вариантов добавлена в заголовок
страниц редактирования настроек турниров. В конец страницы
редактирования таблицы вариантов добавлены стандартные кнопки
сохранения изменений. Исправлена ошибка некорректной работы
команды смены варианта.

serve-control, super-serve
--------------------------
Поддерживается редактирование новых полей XML-файла конфигурации
турнира: элементов <user_name_comment>, <allowed_languages>,
флага DISABLE_MEMBER_DELETE.

Поддерживается редактирование глобальной конфигурационной
переменной `users_on_page' файла `serve.cfg'.

Поддерживается редактирование новых элементов XML-файла
конфигурации турнира: <users_table_format>,
<users_table_format_en>, <users_table_legend>,
<users_table_legend_en>.

Поддерживается редактирование новой глобальной конфигурационной
переменной `stand_show_att_num'.

Поддерживается редактирование новой глобальной конфигурационной
переменной `stand_sort_by_solved'.

Поддерживается редактирование конфигурационной переменной
`lang_time_adj' раздела описания задачи. При редактировании
поправки для всех языков для данной задачи записываются в одной
строке и разделяются пробелами, например:
dcc=1 java=10

Поддерживается редактирование новой глобальной конфигурационной
переменной `disable_submit_after_ok'.

Исправлена ошибка, из-за которой терялся первый тест в случае,
когда `super-serve' не хватало прав для модификации теста при
выполнении команды "Check contest settings".

При создании нового турнира файл `serve.cfg' корректно
добавляется в систему контроля версий.

run
---
Исправлена ошибка в поддержке стандартных проверяющих программ
для вариантных задач.

Если `run' работает не в управляемом режиме, то пакеты
принудительного завершения игнорируются. В предыдующих версиях
`run' аварийно завершал работу.

Управляющий пакет содержит новое поле `time_limit_adj', которое
содержит поправку к ограничению времени для данного
тестирования. Новое поле обрабатывается программой `run'.
Поправка ко времени тестирования должна быть больше 0 и не
больше 100 и задаёт дополнительное время в секундах.

register
--------
Поддерживается редактирование полей `phone' в форме регистрации
на турнир. Поддерживаются новые элементы <user_name_comment>,
<allowed_languages> и флаг DISABLE_MEMBER_DELETE
конфигурационного файла описания турнира. Форма регистрации на
турнир упрощена за счёт удаления полей, значение которых никак
не использовалось (show_email, show_login, use_cookies_default).

edit-userlist
-------------
Поддерживается редактирование полей phone.

В меню пользователей и турниров поддерживается команда 't'
(Toggle) - инвертировать все флаги выделения. Если ни один
пользователь или турнир не был выделен, то в результате
выполнения этой команды будут выделены все. Поддерживается
команда '0' - сбросить все флаги выделения.

Поддерживается выделение нескольких турниров. Для этого в меню
турниров используются команды ':', 't', '0'.

Поддерживается регистрация одного пользователя сразу на
выделенное множество турниров. Поддерживается регистрация
выделенного множества пользователей на выделенное множество
турниров.

В меню пользователей, зарегистрированных на турнир, добавлена
команда 'f', позволяющая установить или сбросить некоторые поля
данных пользователя. Сбросить можно поля Read-only, Never-clean,
Location. Установить (в значение true) можно поля Read-only,
Never-clean. Команда может применяться как к одному
пользователю, так и к нескольким выделенным пользователям.

При редактировании данных пользователей поддерживаются две новых
команды, применимые к паролям:
  `o' - сгенерировать случайный пароль. Курсор должен находиться
        либо на поле регистрационного пароля (Reg password),
        либо на поле пароля участника (Team password).
  `y' - скопировать текущий пароль в другой пароль. Если курсор
        находится на регистрационном пароле, то он копируется в
        пароль участника, и наоборот, если курсор находится на
        пароле участника, то он копируется в регистрационный
        пароль. 

users,userlist-server
---------------------
При выводе таблицы зарегистрированных участников турнира
поддерживается возможность управления информацией, выводимой в
таблице, с помощью новых элементов <users_table_format>,
<users_table_format_en>, <users_table_legend>,
<users_table_legend_en> XML-конфигурационного файла турнира
(см. выше).

При выводе элементов таблицы могут использоваться следующие
форматные преобразования:
%Ui	идентификатор пользователя (id)
%Un	имя пользователя (name)
%Ul	регистрационное имя (login)
%Ue	адрес email (email)
%Uz	регистрационный пароль (если он не был зашифрован)
%UZ	турнирный пароль (если он не был зашифрован)
%Uc	город (city)
%UC	город (англ) (city_en)
%Uo	страна (country)
%UO	страна (англ) (country_en)
%Ut	аббревиатура учебного заведения (inst_short)
%UT	аббревиатура учебного заведения (англ) (inst_short_en)
%Uu	учебное заведение (inst)
%UU	учебное заведение (англ) (inst_en)
%Uf	аббревиатура факультета (fac_short)
%UF	аббревиатура факультета (англ) (fac_short_en)
%Ud	факультет (fac)
%UD	факультет (англ) (fac_en)
%UL	размещение (location)
%Up	имя назначенного принтера (printer_name)
%Uh	домашняя страница WEB (homepage)
%UH	телефон (phone)
%UP	языки программирования (languages)

Кроме того, с помощью групп форматных преобразований %UM
выводится информация об участниках команды:
%UMp	информация об основных участниках
%UMr	информация о запасных
%UMa	информация о руководителях
%UMc	информация о тренерах
%UMg	информация о гостях
Номер участника специфицируется сразу же после буквы типа
участника десятичным числом, начиная от 1, например,
%UMp2 - второй основной участник, %UMc1 - первый тренер.
Далее специфицируется поле в записи об участнике:
f	имя (firstname)
F	имя (англ) (firstname_en)
m	отчество (middlename)
M	отчество (англ) (middlename_en)
s	фамилия (surname)
S	фамилия (англ) (surname_en)
g	группа, класс (group)
G	группа, класс (англ) (group_en)
e	email
h	домашняя страница (homepage)
o	должность (occupation)
O	должность (англ) (occupation_en)
u	учебное заведение (inst)
U	учебное заведение (англ) (inst_en)
t	аббревиатура учебного заведения (inst_short)
T	аббревиатура учебного заведения (англ) (inst_short_en)
a	аббревиатура факультета (facshort)
A	аббревиатура факультета (англ) (facshort_en)
d	факультет (fac)
D	факультет (англ) (fac_en)
H	телефон
b	статус (status)
B	статус (англ) (status_en)
c	номер курса, класса (grade)
C	номер участника в команде (number)
Например, %UMp1s обозначает фамилию первого основного участника
команды.

ejudge-setup
------------
При генерации конфигурационного файла ejudge.xml у создаваемого
пользователя-администратора устанавливаются биты полномочий
MASTER_LOGIN и JUDGE_LOGIN.

Версия 2.1.42 (20050930)
========================
В данной версии исправлены ошибки процесса инсталляции системы и
внесены некоторые улучшения.

ejudge-setup
------------
При генерации инсталляционного скрипта генерируется команда
создания символической ссылки на программу serve-control.

Makefile
--------
Улучшена обработка ситуации, когда в операцонной системе не
установлены утилиты локализации xgettext и т. д.

userlist-server
---------------
Все cookie пользователя сбрасываются после смены им пароля.

super-serve,serve-control
-------------------------
Поддерживается редактирование переменной `checker_env' раздела
описания задачи.

Поддерживаются новые стандартные чекеры (см. ниже).

При редактировании содержимого заголовочных файлов и стартового
скрипта автоматически выполняется перекодирование из DOS-формата
файлов в Unix-формат, так как браузер пересылает данные в
DOS-формате текста (т. е. с концами строк \r\n).

CGI-программы master и judge открываются в новом окне браузера.

Поддерживается редактирование переменной `variant_num' раздела
описания задач. Поддерживается редактирование таблицы
распределения вариантов для вариантных задач. Поддерживается
проверка настроек турнира для вариантных задач.

libchecker
----------
Добавлены функции сравнения вещественных чисел.

int checker_eq_double(double v1, double v2, double eps);
int checker_eq_long_double(long double v1, long double v2, long double eps);
int checker_eq_float(float v1, float v2, float eps);

Эти функции сравнивают два вещественных числа v1 и v2 с
точностью eps. Корректно обрабатываются специальные значение
NaN, +Inf, -Inf. Если модули обоих чисел не превышают 1, то
модуль разности между ними должен быть меньше 2*eps, т. е.
|v1 - v2| < 2*eps. Если модуль хотя бы одного числа > 1, они
должны иметь один знак, далее их порядки изменяются так, чтобы
оба числа попали в интервал [0,2), затем проверяется условие
|v1 - v2| < 2*eps. Таким образом, значение eps задаёт, сколько
совпадающих десятичных знаков должны иметь два числа.

Добавлено несколько новых стандартных чекеров:
cmp_float, cmp_double, cmp_long_double - сравнивают вывод
проверяемой программы, который должен состоять из одного
вещественного числа соответствующего типа, и правильный ответ.
Для сравнения используются функции сравнения вещественных чисел,
описанные выше. Параметр eps должен задаваться с помощью
переменной окружения EPS, для установки которой необходимо
использовать конфигурационную переменную `checker_env' раздела
описания задачи.
cmp_bytes - сравнивает вывод проверяемой программы и правильный
ответ байт в байт.
cmp_int_seq, cmp_unsigned_int_seq, cmp_long_long_seq,
cmp_unsigned_long_long_seq - сравнивают последовательность целых
чисел соответствующего типа в выводе проверяемой программы и в
правильном ответе. Вывод программы должен состоять только из
целых чисел, разделённых пробельными символами. Количество чисел
и сами числа в выводе программы и в правильном ответе должны
совпадать.
cmp_double_seq, cmp_long_double_seq - сравнивают
последовательность вещественных чисел соответствующего типа в
выводе проверяемой программы и в правильном ответе. Вывод
программы должен состоять только из вещественных чисел,
разделённых пробельными символами. Количество чисел и сами числа
в выводе программы и в правильном ответе должны совпадать.
Точность сравнения чисел определяется переменной окружения EPS.

Версия 2.1.41 (20050916)
========================
В данной версии исправлены ошибки, замеченные в предыдущей
версии. Сделаны второстепенные улучшения.

Добавлена глобальная конфигурационная переменная `cpu_bogomips'
значение этой переменной равно скорости процессора, исходя из
которой устанавливалось ограничение времени для задач. В
дальнейшем предполагается использовать эту переменную для
автоматического масштабирования ограничения времени, если
скорость процессора на тестирующей машине существенно
отличается.

Значение BogoMIPS для процессора можно посмотреть в файле
/proc/cpuinfo. При создании нового турнира средствами
CGI-программы serve-control глобальная переменная `cpu_bogomips'
устанавливается в значение скорости процессора серверного
компьютера.

team, master
------------
На личной странице участника печатается таблица суммарной
статистики по задачам для этого участника.

В режиме виртуального турнира ссылка на условия задач более не
отображается в верху страницы, а перенесена в раздел стастистики
по задачам и появляется только в момент старта виртуального
турнира.

serve-control, super-serve
--------------------------
Исправлены некоторые ошибки в коде редактирования настроек
турнира.

При редактировании списка IP-адресов поддерживается операция
копирования списка из другого турнира или из списка для другой
CGI-программы.

Поддерживается редактирование глобальной конфигурационной
переменной `cpu_bogomips'.

Поддерживается редактирование переменных описания задачи
`deadline', `start_date'.

Поддерживается пробный запуск программы `serve' для турнира
(кнопка "Do probe run" на странице "Contest details"). Весь
вывод программы `serve' отображается на HTML-странице. Это может
быть полезно для отладки проблем с запуском турнира.

Поддерживается добавление в систему контроля версий нового
XML-файла конфигурации турнира. В предыдущей версии он должен
был добавляться вручную. Поддерживается сохранение в системе
контроля версий конфигурационного файла serve.cfg. Добавление
в систему контроля версий пока не поддерживается.

Версия 2.1.40 (20050902)
========================
В данной версии исправлены ошибки, замеченные в предыдущей
версии.

Поддерживается работа с системами контроля версий. После
изменения конфигурационного файла турнира contest.xml
выполняется сохранение изменений в системе контроля версий. Для
этого каталог XML-файлов турниров уже должен находиться под
управлением системы контроля версий. Поддерживаются две СКВ:
subversion и CVS. Выбор системы контроля версий происходит по
имени служебного каталога: если в каталоге XML-файлов существует
подкаталог .svn, используется subversion, а если подкаталог CVS,
используется CVS.

Исправленна ссылка на домашнюю страницу системы ejudge, которая
печаталась внизу сгенерированных файлов. Теперь это
http://acm.msu.ru/ejudge.

Добавлена конфигурационная переменная `binary_input' раздела
описания задачи. Если эта переменная установлена, то
предполагается, что входные файлы имеют бинарный формат и
автоматически не перекодируются. Автоматическая перекодировка,
если данный флаг не установлен, возможна в двух случаях:
1) при копировании входного файла в рабочий каталог программы,
если для соответствующего тестировщика установлена
конфигурационная переменная `is_dos'. В этом случае unix-концы
строк \n заменяются на dos-концы строк \r\n.
2) при выполнении команды "Check contest settings" в разделе
просмотра детальной информации о турнире в CGI-программе
`serve-control'. В этом случае из файла удаляются все символы
\r, а кроме того в конец файла добавляется \n, если файл до
этого не заканчивался этим символом. 

В конфигурационном файле serve-control.xml соответствующей
программы поддерживается атрибут "ssl" элемента <ip>, который
позволяет указывать, действует ли данное превило на соединения
по протоколу http, https, или на оба протокола аналогично
атрибуту "ssl" конфигурационного файла турнира contest.xml.

Версия 2.1.39 (20050811)
========================

Поддерживается интерактивное редактирование настроек турниров.
Для необходимо запустить программу-менеджер серверов турниров
`super-serve'. Редактирование настроек контестов ведётся с
помощью CGI-программы `serve-control'.

Поддерживается работа CGI-программ по протоколу https. В
правилах управления доступом к CGI-программам в конфигурационном
файле турнира можно задавать, для какого протокола предназначено
данное правило: для любого (http, https) - по умолчанию, только
для протокола http, только для протокола https.

Поддерживаются ограничения времени с точностью до миллисекунд.
Для этого требуется последняя версия библиотеки reuse (4.2.0) и
специальная поддержка со стороны ядра Linux, реализованная в
патче 2.4.31-cher2.

Поддерживается ошибка Memory Limit Exceeded. Тестирование
программы завершается с этой ошибкой, если в процессе работы
программы её адресное пространство или размер стека превысили
установленный лимит. Для этого требуется последняя версия
библиотеки reuse (4.2.0) и специальная поддержка со стороны ядра
Linux, реализованная в патче 2.4.31-cher2.

contest.xml
-----------
В элементе <ip> поддерживается атрибут "ssl", который может
принимать значения "any" (по умолчанию), "yes", "no". Атрибут
задаёт, для какого протокола применимо данное правило. Если
атрибут установлен в значение "yes", правило применимо только
для соединений по протоколу https, если атрибут установлен в
значение "no", правило применимо только для соединений по
протоколу http. 

В качестве адреса допускается число "0", которое обозначает
произвольный IP-адрес. Например, следующее правило разрешает
нешифрованные соединения только с текущего компьютера, а
соединения по протоколу https с любого компьютера:
<master_access default="deny">
  <ip allow="yes">127.</ip>
  <ip allow="yes" ssl="yes">0</ip>
</master_access>

В качестве спецификации маски IP-адресов допускается форма
A.B.C.D/E, где E - количество бит, отведённых на спецификацию
адреса сети. Таким образом записи 192.168.0. и 129.168.0.0/24
эквивалентны друг другу.

Поддерживается новый бит полномочий EDIT_CONTEST. Если бит
установлен, пользователь может редактировать конфигурационные
файлы турнира, используя программу serve-control.

serve-control,super-serve
-------------------------
Функциональность программы по интерактивному управлению
серверами турниров реализована до конца. Кроме того,
поддерживается редактирование конфигурационных файлов турнира
(contest.xml, serve.cfg), создание новых турниров с нуля и по
образцу уже существующих турниров.

compile
-------
Устранена утечка памяти, возникавшая при обработке каждого
запроса на компиляцию. 

Более не поддерживается опция командной строки -E (запуск
внешней программы-препроцессора на конфигурационный файл).

serve,run
---------
В файле протокола тестирования в режиме сохранения полного
архива (full_archive) сохраняется контрольная сумма (SHA1) файла
входных данных и правильного ответа. При отображении этих файлов
их текущая контрольная сумма сравнивается с сохранённой в файле
протокола и в случае несоответствия выдаётся предупреждение.
Несоответствие, в частности, возникает тогда, когда файлы с
тестами были изменены, а программа не была перетестирована.

edit-userlist
-------------
Поддерживается выделение пользователей в окне просмотра всех
пользователей в базе данных. Установка/снятие выделения
выполняются с помощью команды ':'. К выделенным пользователям
применима команда 'c' регистрации пользователей на турнир.

В режиме просмотра всех зарегистрированных пользователей
доступна команда 'm' для массового создания новых
пользователей. Для создания новых пользователей необходимо
задать следующую информацию:
"Template for new logins?" - задаёт шаблон для новых
регистрационных имен. Шаблон должен содержать единственную
спецификацию %d (допускается указание дополнительных флагов
форматирования, например %03d, функций семейства printf),
которая будет заменена на номер пользователя.
"Template for passwords?" - аналогичным образом задаёт шаблон
для паролей новых пользователей.
"First number:" - минимальный номер, который будет использован в
сгенерированной последовательности регистрационных имён и паролей.
"Last number:" - максимальный номер, который будет использован в
сгенерированной последовательности регистрационных имён и
паролей.
"Contest number:" - номер турнира, на который будут
зарегистрированы все сгенерированные пользователи.
Например, если задать шаблон новых регистрационных имён равный
u2005%02d, шаблон новых паролей равный pass%02d, номер первого
пользователя 1 и номер последнего пользователя 50, то будут
созданы 50 новых регистрационных записей u200501...u200550 с
паролями pass01...pass50.

ejudge-setup
------------
В сгенерированном файле ejudge.xml устанавливается элемент
<super_serve_log>. Таким образом, для запуска super-serve после
выполнения установочного скрипта не требуется никаких
дополнительных редактирований файла ejudge.xml.

serve
-----
Поддерживается новая глобальная конфигурационная переменная
`stand_ignore_after' файла serve.cfg. Эта переменная позволяет
устанавливать дату, после которой таблица текущих результатов
перестаёт обновляться. То есть, если какая-либо посылка поступит
позже этой даты, результат её тестирования не будет отображён в
таблице текущих результатов. Изменения в более ранних посылках
(например, перетестирования) отражены в таблице текущих
результатов будут. Дата задаётся в стандартном формате:
YYYY/MM/DD HH:MM:SS
 
Поддерживается новая глобальная конфигурационная переменная
`ignore_success_time'. Данная переменная действует только в
режиме турнира ACM. Если переменная установлена, то при
вычислении штрафных баллов по задаче будет игнорироваться время,
прошедшее от начала турнира до успешной сдачи. Переменная может
использоваться в турнирах, где каждая задача оценивается по
системе зачёт/незачёт, и где время от начала турнира не
существенно.

serve-control,super-serve
-------------------------
Поддерживается новая глобальная конфигурационная переменная
`secure_run' файла serve.cfg. Данная переменная предназначена
только для интерактивного редактирования настроек турнира с
помощью serve-control. Если эта переменная установлена,
генерируется конфигурационный файл, в котором в тестировщиках
включена поддержка защищённого выполнения программ для
архитектур Linux, Linux-shared и Java.

serve,run
---------
Добавлена новая глобальная конфигурационная переменная
`enable_memory_limit_error' файла serve.cfg. Если эта переменная
установлена, то при запуске программ на тестирование в данном
турнире включается поддержка обнаружения ошибки превышения
максимально допустимого объёма памяти.

Добавлена новая конфигурационная переменная
`enable_memory_limit_error' секции описания тестировщиков. Если
данная переменная установлена, то для данного тестировщика в
принципе возможна поддержка обнаружения ошибки превышения
максимально допустимого объёма памяти. Эта переменная может быть
установлена для тестировщиков Linux и Linux-shared (при
начальной настройке турнира с помощью ejudge-setup или при
редактировании настроек турнира с помощью serve-control она
устанавливается автоматически), для других тестировщиков (Java,
DOS) эта переменная не должна быть установлена, так как контроль
размера выделенной памяти в этих случаях производится не
средствами ядра Linux.

Таким образом, поддержка обнаружения ошибки превышения
максимально допустимого объёма памяти работает только если в
конфигурационном файле турнира установлена глобальная
конфигурационная переменная `enable_memory_limit_error' и только
для архитектур Linux и Linux-shared (то есть для программ на
gcc, g++, fpc, dcc).

Добавлена новая конфигурационная переменная `time_limit_millis'
секции описания задачи. Данная переменная позволяет
устанавливать ограничение времени с точностью до миллисекунды.
Если установлена данная переменная, значение переменной
`time_limit' игнорируется. Поддержка миллисекундных ограничений
времени работает только, если используется последняя версия
библиотеки reuse (4.2.0). Если ядро Linux не поддерживает
миллисекундные ограничения времени, reuse будет эмулировать их с
помощью секундных ограничений времени.

Добавлена новая конфигурационная переменная `check_cmd' секции
описания задачи. Данная переменная имеет точно такое же
значение, как и одноимённая переменная секции описания
тестировщика, то есть позволяет задавать шаблон имени
проверяющей программы для данной задачи. Поскольку проверяющая
программа не зависит от архитектуры, под которой выполняется
тестирующая программа (так как в конечном итоге все архитектуры
работают под Linux), переменная `check_cmd' всегда имела
одинаковое значение для всех тестировщиков турнира, поэтому
целесообразно перенести её в секцию описания задачи.

Переменная `check_cmd' секции описания тестировщика сохранена и
имеет приоритет над соответствующей переменной секции описания
задачи, однако её использование не рекомендуется, так как в этом
случае становится невозможным редактирование настроек турнира с
помощью CGI-программы serve-control. 

serve
-----
Более не поддерживается опция командной строки -E (запуск
внешней программы-препроцессора на конфигурационный файл).

Исправлена ошибка, из-за которой каталог аудит-записей
создавался раньше, чем тот каталог, в котором он должен быть
расположен, из-за чего программа serve завершалась с ошибкой при
запуске нового турнира.

run
---
Более не поддерживается опция командной строки -E (запуск
внешней программы-препроцессора на конфигурационный файл).

При работе под управлением программы `super-serve' период
неактивности отсчитывается с момента завершения тестирования
программы, а не с момента начала тестирования. В предыдущих
версиях это приводило к тому, что если тестирование одной
программы продолжалось дольше, чем период неактивности,
программа run завершалась даже если очередь на тестирование была
не пуста.

В режиме турнира ACM не требуется, чтобы сумма баллов по всем
тестам была не больше, чем полное число баллов за задачу. Так
как по умолчанию задача оценивается в 25 баллов, а каждый тест -
в 1 балл, это приводило к тому, что если у задачи было более 25
тестов, требовалось указание либо параметра `full_score', либо
параметра `test_score' в секции описания задачи. Теперь этого не
требуется.

serve
-----
Исправлена ошибка в обработчике команды "Reset Contest". В
предыдущих версиях в результате очистки турнира создавался
некорректный файл журнала посылок, после чего программа `serve'
отказывалась работать.

serve,master
------------
Поддерживается изменение длительности турнира с конечной на
бесконечную и наоборот. Если в окне ввода указать "0", то будет
установлена неограниченная продолжительность турнира.

run
---
Для каждого поддерживаемого языка программирования LANG помимо
скрипта компиляции создаётся и скрипт версии LANG-version
(например, gcc и gcc-version). При запуске скрипт печатает на
стандартный поток вывода версию языка. Кроме того,
поддерживаются две опции:
-f	Напечатать на стандартный поток вывода название
	компилятора и его версию. 
-p	Напечатать на стандартный поток вывода путь к
	компилятору.

master,judge,team,serve-control,register,users
----------------------------------------------
Поддерживается протокол https.

master,judge
------------
На главной страничке отображается суммарное количество посылок,
находящихся в стадии компиляции или тестирования.

При просмотре протокола тестирования отображается
астрономическое время работы программы на каждом тесте (если эта
информация присутствует в протоколе тестирования).

В режиме сохранения полного архива вывода тестируемых программ
(full_archive) если контрольная сумма тестового файла в момент
тестирования не совпадает с контрольной суммой файла при
просмотре, выдаётся предупреждение.

serve-cmd
---------
Поддерживаются новые команды:
serve-cmd CONTEST-ID dump-problems SESSION-ID-FILE
	Печатает информацию о задачах указанного турнира в
	CSV-формате (поля разделяются знаком ';').
	[0] - id
	[1] - short_name
	[2] - long_name
serve-cmd CONTEST-ID dump-standings SESSION-ID-FILE
	Печатает текущую таблицу результатов в CSV-формате.
	Печатается полная версия таблицы результатов, доступная
	для привилегированных пользователей. Данная команда
	эквивалентна команде "Dump standings" CGI-программы
	master.
serve-cmd CONTEST-ID dump-all-users SESSION-ID-FILE
	Печатает таблицу всех пользователей в CSV-формате. Номер
	турнира CONTEST-ID не используется и может быть
	произвольным.
serve-cmd CONTEST-ID get-contest-name SESSION-ID-FILE
	Печатает название указанного турнира.
serve-cmd CONTEST-ID get-contest-type SESSION-ID-FILE
	Печатает тип указанного турнира. На стандартный поток
	вывода печатается одна из трёх возможных строк:
	acm, kirov, olympiad.


testlib
-------
Добавлена версия testlib для delphi/kylix. Версия для fpc
инсталлируется в ${prefix}/share/ejudge/testlib/fpc, а версия
для delphi инсталлируется в ${prefix}/share/ejudge/testlib/delphi.
Если при конфигурировании системы поддержка соответствующих
языков была включена, при инсталляции файлы библиотеки testlib
компилируются соответствующими компиляторами.

Путь к библиотеке testlib для соответствующего языка
устанавливается автоматически при выполнении команды "Check
contest settings" программы serve-control. То есть, не требуется
присутствие файла testlib.pas в каталоге чекеров турнира.

Версия 2.1.38 (20050607)
========================

libchecker
----------
Проверяющие программы не выдают ошибки "Check Failed", если им
передано больше параметров, чем требуется. Лишние параметры
игнорируются. Это позволяет использовать стандартные проверяющие
программы (например, cmp_int) в конфигурациях задачи совместно с
дополнительной информацией о тестах (.inf-файлами).

run,serve
---------
Переработан интерфейс взаимодействия программ run и serve. run
всегда генерирует протокол тестирования в XML-формате.
Отображение протокола тестирования в HTML-представлении
выполняется теперь программой serve. Поэтому отпала
необходимость в двух отдельных протоколах: судейском и протоколе
участника. XML-протоколы тестирования сохраняются в подкаталогах
каталога ${contest_root}/var/archive/xmlreport. Поддерживается
обратная совместимость с каталогами турниров, созданных
предыдущими версиями ejudge. Если для некоторой посылки не
существует протокола в формате XML, используются протоколы
тестирования, сгенерированные предыдущими версиями.

Так как run всегда генерирует отчёт в формате XML, глобальная
конфигурационная переменная html_report потеряла своё значение.
Она сохранена (для совместимости), но её значение игнорируется. 

Добавлена возможность сохранения в архиве запуска полного вывода
программы. По умолчанию входные тестовые данные, вывод
программы, вывод проверяющей программы для каждого теста
добавляются непосредственно в протокол тестирования. Однако
максимальный размер и длина строки в файле добавляемом в
протокол тестирования ограничены (см. конфигурационные
переменные max_file_length, max_line_length), и если ограничение
превышается, вместо содержимого файла добавляется короткое
сообщение о том, что файл или строка слишком длинные.
В данной версии добавлена глобальная конфигурационная переменная
`enable_full_archive'. Если эта переменная установлена в 1,
вывод тестируемой программы сохраняется без ограничений, но не в
XML-протоколе тестирования, а в отдельном файле. В режиме
полного архива XML-протокол не содержит ни входных, ни выходных
файлов тестируемой программы, за исключением параметров
командной строки, передаваемых тестируемой программе, если
таковые имеются. Вывод тестирующей программы и вывод проверяющей
программы сохраняются в отдельном файле в специальном архивном
формате. Формат архива в данной версии ejudge не совместим ни с
какой архивной программой. Для каждого файла в архиве хранится
служебная информация и содержимое файла, сжатое алгоритмом
gzip. Архивные файлы находятся в подкаталогах каталога
${contest_root}/var/archive/output.

serve,master,judge,team
-----------------------
Так как в режиме полного архива протокол тестирования не
содержит входных данных, добавлена возможность просмотра файлов
в архиве. Выходной файл тестируемой программы, stderr, вывод
проверяющей программы для каждого теста берутся из архивного
файла, входной файл, файл с правильным ответом (если есть) и
файл с дополнительной информацией (если есть) берутся из
каталога с тестами. При этом возможно рассогласование между теми
тестами, которые использовались при запуске программы, и
отображаемым в текущий момент (например, если тесты с тех пор
были обновлены). В текущей версии нет механизма контроля
соответствия (например, контрольной суммы).

serve
-----
Для каждой посылки хранится административный журнал (audit log),
в котором хранится информация обо всех операциях с данной
посылкой. В журнал информация только добавляется, но никогда не
удаляется и не редактируется. Файлы журналов находятся в
подкаталогах каталога ${contest_root}/var/archive/audit.

serve,master
------------
Поддерживается отображение административного журнала. Чтобы
пользователь мог просмотреть административный журнал, у него
должен быть установлен бит CONTROL_CONTEST.

serve,master,judge,team
-----------------------
Удалена поддержка старых сессионных режимов (логин/пароль в
форме, cookie, ключ сессии в форме). Эти режимы никогда не
использовались, но их в поддержка в коде присутствовала.
Теперь поддержка этих режимов удалена. URL, используемый в
работе в результате упростился, так как отпала необходимость в
переменной sid_mode.

userlist-server
---------------
Программа не падает при попытке входа пользователя, у которого
не установлен пароль (т. е. поле register_password в XML-файле
отсутствует).

Версия 2.1.37 (20050422)
========================
В данной версии исправлены проблемы компиляции на Win32, а также
некоторые ошибки в документации.

Добавлена поддержка "премий" в режиме турнира KIROV. Премия
даётся нескольким участникам, которые решили задачу первыми.

Незначительно изменилась структура каталогов обмена
serve<->compile и serve<->run. Новая структура каталогов не
совместима со структурой каталогов предыдущей версии.

INSTALL,INSTALL.RUS
-------------------
Описаны все новые опции, добавленные с момента последнего
обновления файла. Исправлены найденные ошибки.

serve,compile,run,userlist-server,super-serve
---------------------------------------------
Программы отказываются работать, если запускаются из-под
пользователя root. В предыдущих версиях системы работа из-под
root также не поддерживалась, но явного сообщения об ошибке не
печаталось.

configure
---------
Поддерживается система Mono (www.mono-project.com) - свободная
реализация .NET для ряда платформ. В её рамках поддерживается
автоматическое обнаружение компиляторов языков C# (mcs) и Visual
Basic (mbas). Для явного указания путей к этим компиляторам
могут использоваться новые опции --with-mcs и --with-mbas.

Обратите внимание, что текущая версия системы Mono не
поддерживает настройку политики безопастности. Поэтому
тестируемые программы на C# и VB запускаются с полными правами
пользователя, под которым работает программа run. По этой
причина использование этих языков не безопасно и не
рекомендуется в турнирах, где нет контроля за программами,
посылаемыми участниками.

Улучшена проверка на библиотеку libcap и ядро с поддержкой
специальных бит привелегий. Если программа, использующая libcap
и биты CAP_SYS_OPERATIONS и CAP_SYS_ONE_EXEC компилируется, но
запуск не приводит к ограничению прав программы, то после
окончания скрипта configure выдаётся предупреждение.

Исправлена неправильная установка макроса CONF_HAS_LIBCAP в
config.h. Макрос устанавливался в 1 всегда.

Проверяется, что в системе доступна программа uudecode, и если
эта программа не найдена, после завершения работы configure
печатается предупреждение.

ejudge-setup
------------
В сгенерированных .cfg-файлах в качестве символа комментария
используется `#' вместо `;'.

Добавлена поддержка языков C# и Visual Basic (Mono) - см.
комментарий выше. Конфигурационный файл тестового турнира 1
генерируется таким образом, что эти языки в нём недоступны для
использования, то есть для них установлен флаг "disabled = 1".
Для того, чтобы активировать эти языки, необходимо изменить
конфигурационный файл serve.cfg вручную.

Название турнира "Тестовый турнир" заменено на "Test contest",
чтобы не создавать проблем с кодировками файлов, отличных от
koi8-r.

В настроечном скрипте, генерируемом программой, используется имя
программы uudecode, которое берётся из config.h.

serve
-----
Поддерживается новая конфигурационная переменная score_bonus
секции описания задачи файла serve.cfg. Эта переменная позволяет
задавать премию в баллах к решениям задачи. Переменная действует
только для турниров по системе KIROV. Значение переменной - это
последовательность целых чисел (которые могут быть
положительными и отрицательными), числа в которой разделены
пробельными символами. Например,
score_bonus = "10 5"
В этом случае для той задачи, для которой установлена
`score_bonus' дополнительные баллы будут начисляться по
следующим правилам:
  - первое полное решение (то есть получившее статус OK) этой
    задачи получит +10 баллов к тому числу баллов, которое
    набрало это решение с учётов всевозможных штрафов (за
    предыдущии попытки, за несвоевременную сдачу, и т. д.);
  - второе полное решение получит +5 баллов к общему числу
    баллов;
  - третье и последующие решения не получат никаких
    дополнительных баллов.

При подсчёте номера решения игнорируются следующие полные
решения:
  - тех, кто уже решили эту задачу раньше. Таким образом, если
    участник получил +10 за задачу, то за вторую успешную сдачу
    той же самой задачи он ничего не получит, и вторая успешная
    сдача задачи будет проигнорирована при вычислении премии
    других участников.
  - посылок, для которых установлен флаг `hidden'. Такие
    посылки, как правило, выполняются с помощью
    привилегированных CGI-программ judge и master, и
    следовательно не должны учитываться при подсчёте баллов
    участников.
  - посылок пользователей, которые невидимы (invisible) или
    дисквалифицированы (banned) в турнире. Невидимые
    участники - это, как правило, привилегированные участники,
    которые не отображаются в таблице результатов.

serve
-----
Добавлена новая глобальная конфигурационная переменная
`disable_sound' конфигурационного файла serve.cfg. Если эта
переменная установлена в 1, то при тестировании программы не
будет выдаваться никаких звуковых сообщений, даже если звуковые
сообщения настроены в программе `run'. Данная переменная
предназначена для использования в ситуациях, когда программа
`run' проверяет решения сразу нескольких турниров (например,
основного турнира и интернет турнира), и для каких-то турниров
звуковые сообщения должны быть разрешены, а для каких-то - нет.
В этом случае можно использовать эту переменную в
конфигурационном файле турниров, для которых звуковые сообщения
должны быть отключены.

Версия 2.1.36 (20050402)
========================
В данной версии исправлено несколько серьёзных ошибок в
программах userlist-server и serve. Рекомендуется обновиться до
данной версии.

Программы `compile' и `run' снова собираются на платформе
Win32. Для компиляции программ необходим пакет Cygwin, но для
их последующего выполнения пакет Cygwin не требуется. Для сборки
и работы требуется Windows 2000 или выше.

Для компиляции на Win32 необходима последняя версия библиотеки
reuse: 4.0.1. Рекомендуется использовать последнюю версию reuse
и при компиляции на Linux.

Добавлено много усовершенствований для турниров по системе
OLYMPIAD.

serve
-----
В базу посылок добавлено два новых статуса проверки посылки:
"Memory Limit" (RUN_MEM_LIMIT_ERR) и "Security Error"
(RUN_SECURITY_ERR). Они обрабатываются везде точно также, как,
например, "Run-time error" (RUN_RUN_TIME_ERR) и могут
использоваться для более точного указания причины ошибки.

Хотя два новых статуса ошибки были добавлены в базу, программа
`run' пока не поддерживает диагностику этих кодов ошибок по
причине невозможности их надёжного определения на Linux. Два
новых статуса пока могут быть установлены только вручную при
редактировании базы посылок.

Добавлен новый статус посылки "Pending" (RUN_PENDING). Посылка
устанавливается в этот статус, когда она была принята сервером,
но по каким-либо причинам не была отправлена на тестирование,
например, если установлен флаг задачи или языка программирования
`disable_testing' или `disable_auto_testing', или если в турнире
приостановлено тестирование поступающих решений. Ранее в этих
случаях посылка получала статус "Accepted for Testing"
(RUN_ACCEPTED), однако этот статус используется и в турнирах по
системе OLYMPIAD при предварительном тестировании задач, поэтому
эти два типа использования RUN_ACCEPTED были разделены и введён
специальный статус RUN_PENDING.

В выражении фильтра посылок новые статусы кодируются следующим
образом:
PD	RUN_PENDING
ML	RUN_MEM_LIMIT_ERR
SE	RUN_SECURITY_ERR

compile
-------
Программа `compile' собирается на Win32 (см. выше). Данная
версия программы не тестировалась на Win32, поэтому поддержка
Win32 находится в альфа-стадии.

compile, serve
--------------
Переработан формат управляющих пакетов, с помощью которых serve
передаёт задания на компиляцию compile и получает результаты
компиляции. Теперь данные передаются в бинарном формате. Кроме
того, пакеты включают поля временных отметок, которые
используются затем для выдачи подробной статистики о ходе
прохождения задания на тестирование.

configure
---------
Поддерживается платформа Win32 (Cygwin с опцией -mno-cygwin).

edit-userlist
-------------
Добавлена частичная поддержка выполнения команд над группой
пользователей. При просмотре списка пользователей,
зарегистрированных на некоторый турнир, можно ставить/снимать
выделение каждого пользователя. Для этого используется команда
':'. Если выделено несколько пользователей, команды 'r'
(изменить статус регистрации), 'd' (удалить регистрацию), 'i'
(изменить статус видимости), 'b' (изменить статус
дисквалификации), 'l' (изменить статус заблокированности)
выполняются над всеми выделенными пользователями. Если ни один
пользователь не выделен, указанные выше команды выполняются над
текущим пользователем.

В режим просмотра участников, зарегистрированных на турнир,
добавлена команда 'c', которая позволяет зарегистрировать
данного участника или группу участников на другой турнир. Данная
команда совместно с командной группового выделения ':' даёт
возможность зарегистрировать всех участников одного турнира на
другой турнир, что может использоваться, например, при
подготовке пробного тура, виртуального турнира по результатам
реального турнира и т. д.

serve
-----
Улучшена диагностика неправильных выражений фильтра. Теперь если
пользователь вводит неправильное ключевое слово, например,
problem вместо prob, то будет выдана ошибка о недопустимом
ключевом слове problem вместо трёх ошибок о недопустимых
символах l, e, m.

Исправлена серьёзная ошибка, проявлявшаяся при вводе ошибочного
выражения фильтра. В этом случае выделялся блок динамической
памяти, размер которого задавался неинициализированной
переменной. В дальнейшем это могло приводить к фатальному
завершению `serve' из-за нехватки памяти, неправильной работе и
т. п.

serve
-----
Убрано ограничение на то, что количество баллов, полученное за
задачу с учётом всех дополнительных факторов (штраф за время и
т. п.), не может привышать полного балла задачи (full_score).

В турнире по системе OLYMPIAD в режиме предварительного
тестирования переработан вид таблицы текущих результатов
участников. В этом режиме каждый из предварительных тестов
оценивается в 1 балл вне зависимости от оценки этого теста в
конфигурационном файле (обычно это --- 0 баллов). Задача
помечается как сданная (выделяется жирным шрифтом), если она
прошла все предварительные тесты. Участники ранжирутся по числу
сданных задач, а после этого по количеству набранных баллов.

В режиме окончательного тестирования вид таблицы текущих
результатов не изменился и совпадает с видом таблицы текущих
результатов в турнире по системе KIROV.

serve, team
-----------
CGI-программа team также поддерживает отображение протоколов в
формате HTML. Хотя только судейские протоколы могут
генерироваться в формате HTML, участник получает доступ к ним,
если установлена глобальная конфигурационная переменная
`team_show_judge_report' конфигурационного файла serve.cfg.

run
---
Программа `run' собирается на Win32 (см. выше). Данная
версия программы не тестировалась на Win32, поэтому поддержка
Win32 находится в альфа-стадии.

serve,run
---------
Переработан формат управляющих пакетов, с помощью которых serve
передаёт задания на выполнение run и получает результаты
тестирования. Теперь данные передаются в бинарном формате. Кроме
того, пакеты включают поля временных отметок, которые
используются затем для выдачи подробной статистики о ходе
прохождения задания на тестирование.

run
---
В судейский протокол тестирования печатается статистика о
прохождении задания по этапам тестирования. Отслеживается
постановка задания в очередь на компиляцию, компиляция, ожидание
в очереди скомпилированных заданий, постановка задания в очередь
на выполнение, выполнение.

serve, master, judge
--------------------
В турнире по системе OLYMPIAD в режиме предварительного
тестирования поддерживается команда "Full rejudge", которая
вызывает полное тестирование задачи на всех тестах. Эта команда
может использоваться, когда в режиме предварительного
тестирования необходимо полностью протестировать, например,
судейское решение.

serve
-----
Улучшена обработка ситуации, когда ошибка возникает в процессе
добавления новой посылки. Если запись новой посылки в файл
завершилась с ошибкой, эта посылка будет удалена и из базы
посылок. Таким образом исправлена старая ошибка, которая
возникала в случае, если на файловой системе, на которой
хранится архив посылок, заканчивалось свободное место. В этом
случае исходный текст программы в архив не записывался, но в
базе посылок запись сохранялась и имела статус "Available".

В базу посылок добавлено новое поле judge_id, которое принимает
значения от 0 до 65535. Когда посылка направляется на
тестирование или перетестирование, ей назначается некоторый
judge_id, который сохраняется в базе. Когда serve получает
пакеты с результатами компиляции или тестирования программы,
judge_id, указанный в пакете, проверяется на соответствие
judge_id, сохранённому в базе посылок, и если judge_id не
совпадают, полученный пакет игнорируется.

Таким образом решается проблема, когда посылка, находящаяся на
тестировании, снова направляется на тестирование. В этом случае
старый judge_id в базе будет замещён новым и таким образом
результаты более старого перетестирования будут
проигнорированы. Раньше этого гарантировать было нельзя, так как
более ранний запрос на тестирование мог выполниться первым,
после чего статус посылки менялся на статус, определённый в
результате тестирования, и более новые результаты тестирования
игнорировались.

Поле judge_id в структуре описания посылки занимает 2 байта.
Таким образом размер всех значимых полей стал равным 64 байта, и
в структуре не осталось неиспользуемого места, так как с момента
перехода с текстового формата журнала посылок на бинарный размер
одной записи равен 64 байта. В журнале посылок не осталось места
для дальнейшего добавления полей без изменения формата журнала
(например, перехода к 128-байтовым записям).

Добавлено новое форматное преобразование '%M1', которое выводит
значение поля `extra1' структуры информации о пользователе.
Это поле не доступно для редактирования ни обычным
пользователем, ни администратором и используется для служебных
целей. Текущая версия программы userlist-server при передаче
списка пользователей, зарегистрированных на турнир, помещает в
данное поле значение поля `grade' первого участника команды.
В личных олимпиадах это поле содержит класс или курс участника.
Таким образом, можно считать, что форматное преобразование '%M1'
отображает класс или курс участника личной олимпиады.

userlist-server
---------------
Исправлена ошибка разыменования нулевого указателя при попытке
регистрации нового пользователя в системе если не был задан
номер турнира. Она проявлялась, если для регистрации
пользователя использовался URL без задания параметра contest_id,
например, http://acm.msu.ru/cgi-bin/register. Если параметр
contest_id был указан, например,
http://acm.msu.ru/cgi-bin/register?contest_id=83,
проблема не возникала. Данная ошибка была внесена в предыдущей
версии, когда была добавлена поддержка шаблонов регистрационных
писем.

super-serve
-----------
UNIX-сокеты для управления программами serve всех управляемых
турниров, которые создаются программой super-serve при старте,
удаляются при завершении работы.

Версия 2.1.35 (20050118)
========================
В данной версии исправлены некоторые некритические ошибки и
добавлены некоторые новые возможности.

userlist-server
---------------
При чтении XML-файла базы пользователей не выдаётся ошибка
разбора XML файла, если какой-либо пользователь имеет пустой
пароль (то есть пароль, установленный в пустую строку).

Попытка установить пустой пароль (пароль, равный пустой строке)
с помощью программы `edit-userlist' теперь приводит к ошибке
"Invalid password". Пустые пароли всё равно считаются
недопустимыми при проверке пароля при входе в систему.

serve
-----
Добавлены новые конфигурационные переменные секции описания
языка программирования: `disable_testing',
`disable_auto_testing'. Они ведут себя точно так же, как
одноимённые переменные секции описания задачи, то есть
переменная `disable_testing' запрещает всякое тестирование
посылки на заданном языке, а переменная `disable_auto_testing'
предотвращает автоматическое тестирование посылки на заданном
языке сразу после её получения. Такая посылка получает статус
"Accepted for testing" и может быть протестирована с помощью
явной команды перетестирования посылки администратором турнира.

serve
-----
Добавлена новая конфигурационная переменная секции описания
задачи `disqualified_penalty'. Эта переменная позволяет задать
штраф за дисквалифицированную посылку. В данной версии системы
ejudge дисквалифицированные посылки учитываются отдельно от
обычных посылок и штрафуются отдельно. По умолчанию значение
переменной `disqualified_penalty' равно значению переменной
`run_penalty'.

Таким образом, в текущей версии системы балл за посылку в
системе KIROV или OLYMPIAD вычисляется по следующей формуле:
S = I * M - A * P + D + J - B * Q
Переменные `S', `I', `M', `A', `P', `J' описаны ниже.
Переменная `B' - это количество дисквалифицированных посылок,
`Q' - штраф за одну дисквалифицированную посылку, задаваемый
конфигурационной переменной `disqualified_penalty'.

В режиме турнира KIROV или OLYMPIAD в поле "баллы" таблицы
посылок пользователя соответственно изменилось отображение
формулы, по которой вычислялись баллы за данную посылку.
Полный вид отображения формулы выглядит следующим образом:
S = I [ * M ] [ - A * P ] [ +/- D ] [ +/- J ] [ - B * Q ]
если M == 1, то соответствующая часть формулы не отображается,
аналогично для A * P == 0, D == 0, J == 0, B * Q == 0.

В журнал посылок в CVS-форме, выводимый с помощью команды
serve-cmd dump-master-runs
добавлены два поля
          [27] disq_attempts
          [28] disq_penalty

serve
-----
При просмотре листинга программы с помощью команды "View source"
CGI программ `judge' или `master' строки программы нумеруются.

serve,master,judge
------------------
Кнопка "Reset filter" выражения фильтра теперь очищает только
выражение фильтра и номер первой и последней просматриваемой
посылки и не очищает параметры просмотра списка сообщений.

В диалог задания параметров просмотра списка сообщений добавлен
новый параметр, выбираемый с помощью выпадающего меню. Параметр
позволяет просматривать либо все сообщения, либо только
неотвеченные сообщения. Для программы `judge' по умолчанию
устанавливается режим просмотра неотвеченных сообщений, а для
программы `master' - режим просмотра всех сообщений.

Добавлена кнопка "Reset filter" для сброса параметров просмотра
списка сообщений. Данная кнопка расположена рядом с кнопкой
"View" просмотра списка сообщений.

contest.xml
-----------     
Добавлен новый элемент <register_email_file>. Данный элемент
позволяет задать шаблон письма, посылаемого после регистрации
нового пользователя. Значение элемента может быть либо полным
путём к файлу, либо относительным путём. В последнем случае путь
вычисляется относительно каталога конфигурационных файлов
турнира, задаваемого либо с помощью элемента <root_dir>, либо с
помощью элемента <conf_dir>. В значении элемента допускаются
форматные преобразования, например, %Vl - номер текущего
языкового окружения (0 - английский язык, 1 - русский язык),
например:
<register_email_file>email_tmpl_%Vl.txt</register_email_file>
Тогда если выбран русский язык, тогда в качестве шаблона
регистрационного письма будет использоваться файл
email_tmpl_1.txt в каталоге conf (<root_dir>/conf) каталога
турнира, а если выбран английский язык, будет использоваться
файл email_tmpl_0.txt. Если файл шаблона письма не существует
для текущего языкового окружения, загружается файл для шаблона
для языкового окружения 0, если и этот шаблон письма не
существует, используется шаблон письма в текущем языковом
окружении. Если значение элемента <register_email_file> не
установлено, всегда используется шаблон письма по умолчанию.

В тексте шаблона письма также допускаются форматные
преобразования, подставляющие параметры нового пользователя в
текст письма. Допустимые форматные преобразования перечислены
ниже:
%Vu - URL для продолжения регистрации в системе
%Vl - идентификатор языкового окружения
%Ul - регистрационное имя пользователя
%Ui - регистрационный номер пользователя
%Un - имя пользователя
%Ue - регистрационный email пользователя
%Uz - автоматически сгенерированный новый пароль пользователя

Пример текста письма по умолчанию на английском языке:
--------
Hello,

Somebody (probably you) have specified this e-mail address (%Ue)
when registering an account on the Moscow Programming Contests
Server.

To confirm registration, you should enter the provided login
and password on the login page of the server at the
following url: %Vu.

Note, that if you do not do this in 24 hours from the moment
of sending this letter, registration will be void.

login:    %Ul
password: %Uz

Regards
The ejudge contest administration system
--------

serve-cmd,serve
---------------
Реализована новая команда проверки, есть ли в данный момент в
турнире посылки в состоянии компиляции или тестирования. Данная
команда доступна только с помощью программы `serve-cmd':
serve-cmd CONTEST-ID has-transient-runs SESSION-ID-FILE
Если такие посылки есть, то код возврата программы равен 2, если
таких посылок нет, код возврата равен 0. Кроме того,
вырабатывается код возврата 1, если возникла какая-либо другая
ошибка выполнения команды.

serve-cmd
---------
Реализовано несколько новых команд управления турниром из
командной строки:
serve-cmd CONTEST-ID suspend-testing SESSION-ID-FILE
          Данная команда приостанавливает тестирование всех
          поступающих посылок. Посылки получают статус "Accepted
          for testing" (RUN_ACCEPTED) и не направляются на
          компиляцию и тестирование.
serve-cmd CONTEST-ID resume-testing SESSION-ID-FILE
          Данная команда отменяет действие предыдущей команды,
          то есть все поступающие посылки будут обрабатываться
          как обычно.
serve-cmd CONTEST-ID judge-suspended-runs SESSION-ID-FILE
          Данная команда отправляет на компиляцию и тестирование
          все посылки, которые имеют статус "Accepted for
          testing" (RUN_ACCEPTED).

Эти команды могут использоваться для корректного импорта
внешнего журнала посылок в систему. Как было сказано ниже,
команда `import-xml-runs' не работает, если в текущий момент в
системе есть посылки в состоянии компиляции или тестирования.
Поэтому алгоритм импорта внешнего журнала посылок в работающий
турнир может выглядеть следующим образом:
	serve-cmd CONTEST-ID suspend-testing SESSION-ID-FILE
	serve-cmd CONTEST-ID has-transient-runs SESSION-ID-FILE
	while [ "$?" = 2 ]
	do
                sleep 1
		serve-cmd CONTEST-ID has-transient-runs SESSION-ID-FILE
	done
        serve-cmd CONTEST-ID import-xml-runs SESSION-ID-FILE RUNLOG-FILE
        serve-cmd CONTEST-ID resume-testing SESSION-ID-FILE
        serve-cmd CONTEST-ID judge-suspended-runs SESSION-ID-FILE
В данном фрагменте отсутствует проверка возможных ошибочных ситуаций.

serve-cmd CONTEST-ID full-import-xml-runs SESSION-ID-FILE XML-FILE1 ...
	Данная команда реализует полный алгоритм импорта
	внешнего журнала посылок в систему, описанный выше. В
	качестве аргументов команды допускается задание сразу
	нескольких файлов с журналами посылок, все эти файлы
	будут проимпортированы. Команда возвращает 0 при
	успешном завершении, когда все файлы были успешно
	проимпортированы, 1 - когда ни один файл не был
	проимпортирован из-за возникшей ошибки, 2 - если ни один
	файл не был проимпортирован, так как программа была
	прервана пользователем, 3 - если часть файлов была
	проимпортирована, а часть нет из-за ошибки в этих
	файлах. Данная команда корректно восстанавливает
	состояние турнира в случае, если её выполнение было
	прервано пользователем, при этом учитывается состояние
	турнира (то есть, было ли приостановлено тестирование
	поступающих посылок) на момент начала выполнения
	команды.

serve
-----
Добавлены новые возможности в выражение фильтра посылок.
Поддерживаются следующие новые предикаты проверки состояния
посылки:
userinvisible [ ( RUN-ID ) ]
        Вырабатывает булевский результат TRUE, если посылка
        RUN-ID выполнена пользователем, который в данном турнире
        имеет статус "невидимый" (invisible). В противном случае
        вырабатывается булевский результат FALSE. Если выражение
        RUN-ID опущено, берётся текущая посылка.
userbanned [ ( RUN-ID ) ]
        Вырабатывает булевский результат TRUE, если посылка
        RUN-ID выполнена пользователем, который в данном турнире
        имеет статус "дисквалифицированный" (banned). В
        противном случае вырабатывается булевский результат
        FALSE. Если выражение RUN-ID опущено, берётся текущая
        посылка.
userlocked [ ( RUN-ID ) ]
        Вырабатывает булевский результат TRUE, если посылка
        RUN-ID выполнена пользователем, который в данном турнире
        имеет статус "заблокированный" (locked). В противном
        случае вырабатывается булевский результат FALSE. Если
        выражение RUN-ID опущено, берётся текущая посылка.
curuserinvisible
        Вырабатывает булевский результат TRUE, если текущая
        посылка выполнена пользователем, который в данном турнире
        имеет статус "невидимый" (invisible). В противном случае
        вырабатывается булевский результат FALSE.
curuserbanned
        Вырабатывает булевский результат TRUE, если текущая
        посылка выполнена пользователем, который в данном турнире
        имеет статус "дисквалифицированный" (banned). В
        противном случае вырабатывается булевский результат
        FALSE.
curuserlocked
        Вырабатывает булевский результат TRUE, если текущая
        посылка выполнена пользователем, который в данном турнире
        имеет статус "заблокированный" (locked). В противном
        случае вырабатывается булевский результат FALSE.
Новые предикаты проверки состояния посылки могут далее
связываться логическими связками друг с другом и с другими
допустимыми выражениями фильтра, например:
!userinvisible && !invisible
Этому выражению фильтра удовлетворяют все посылки, которые не
являются собственно "невидимыми", и не посланы "невидимыми"
пользователями.

serve
-----
e-mail адреса участников турнира теперь отображаются на странице
"View users" CGI-программ `judge' и `master'.

serve,run
---------
Добавлена новая глобальная конфигурационная переменная
`html_report'. Если эта переменная установлена в ненулевое
значение, судейский протокол тестирования будет генерироваться
программой `run' в формате HTML, а не как простой текст. В
HTML-протоколе тестирования добавлены ссылки от таблицы сводной
информации, находящейся вверху страницы к результатам
тестирования для каждого.

В одном турнире могут быть смешаны протоколы тестирования разных
типов. Чтобы изменить тип протокола тестирования по ходу турнира
необходимо изменить значение переменной `html_report' и
перезапустить программу `serve'. Программа `run' в этом случае
может не перезапускаться.

Версия 2.1.34 (20050108)
========================
В данной версии исправлено значительное количество ошибок и
внесены некоторые улучшения во все программы системы.
Реализованы новые программы, в частности управление турниром из
командной строки.

Начата работа по переносу программ `compile' и `run' на
платформу Windows. Вся серверная часть по-прежнему пока работает
только под Linux. Перенос `compile' и `run' позволит
сделать доступными участникам все системы и языки
программирования, доступные для Windows. Естественно, для
компиляции и проверки потребуется (помимо сервера) компьютер под
Windows. Работы предполагается завершить в следующей версии
системы.

configure
---------
Добавлена опция `--enable-super-serve-socket', которая позволяет
установить путь по умолчанию к командному сокету программы
`super-serve'. Эта программа принимает команды управления
турнирами через указанный Unix-сокет аналогично программам
`userlist-server' и `serve'. На данный момент поддержка
управляющих команд реализована лишь частично и не рекомендуется
для использования. Окончательная реализация предполагается в
следующей версии.

ejudge-setup
------------
Поддерживается редактирования значения пути к командному сокету
программы `super-serve' (см. опцию `--enable-super-serve-socket'
выше).

serve-cmd
---------
Новая программа, предназначенная для управления сервером турнира
`serve' из командной строки. На настоящий момент реализовано
подмножество команд управления турниром, доступных через
интерактивную CGI-программу `master'.

Программа serve-cmd поддерживает следующие команды управления
турниром из командной строки:
serve-cmd CONTEST-ID login SESSION-ID-FILE LOGIN PASSWORD
          Команда входа в систему. Данную команду необходимо
          выполнить до любой операции. Здесь CONTEST-ID - это
          идентификатор турнира, то есть число.
          SESSION-ID-FILE - это имя файла, в который будет
          записан идентификатор сессии (cookie). Файл с
          идентификатором сессии необходимо будет указать во
          всех командах.
          LOGIN - регистрационное имя пользователя, PASSWORD -
          пароль пользователя. Пользователь должен иметь биты
          полномочий MASTER_LOGIN или JUDGE_LOGIN для данного
          турнира.
serve-cmd CONTEST-ID logout SESSION-ID-FILE
          Команда завершения работы. После выполнения данной
          команды идентификатор сессии, находящийся в файле
          SESSION-ID-FILE, становится недействительным. Если
          команда logout не выполнена, идентификатор сессии
          действует 24 часа с момента выполнения команды login.
serve-cmd CONTEST-ID write-xml-runs SESSION-ID-FILE
          Данная команда выводит на стандартный поток вывода
          журнал посылок во внутреннем формате. См. далее
          описание команды "write XML runs" в документации на
          CGI-программу `master'.
serve-cmd CONTEST-ID export-xml-runs SESSION-ID-FILE
          Данная команда выводит на стандартный поток вывода
          журнал посылок во внешнем формате. См. далее описание
          команды "export XML runs" в документации на
          CGI-программу `master'.
serve-cmd CONTEST-ID dump-runs SESSION-ID-FILE
          Данная команда выводит на стандартный поток вывода
          журнал посылок в формате CSV, то есть в формате, в
          котором одна запись занимает одну строку, а поля
          записи разделяются символом ';' (точка с запятой).
          См. далее описание команды "dump XML runs" в
          документации на CGI-программу `master'.
serve-cmd CONTEST-ID soft-update-stand SESSION-ID-FILE
          Данная команда обновляет таблицу текущих результатов.
          При этом учитывается промежуток времени, когда таблица
          текущих результатов не должна обновляться. В это время
          данная команда не производит никакого эффекта. Эта
          команда может использоваться после того, когда в
          турнир были проимпортированы новые посылки с помощью
          команды import-xml-runs.
serve-cmd CONTEST-ID import-xml-runs SESSION-ID-FILE XML-FILE
          Данная команда импортирует новые посылки в работающий
          турнир. XML-FILE - это файл с XML-журналом посылок,
          который может быть либо во внешнем, либо во внутреннем
          формате. См. далее описание команды "import XML runs"
          в документации на CGI-программу `master'. Обратите
          внимание, что команда import-xml-runs не выполнится,
          если в текущий момент в турнире, в который
          импортируются посылки, есть посылки в состоянии
          компиляции или выполнения.
serve-cmd CONTEST-ID dump-source SESSION-ID-FILE RUN-ID
          Данная команда выводит на стандартный поток вывода
          исходный код посылки с номером RUN-ID.
serve-cmd CONTEST-ID dump-report SESSION-ID-FILE RUN-ID
          Данная команда выводит на стандартный поток вывода
          судейский протокол тестирования посылки с номером
          RUN-ID.
serve-cmd CONTEST-ID dump-team-report SESSION-ID-FILE RUN-ID
          Данная команда выводит на стандартный поток вывода
          пользовательский протокол тестирования посылки с
          номером RUN-ID.
serve-cmd CONTEST-ID dump-master-runs SESSION-ID-FILE FILTER-EXPR FIRST-RUN LAST-RUN
          Данная команда выводит на стандартный поток вывода
          список посылок, удовлетворяющих заданному критерию,
          как при задании выражения фильтра на главной странице
          программы `master'. FILTER-EXPR - это выражение
          фильтра, описание которого дано в соответствующем
          разделе документации. FIRST-RUN - это номер первой
          посылки, а LAST-RUN - это номер последней посылки.
          Отобранные посылки выводятся в формате CSV, в котором
          каждая запись занимает одну строку текста, а поля
          записи разделены символом '&'. Этот символ
          используется, так как он не может использоваться в
          полях. Запись имеет следующие поля:
          [0]  run_id
          [1]  imported_flag
          [2]  hidden_flag
          [3]  read_only_flag
          [4]  absolute_time
          [5]  absolute_time_nsec
          [6]  time_from_start
          [7]  ip_address
          [8]  size
          [9]  hash_value
          [10] user_id
          [11] user_login
          [12] user_name
          [13] problem
          [14] variant
          [15] language
          [16] language_suffix
          [17] status_num
          [18] status_str
          [19] tests_passed/failed_test
          [20] score_gained
          [21] base_score
          [22] score_multiplier
          [23] attempt
          [24] run_penalty
          [25] date_penalty
          [26] score_adjustment

serve-control
-------------
Новая CGI-программа для управлением сервером серверов турнира
`super-serve'. Программа `serve-control' использует управляющий
сокет программы `super-serve' для взаимодействия аналогично
тому, как программа `master' использует управляющий сокет для
взаимодействия с программой `serve'. Путь по умолчанию к
управляющему сокету программы `super-serve' задаётся с помощью
опции `--enable-super-serve-socket' скрипта `configure'. В
текущей версии системы ejudge требуемая функциональность
реализована в `serve-control' лишь частично. Так, в настоящее
время доступны лишь функции просмотра состояния турнира.

Для работы с программой `serve-control' у пользователя должен
быть установлен бит MASTER_LOGIN или JUDGE_LOGIN в глобальном
конфигурационном файле `ejudge.xml'.

slice-userlist
--------------
Новая программа, которая строит "срез" базы пользователей по
указанному множеству турниров. Программа используется следующим
образом:
slice-userlist [ -i CONTEST ]... [CONFIG_FILE]
здесь CONFIG_FILE - это путь к конфигурационному файлу
ejudge.xml. Если путь к конфигурационному файлу совпадает с
указанным в опции `--enable-ejudge-xml' скрипта `configure', то
есть с путём по умолчанию, то путь CONFIG_FILE можно не
указывать. CONTEST - это номер турнира. Опция -i может быть
указана несколько раз. В этом случае в "срез" базы пользователей
попадут все пользователи, зарегистрированные хотя бы в одном из
указанных турниров. Срез базы печатается на стандартный поток
вывода. Пример использования программы:
slice-userlist -i 10 -i 12

Обратите внимание, что для построения среза используется база
пользователей, находящяяся в файле базы, а не её текущее
состояние, хранящееся в памяти программы `userlist-server'. Если
состояние в памяти и состояние в файле рассогласованы, срез базы
окажется построенным по файлу, то есть будет немного устаревшим.

run
---
Исправлена ошибка, которая приводила к аварийному завершению
программы `run' по нехватке памяти в случае, если тестируемая
программа генерировала очень большой вывод на стандартный поток
вывода или стандартный поток ошибок (размер файла вывода должен
составлять 10 и более Мб в зависимости от размера оперативной
памяти). В предыдущей версии все выходные файлы тестируемой
программы считывались в память, а в текущей версии считываются в
память только файлы, размер которых не превышает максимального
размера, задаваемого с помощью глобальной конфигурационной
переменной `max_file_length' конфигурационного файла
`serve.cfg'.

serve
-----
В случае, если в момент времени, на который было запланировано
начало турнира (scheduled start time), программа `serve' не
работала, а была запущена позднее, в качестве времени начала
турнира устанавливается запланированное время старта турнира, а
не текущее время, как в предыдущей версии.

serve
-----
Исправлены многочисленные ошибки в коде слияния журналов посылки
(import XML logs). В частности, исправлена ошибка, приводившая к
очистке архивов посылок при слиянии журналов. Исправлена ошибка,
приводившая к появлению дубликатов записей в журнале посылок.

serve,master,judge
------------------
Добавлен новый статус посылки RUN_DISQUALIFIED
(дисквалифицирован). Статус может использоваться, например, для
снятия "списанных" посылок. Статус DISQUALIFIED аналогичен
статусу IGNORED, но при подсчёте очков учитывается как одна
попытка, и соответственно, за неё начисляется штраф, задаваемый
параметром run_penalty секции описания задачи конфигурационного
файла serve.cfg. В выражении фильтра посылок данный статус
задаётся как DQ, например, "status == DQ".

contest.xml
-----------
В формат конфигурационного файла описания турнира добавлены три
новых элемента: <serve_control_access>, <run_user>, <run_group>
и новый атрибут "invisible" элемента <contest>.

Атрибут "invisible" элемента <contest> может принимать значения
"yes" или "no". Если атрибут установлен в "yes", то данный
турнир не отображается в списке турниров в программе
`serve-control'. Значение атрибута по умолчанию - "no".

Элемент <serve_control_access> позволяет задать ограничение на
IP-адрес для управления турниром с помощью программы
`serve-control'.

Элемент <run_user> позволяет задать пользователя, под которым
будет запускаться программа `run', если турнир управляется
программой `super-serve', а элемент <run_group> позволяет задать
группу, под которой будет запускаться программа `run'. Если
какой-либо из элементов не задан, будет использоваться значение
соответствующего элемента <serve_user> или <serve_group>, а если
и они не заданы, программа `run' будет запускаться под тем же
пользователем/группой, под которой запущена программа
`super-serve'.

serve
-----
Исправлена ошибка, которая не позволяла сравнивать программы,
которые хранились в сжатом виде. В предыдущей версии выдавалась
ошибка "System call failed".

userlist.xml
------------
Добавлен новый атрибут "privileged" элемента <user> описания
пользователя. Атрибут может принимать значения "yes" или "no"
(по умолчанию - "no"). Если атрибут установлен в "yes", данный
пользователь считается привилегированным, то есть для того,
чтобы выполнить действие с этим пользователем, необходим более
высокий уровень полномочий, чем для обычного пользователя.
Например, чтобы редактировать данные обычных пользователей
достаточно бита полномочий EDIT_USER, а для редактирования
привилегированных пользователей необходим бит полномочий
PRIV_EDIT_USER.

edit-userlist
-------------
Поддерживается редактирование атрибута "privileged" (см. выше).

userlist-server
---------------
Поддерживается редактирование атрибута "privileged"
пользователей. Пользователь, у которого атрибут "privileged" не
установлен, не может устанавливать или сбрасывать этот атрибут у
других пользователей. Привилегированный пользователь может
только установить атрибут "privileged", но не сбросить его.

ejudge.xml
----------
В конфигурационный файл системы ejudge добавлены новые элементы
<super_serve_socket> - путь к управляющему сокету программы
super-serve, <super_serve_user> - идентификатор системного
пользователя, под которым будет запущена программа super-serve,
<super_serve_group> - идентификатор системной группы, под
которой будет запущена программа super-serve, <userlist_user> -
идентификатор системного пользователя, под которым будет
запущена программа userlist-server, <userlist_group> -
идентификатор системной группы, под которой будет запущена
программа userlist-server. В текущей версии системы запуск
программ userlist-server и super-serve под другими
идентификаторами пользователей пока не поддерживается.

serve,master,judge
------------------
В журнал посылок добавлено поле `score_adj'. Данное поле
используется в режимах турнира KIROV или OLYMPIAD и хранит
дополнительную поправку к количеству баллов за посылку,
полученному в результате автоматического тестирования. Поле
`score_adj' может принимать значения от -128 до 127 (1 знаковый
байт). Например, если по результатам автоматического
тестирования посылка получила 50 баллов, а дополнительная
поправка score_adj для данной посылки равна -20 баллам, посылка
будет оценена в 30 баллов, из которых будет затем вычтен штраф
за попытки или за время сдачи.

Если значение score_adj положительно и получается, что балл за
посылку превышает максимальный балл, установленный в
конфигурационной переменной `full_score' описания задачи, такая
посылка будет оценена в полный бал, как установлено переменной
`full_score'.

Добавлена новая конфигурационная переменная `score_multiplier'
секции описания задачи конфигурационного файла `serve.cfg'. Эта
переменная позволяет задать коэффициент, на который будет
умножено количество баллов, заданное в поле `score' записи в
журнале посылок. По умолчанию значение мультипликатора равно 1.

Таким образом, балл за посылку в системе KIROV или OLYMPIAD
вычисляется по следующей формуле:
S = I * M - A * P + D + J
здесь I - исходное количество баллов, хранящееся в поле `score',
то есть, как правило, количество баллов, полученное в результате
автоматического тестирования. Обратите внимание, что если статус
посылки - OK, и для данной задачи не установлена
конфигурационная переменная `variable_full_score', то в качестве
исходного количества баллов всегда будет выбран полный балл за
задачу (переменная `full_score' секции описания задачи)
независимо от значения поля `score' записи в журнале посылок.
M - это мультипликатор (переменная `score_multiplier' секции
описания задачи, или 1 по умолчанию). A - количество предыдущих
попыток по данной задаче данного пользователя. P - штраф за одну
попытку (переменная `run_penalty' секции описания задачи). D -
календарный штраф (переменная `date_penalty' секции описания
задачи). J - дополнительная поправка к баллам (переменная
score_adj секции описания задачи). Полученное значение S не
может быть большее значения переменной `full_score' секции
описания задачи (тогда берётся значение `full_score') либо быть
меньше 0 (берётся 0).

serve,master,judge,team
-----------------------
В режиме турнира KIROV или OLYMPIAD в поле "баллы" таблицы
посылок пользователя отображается формула, по которой
вычислялись баллы за данную посылку. Формула отображается
следующим образом:
S
(то есть просто количество баллов), если
M == 1 && (A == 0 || P == 0) && D == 0 && J == 0, то есть тогда,
когда исходное количество баллов I не модифицируется.
Второй вид отображения формулы - полный:
S = I [ * M ] [ - A * P ] [ +/- D ] [ +/- J ]
если M == 1, то соответствующая часть формулы не отображается,
аналогично для A * P == 0, D == 0, J == 0.

serve,master,judge
------------------
Для поддержки новых возможностей управления пользователями
переработана страница просмотра участников турнира. Теперь
вместо трёх кнопок "Ban", "Make Invisible" и т. д. добавлена
ссылка на страницу отображения информации об участнике. 

На странице отображения информации об участнике отображаются его
идентификатор, регистрационное имя, является ли данный
пользователь привилегированным, является ли он невидимым и
кнопка изменения статуса невидимости (если текущий пользователь
имеет достаточно полномочий), является ли участник
дисквалифицированным (banned) и кнопка изменения статуса
дисквалификации (если текущий пользователь имеет достаточно
полномочий), является ли участник заблокированным (locked) и
кнопка изменения статуса блокировки, количество посылок, общий
размер посылок, количество сообщений, общий размер сообщений,
общее число напечатанных страниц, дополнительный статус
участника (см. ниже) и кнопка изменения дополнительного статуса
участника (если достаточно полномочий), общее количество
предупреждений (см. ниже), все вынесенные предупреждения, а
также форма нового предупреждения (если достаточно полномочий).

Поддерживается возможность выносить участникам турнира
предупреждения (например, за нарушение правил и т. п.).

Чтобы пользователь мог просматривать список участников турнира,
он должен иметь полномочия MASTER_LOGIN или JUDGE_LOGIN и
LIST_CONTEST_USERS. Чтобы пользователь мог просматривать
подробную информацию об участниках, он должен дополнительно
иметь полномочия GET_USER. Чтобы иметь возможность изменять
параметры участника турнира (то есть делать невидимым, выносить
предупреждения, менять статус и т. д.), необходим бит полномочий
EDIT_REG.

serve
-----
Добавлена возможность спецификации дополнительного статуса
участника. Дополнительный статус - это произвольная строка.
Множество дополнительных статусов участников задаётся в
конфигурационном файле турнира serve.cfg, далее на страцице
просмотра и редактирования информации об участнике статус может
быть изменён. Общее количество различных статусов задаётся с
помощью глобальной конфигурационной переменной
`contestant_status_num', затем с помощью конфигурационной
переменной `contestant_status_legend' должны быть заданы строки
для всех статусов. Первый статус получает номер 0, второй - 1
и т. д. Каждый участник турнира получит статус по умолчанию,
равный 0, который затем может быть изменён. Пример задания
статусов:
contestant_status_num = 3
contestant_status_legend = "Status 0"
contestant_status_legend = "Status 1"
contestant_status_legend = "Status 2"

Дополнительно для части или всех статусов может быть задан
HTML-атрибут, с которым будет отображаться строка таблицы
текущих результатов участников турнира с данным статусом.
Для этого используется глобальная конфигурационная переменная
`contestant_status_row_attr'. Переменная может не использоваться
в конфигурационном файле, но если она используется,
дополнительные атрибуты должны быть заданы для всех статусов.
Дополнительные атрибуты задаются в том же порядке, что и
значения статусов, например:
contestant_status_row_attr = ' bgcolor="#ff00ff"'
contestant_status_row_attr = ""
contestant_status_row_attr = ' bgcolor="#00ff00"'
установит для статуса `Status 0' дополнительный атрибут строки
` bgcolor="#ff00ff"', для статуса `Status 2' - 
` bgcolor="#00ff00"',  а для `Status 1' - пустая строка, что
эквивалентно отсутствию атрибута. Обратите внимание на пробел в
начале значения атрибута. Он необходим для разделения тега <tr>
HTML-таблицы и дополнительного атрибута.

С помощью глобальной переменной `stand_show_contestant_status'
можно включить отображение столбца статуса участников. Для
каждого участника будет напечатан его статус, как задано в
переменной `contestant_status_legend'. С помощью глобальной
конфигурационной переменной `stand_contestant_status_attr' можно
задать дополнительные атрибуты этого столбца, например:
stand_show_contestant_status
stand_contestant_status_attr = ' width = "10%"'
Обратите внимание на пробел в начале значения атрибута. Он
необходим для разделения тега <td> и значения атрибута.

serve,master,judge,team
-----------------------
Добавлена возможность вынесения участникам турнира
предупреждений. Каждое вынесенное участнику предупреждение
отображается на его персональной странице в её начале. Участнику
доступен основной текст предупреждения и время отправки
предупреждения. 

Если пользователь имеет достаточно полномочий для просмотра
подробной информации об участнике (т. е. установлены биты
полномочий MASTER_LOGIN/JUDGE_LOGIN + LIST_CONTEST_USERS +
GET_USER, на странице подробной информации для участника турнира
отображаются предупреждения, вынесенные участнику, при этом
отображается: 1) время выдачи предупреждения, 2) имя
пользователя, который выдал предупреждение, 3) IP-адрес
компьютера, с которого было выдано предупреждение, 3) основной
текст предупреждения, 4) дополнительный текст предупреждения,
доступный только привилегированным пользователям.

Если пользователь к тому же имеет бит полномочий EDIT_REG, он
может выносить предупреждения. Для этого он должен задать
основной текст предупреждения, который будет доступен участнику,
и может задать дополнительный текст предупреждения, который
будет доступен только привилегированным пользователям. Затем
необходимо нажать кнопку "Issue Warning".

Если установлена глобальная конфигурационная переменая
`stand_show_warn_number' (см. ниже) файла `serve.cfg', в таблице
текущих результатов отображается общее количество
предупреждений, полученных каждым участником.

serve
-----
Добавлена новая глобальная конфигурационная переменная
`stand_show_warn_number'. Если эта переменная установлена, в
таблице текущих результатов печатается столбец с общим
количеством предупреждений для каждого участника. С помощью
глобальной конфигурационной переменной `stand_warn_number_attr'
можно задать HTML-атрибуты этого столбца, например:
stand_show_warn_number
stand_warn_number_attr = ' width = "5%"'
Обратите внимание на пробел в начале значения атрибута. Он
необходим для разделения тега <td> и значения атрибута.

serve
-----
Для хранения предупреждений и статуса участника турнира изменён
формат XML-файла дополнительной информации об участнике. Формат
совместим снизу вверх с форматом предыдущей версии программы
ejudge. В формат добавлены новые элементы <warnings>, <warning>,
<text>, <comment>, <status> и новые атрибуты "ussuer_id",
"issuer_ip", "date" для элемента <warning>.

serve
-----
При генерации таблицы текущих результатов невиртуальных турниров
посылки, время которых больше текущего времени, игнорируются.
Такая ситуация может возникать при проведении турнира в
нескольких точках, когда моменты начала турнира существенно
различаются.

serve
-----
Если в архивных каталогах отсутствует какой-либо файл (исходный
текст, протокол или пользовательский протокол), при попытке его
просмотра выдаётся ошибка, что файл не существует, вместо ошибки
"System call failed".

serve
-----
Добавлена конфигурационная переменная `personal_deadline' секции
описания задачи конфигурационного файла `serve.cfg'. Данная
переменная позволяет устанавливать крайний строк сдачи данной
задачи для указанного пользователя. Переменная может быть
использована несколько раз в описании задачи, и каждое
использование задаёт крайний срок для одного пользователя.
Формат конфигурационной переменной следующий:
LOGIN [DATE [TIME]]
здесь LOGIN - это регистрационное имя пользователя, для которого
устанавливается крайний срок сдачи задания, TIME -
необязательное время суток в формате HH:MM:SS, а DATE - дата в
формате YYYY/MM/DD. Если TIME отсутствует, принимается значение
времени, равное 00:00:00, а если TIME и DATE отсутствуют,
крайний срок устанавливается в 2038/01/19 00:00:00. Персональный
крайний срок имеет приоритет над крайним сроком для всех
пользователей, устанавливаемым с помощью конфигурационной
переменной `deadline' секции описания задачи.

serve,master,judge,team
-----------------------
В выпадающем меню выбора задачи при сдаче решения помимо
крайнего срока сдачи указывается календарный штраф, который
будет наложен на посылку.

master
------
При установке запланированного времени начала турнира возможно
как задание времени начала в краткой форме в формате HH:MM, так
и задание времени начала в полной форме в формате
"YYYY/MM/DD hh:mm:ss". Таким образом можно задавать время начала
турнира не в текущих сутках.

serve
-----
Добавлена опция командной строки `-f'. Если опция указана, перед
созданием управляющего сокета старый файл сокета удаляется.
Данная опция полезна при перезапуске системы после аварийного
завершения работы программы или операционной системы.

Добавлена опция командной строки `-i'. Если опция указана,
производятся все действия по инициализации турнира (создание
необходимых каталогов и файлов), а затем программа завершает
работу.

Исправлена ошибка, из-за которой программа `serve' могла
"подвисать" для всех пользователей, так как была заблокирована
из-за ожидания завершения передачи данных по медленному каналу.

При выполнении привилегированных команд не требуется указание
корректного идентификатора пользователя в структуре пакета
команды. Идентификатор пользователя берётся из структуры,
описывающей соединение, по которому пришёл управляющий пакет.

userlist-server
---------------
Добавлена опция командной строки `-f'. Если опция указана, перед
созданием управляющего сокета старый файл сокета удаляется.
Данная опция полезна при перезапуске системы после аварийного
завершения работы программы или операционной системы.

Исправлена ошибка, из-за которой программа `userlist-server'
могла "подвисать" для всех пользователей, так как была
заблокирована из-за ожидания завершения передачи данных по
медленному каналу.

Один и тот же cookie может использоваться для привилегированного
входа в различные турниры, если у пользователя достаточно на это
полномочий. В предыдущей версии ejudge каждый привилегированный
cookie жёстко привязывался к одному турниру.

Если запрашиваемый уровень привилегий при привилегированном
входе в турнир выше, чем максимально допустимый (т. е.,
например, запрашивается уровень привилегий ADMIN, хотя данный
пользователь имеет только уровень привилегий JUDGE), уровень
привилегий понижается. В предыдущей версии в этом случае
выдавалась ошибка "Permission denied".

При привилегированном входе идентификатор турнира может быть
равен 0, в этом случае предполагается, что пользователь входит в
программу serve-control. Тогда проверяемые полномочия
пользователя берутся из глобального конфигурационного файла
ejudge.xml.

При генерации случайных паролей пароли не генерируются для
невидимых, заблокированных, дисквалифицированных и
привилегированных пользователей.

run
---
Исправлена критическая ошибка, связанная с тем, что проверяющей
программе на вход передавался путь к файлу исходных данных теста
в текущем каталоге, то есть в рабочем каталоге тестируемой
программы. При некоторых условиях тестируемая программа могла
модифицировать свой входной файл. В текущей версии в качестве
пути к входному файлу теста передаётся путь к входному файлу в
архивном каталоге.

Версия 2.1.33 (20041029)
========================
Реализована поддержка языка Java компилятора и среды выполнения
JDK (тестировалось с Sun JDK 1.4.2 и Sun JDK 1.5.0, должно
работать с другими совместимыми реализациями JDK). Утилита
конфигурирования configure поддерживает новую опцию --with-javac
с помощью которой можно указать путь к компилятору javac в
составе JDK. Обратите внимание, что это должен быть полный путь
к программе, например, /usr/local/java/bin/javac. Если
--with-javac не указана, производится поиск по каталогам в
переменной окружения PATH.

Для компиляции Java-программ используется скрипт javac, а для
запуска - скрипт runjava, то есть требуется указание параметра
start_cmd = "runjava"
в секции описания тестера для Java-программ. Скрипт runjava
требует для своей работы установленной переменной
EJUDGE_PREFIX_DIR, если только не будет указан полный путь к
файлу политики безопасности. Таким образом, набор необходимых
конфигурационных параметров для тестировщика Java-программ
следующий:
kill_signal = TERM
arch = java
start_env = "EJUDGE_PREFIX_DIR"
start_cmd = runjava

Кроме этого в переменной окружения EJUDGE_JAVA_FLAGS могут
передаваться дополнительные параметры для java-машины, например,
устанавливающие максимальный размер кучи и стека:
start_env = "EJUDGE_JAVA_FLAGS=-Xmx64M -Xss8M"

По умолчанию Java-программы запускаются с установленной жесткой
политикой безопасности, которая позволяет только чтение со
стандартного потока ввода и вывод на стандартный поток вывода.
Поддерживается политика безопасности, при которой работающей
программе разрешено чтение и запись файлов в текущем каталоге.
Такая политика безопасности включается с помощью установки
перемнной окружения EJUDGE_JAVA_POLICY следующим образом.
start_env = "EJUDGE_JAVA_POLICY=fileio.policy"
В переменной окружения EJUDGE_JAVA_POLICY возможно задание
произвольной политики безопастности. Может быть указан либо
полный путь, либо имя файла политики. В последнем случае файл
политики должен находиться в каталоге
${EJUDGE_PREFIX_DIR}/share/ejudge.

Возможно полное отключение политики безопасности. Для этого
переменная окружения EJUDGE_JAVA_POLICY должна быть установлена
в значение none следующим образом:
start_env = "EJUDGE_JAVA_POLICY=none"

Программы на Java должны удовлетворять следующим условиям:
  1) они должны содержать единственный класс с именем Main;
  2) допускаются вложенные в Main классы;
  3) класс Main должен содержать метод main.

Исправлены ошибки работы с каледарным временем, когда из-за
неправильно инициализированной переменной (точнее, поля флага
летнего времени) время могло отличаться на 1 час от
астрономического времени.

В базу данных пользователей добавлено новое поле languages,
предназначенное для указания сред программирования, в которых
работает участник (команда). Поле languages может быть сделано
обязательным или необязательным для заполнения при регистрации
на турнире с помощью элемента
<field="languages" mandatory="yes">
или
<field="languages" mandatory="no">
файла конфигурации турнира contest.xml.

configure
---------
Добавлена опция командной строк --with-javac (см. выше).

edit-userlist
-------------
Поддерживается редактирование поля languages (см. выше).

ejudge-setup
------------
Поддерживаются компилятор языка Java и среда выполнения JDK
(см. выше).

serve
-----
В таблице текущего положения участников (как в режиме ACM, так и
в режиме KIROV/OLYMPIAD) внизу таблицы печатается статистика по
сдачам каждой задачи. Для каждой задачи указывается общее число
посылок по этой задаче, число успешных посылок и процент
успешных посылок.

Добавлена глобальная конфигурационная переменная
stand_show_ok_time файла serve.cfg и конфигурационная переменная
задачи stand_hide_time. Обе переменных действуют только в режиме
турнира KIROV. Если глобальная переменная stand_show_ok_time
установлена в ненулевое значение, в таблице текущих результатов
печатается время успешной сдачи задания (оно может быть как
относительным от начала турнира, так и астрономическим в
зависимости от значения глобальной конфигурационной переменной
show_astr_time). Переменная stand_hide_time отменяет печать
времени успешной сдачи для отдельной задачи.

В таблице текущих результатов корректно вычисляется календарный
штраф по задаче.

Добавлена конфигурационная переменная start_date секции описания
задачи файла serve.cfg. В этой переменной указывается
астрономическое время, начиная с которого данная задача
становится доступной для сдачи.

Спецификация календарного штрафа может иметь одну из следующих
форм:
DATE TIME PENALTY               напр.   2004/10/10 12:00 -10
или
DATE PENALTY                    напр.   2004/10/12 -20
или
PENALTY                         напр.   -30
в последнем случае дата предполагается достаточно большой
(2038/01/19 - то есть максимум, который позволяет точность типа
time_t).

Исправлена ошибка в работе с вариантными задачами.

Поддерживаются новые форматные преобразования. Форматные
преобразования, например, используются в глобальной
кофигурационной переменной stand_extra_format. Поддерживаются
следующие форматные преобразования:
%Mf       - короткое имя факультета участника
%MF       - короткое имя факультета участника на англ. языке
%Md       - полное имя факультета участника
%MD       - полное имя факультета участника на англ. языке
%Mp       - имя принтера, назначенного данному участнику

run
---
Добавлена специальная поддержка для спецификации переменной
окружения "EJUDGE_PREFIX_DIR", передаваемой в тестируемую
программу. В этом случае в переменные окружения добавляется
переменная EJUDGE_PREFIX_DIR со значением, равным префиксу
инсталляции системы ejudge (то есть значению опции --prefix
программы configure). Пример использования:
[tester]
start_env = "EJUDGE_PREFIX_DIR"

Расширенный генератор звуков (то есть по умолчанию генератор
речи festival) поддерживается и в режиме турнира KIROV. Для
включения генератора речи необходимо при конфигурировании
системы корректно указать путь к корню инсталляции системы
festival и задать следующие глобальные переменные:
sound_player = "${script_dir}/festival"
extended_sound

Исправлена ошибка при разборе файлов дополнительной информации о
тестах (.inf), связанная с неправильной обработкой символов
кавычек внутри строк.

master
------
Исправлена ошибка в обработке команды "Rejudge displayed". Эта
ошибка приводила к аварийному завершению программы master.

userlist-server,master
----------------------
При генерации случайных паролей в таблице новых паролей
печатается размещение команды (то есть значение поля location).

register
--------
Поддерживается поле `languages' (см. выше).

collect-emails
--------------
Новая утилита, которая извлекает из базы пользователей адреса
email всех пользователей, зарегистрированных на некоторое
множество турниров.

Версия 2.1.32 (20041001)
========================
Добавлена поддержка библиотеки reuse версии 4. Система ejudge
может быть скомпилирована как с библиотекой reuse версии 3,
так и с библиотекой reuse версии 4. Новая версия reuse
использует стандартные инструменты autoconf/automake/libtool.
Кроме того, в ней исправлены некоторые ошибки в модуле
интерфейса запуска процессов, которые приводили к необнаружению
ошибки типа "Time-limit exceeded" в некоторых случаях.

Реализован интерфейс к программам-генераторам речи. В качестве
генератора речи автоматически поддерживается программа
festival. В базу данных пользователей для каждого пользователя
добавлено поле `spelling', которое может быть изменено только
привилегированным пользователем (не самим пользователем).
Значение этого поля может отражать нюансы произношения имени
пользователя генератором речи.

Добавлена возможность направлять запрос на печать, посланный
пользователем, на поименованный принтер. Для этого в базу
данных пользователей для каждого пользователя добавлено поле
`printer_name', которое может быть изменено только
привилегированным пользователем. Данное поле указывает имя
очереди принтера и будет передано в качестве аргумента
опции `-P' команды `lpr'.

configure
---------
Поддерживается reuse-4. Если скрипт `reuse-config' находится в
каталоге, указанном в переменной PATH, все необходимые опции
компилятора для использования reuse будут определены
автоматически, и указание опции `--with-reuse' не обязательно.

Добавлена опция `--with-festival=FEST_PATH', с помощью которой
можно указать каталог, в котором проинсталлирован генератор речи
festival. FEST_PATH должен быть указан таким образом, чтобы
программа festival находилась в каталоге ${FEST_PATH}/bin.
В настоящий момент правильность указания FEST_PATH не
контролируется.

serve, compile, run
-------------------
В конфигурационном файле турнира serve.cfg допускаются директивы
условной компиляции, аналогичные директивам препроцессора Си.
Эти директивы позволяют включать или выключать фрагменты
конфигурационного файла в зависимости от окружения системы. В
данной версии поддержка условной компиляции реализована в
ограниченном объёме. В дальнейшем планируется реализовать полную
поддержку выражений.

Пока поддерживаются операции сравнения ==, !=, >=, <=, >, < для
строк и чисел, а также логические связки && и ||. В выражениях
могут участвовать целые числа, записываемые в только в
десятичном виде, строки, записываемые как в Си, и
предопределённые переменные. Для хранения целых чисел
используется 64-битный тип long long. Поддерживаются следующие
предопределённые переменные:

name    | type      | desc
host    | string    | Имя комьютера, на котором запущена данная
        |           | программа.
mode    | long long | Код стартующей программы: 0 - `serve',
        |           | 1 - `compile', 2 - `run'.
major   | long long | Старший номер версии системы.
minor   | long long | Средний номер версии системы.
patch   | long long | Младший номер версии системы.
build   | long long | Порядковый номер перекомпиляции.
managed | long long | 1, если программа запущена из-под
        |           | super-serve, и 0 в противном случае

Синтаксис директив условной компиляции аналогичен синтаксису
директив условной компиляции препроцессора языка Си. Директива
условной компиляции должна начинатся с символа `@' --- первого
непробельного символа в строке. Поддерживаются директивы `@if,'
`@elif', `@else', `@endif'.  Синтаксис каждой директивы приведён
ниже.
@if expression
@elif expression
@else
@endif

В конфигурационном файле турнира serve.cfg поддерживаются
суффиксы `M', `K' для числовых параметров. Суффикс `K' означает
умножение на 1024, а `M' --- на 1024*1024. Например,
max_vm_size = 8M

serve, compile
--------------
Незначительно изменён формат управляющего пакета запроса на
компиляцию. В конце пакета (после всех переменных окружения)
теперь должно стоять число 0.

serve, run
----------
Изменён формат управляющего пакета запроса на тестирование. В
новом формате корректно реализована поддержка строк, содержащих
произвольные символы, и неограниченной длины. Кроме этого,
программа `serve' передаёт программе `run' идентификатор
пользователя, имя пользователя (первое из установленных полей
`spelling', `name', `login'), имя задачи (первое из
установленных полей `spelling', `short_name' описания задачи),
которые могут быть затем переданы программе-генератору речи.

В раздел описания задачи файла serve.cfg добавлено поле
`spelling', которое позволяет задать особенности произношения
имени задачи генератором речи.

edit-userlist
-------------
Поддерживается редактирование нового поля `spelling' информации
пользователя.

Поддерживается редактирование нового поля `printer_name' информации
пользователя.

master
------
Улучшена диагностика, выдаваемая, когда пользователь с
административными привилегиями пытается войти в турнир, на
который он не зарегистрирован.

Улучшена диагностика, выдаваемая, когда пользователь пытается
войти в турнир, сервер которого не работает.

run
---
Реализован интерфейс с генератором речи. Если новая глобальная
конфигурационная переменная `extended_sound' файла serve.cfg
установлена, программе-генератору звука, указываемому в
глобальной конфигурационной переменной serve.cfg, передаются
дополнительные параметры: статус завершения, номер теста, имя
пользователя, имя задачи. Эта программа-генератор звука может
использовать эти данные для генерации соответствующего
сообщения. В этом случае глобальные конфигурационные переменные
accept_sound и т. д. не используются.

Для глобальной конфигурационной переменной `sound_player' при
инициализации выполняется подстановка переменных. Таким образом,
можно устанавливать значение этой переменной, например,
следующим образом:
sound_player = "${script_dir}/festival"

run
---
Убрано неявное ограничение на 254 теста для одной задачи. В
предыдущей версии это ограничение не проверялось, что приводило
к краху программы, если какая-либо из задач содержала большее
количество тестов. Теперь количество тестов не ограничено,
память под хранение информации о тестах автоматически
расширяется.

run
---
Ослаблены требования к именованию файлов тестов, правильных
ответов и т. д. В конфигурационном файле описания турнира
serve.cfg в глобальной секции или в секции описания задачи могут
использоваться переменные `test_pat', `corr_pat', `info_pat',
`tgz_pat'. Значение этой переменной должно представлять собой
форматную строку оператора printf, которая используется при
генерации имени файла теста. Дополнительно в функцию printf
будет передаваться целое число - номер теста. Если используется
переменная X_pat, то соответствующая переменная X_sfx не
используется.

Например, имена тестов по умолчанию при значении переменной
test_sfx=".dat" моделируются с помощью переменной test_pat
следующим образом:
test_pat = "%03d.dat"

serve
-----
В режиме турнира ACM поддерживаются три режима округления
времени, прошедшего от начала турнира, до минут при подсчёте
штрафа за сданную задачу. Режим выбирается установкой глобальной
конфигурационной переменной `rounding_mode' файла конфигурации
турнира serve.cfg. Конфигурационная переменная может принимать
следующие значения:
  o ceil (по умолчанию) - берётся минимальное целое количество
    минут, не меньшее времени от начала турнира до момента сдачи
    задания.
  o floor - берётся максимальное целое количество минут, не
    превосходящее время от начала турнира до момента сдачи
    задания. 
  o round - количество минут получается округлением секунд до
    минут (то есть если прошло >= 30 секунд, берётся число минут
    на 1 большее).

team
----
Улучшена диагностика, выдаваемая, когда пользователь пытается
войти в турнир, сервер которого не работает.

userlist-server
---------------
Реализован режим демона. Режим демона включается указанием в
командной строке ключа -D. В режиме демона программа переходит в
фоновый режим и отключает вывод на стандартный поток вывода,
направляя диагностический вывод в файл журнала. Путь к файлу
журнала задаётся с помощью нового элемента <userlist_log>
конфигурационного файла ejudge.xml. Если данный элемент в
конфигурационном файле не установлен, userlist-server в режиме
демона запускаться отказывается. В режиме демона вывод в файл
журнала не содержит некоторых справочных сообщений, доступных в
основном режиме работы программы.

Формат выдачи сообщений в файл журнала достаточно сильно изменён,
чтобы сделать его более кратким и более рациональным, а также
упростить разбор журнала программами-анализаторами журналов.

master,serve
------------
Привилегированный пользователь может сразу добавлять в базу
посылок посылку с нужными параметрами, а не выполнять сначала
команду submit_run, а затем edit_run. Для этого у пользователя в
контесте должны быть установлены полномочия SUBMIT_RUN и
EDIT_RUN. Форма заполнения информации о новой посылке доступна
по ссылке "Add new run", расположенной под диалогом об отправке
решения на проверку на главной странице программы master.

Новые записи, добавленные таким образом в базу посылок, не
отправляются автоматически на тестирование.

serve
-----
Скрытые посылки (hidden runs) могут редактироваться и пересуживаться
до начала турнира.

users,register,master,judge,team
--------------------------------
Реализована поддержка IPv6 адреса ::1 (localhost). Он трансформируется
в адрес 127.0.0.1.

run
---
Исправлена ошибка, заключавшаяся в ненаследовании имени стандартной
проверяющей программы (standard_checker) из описания задачи в
описание тестера для задачи.

edit-userlist
-------------
Устранена утечка памяти при просмотре списка всех пользователей,
внесённых в базу.

Устранена утечка при разборе XML-файлов. Утечка памяти происходила
при разборе любого XML-файла, что затрагивало все программы системы
ejudge.

serve
-----
Добавлена возможность запуска произвольной программы в момент начала
турнира. Эта программа, например, может изменять права доступа
к условиям задач на web-сервере. Для этого в конфигурационном файле
serve.cfg поддерживается новая конфигурационная переменная
contest_start_cmd, которая может быть установлена в имя программы.
Если указывается полный путь к программе (то есть строка, начинающаяся
с '/'), то программа будет запущена из этого пути. Если указывается
относительный путь, полный путь вычисляется относительно глобальной
конфигурационной переменной conf_dir.

Если в глобальных конфигурационных переменных stand_header_file,
stand_footer_file, stand2_header_file, stand2_footer_file,
plog_header_file, plog_footer_file указан относительный путь,
полный путь вычисляется относительно глобальной конфигурационной
переменной conf_dir.

contest.xml
-----------
Если элемент <root_dir> установлен, он должен быть абсолютным
путём к каталогу.

В конфигурационный файл турнира contest.xml добавлен новый элемент
<conf_dir>. Этот элемент содержит путь к каталогу конфигурационных
файлов турнира. Если элемент <root_dir> установлен, то значение
по умолчанию элемента <conf_dir> установливается в <root_dir>/conf.

Если в элементах <register_header_file>, <register_footer_file>,
<users_header_file>, <users_footer_file>, <team_header_file>,
<team_footer_file> указаны относительные пути, полный путь
вычисляется относительно значения элемента <conf_dir>

ejudge.xml
----------
Добавлен новый элемент <var_dir>. В этом элементе хранится путь
к каталогу файлов журналов программ userlist-server, super-serve,
compile. Он используется как путь, относительно которого
вычисляется полный путь, если значения элементов <userlist_log>,
<super_serve_log> и <compile_log> не являются абсолютными путями.

Добавлены новые элементы <super_serve_log>, <compile_log> для
задания пути к файлам журналов утилит super-serve и compile.
Однако, режим демона в этих утилитах пока не реализован.

ejudge-setup
------------
Поддерживается настройка элемента <var_dir> конфигурационного
файла ejudge.xml.

Версия 2.1.31 (20040620)
========================
Существенно улучшена работа с кодировками символов. Из исходного
кода убраны все явные упоминания о кодировке "KOI8-R" и заменены
на кодировку, заданную пользователем в опции --enable-charset
скрипта configure. Если данная опция не была указана,
используется кодировка "UTF-8".

Теперь при разборе XML-файлов выполняется преобразование из
кодировки, указанной в заголовке XML-файла, во внутреннюю
кодировку, задаваемую конфигурационной опцией --enable-charset.
Для этого используется функция `iconv' стандартной библиотеки,
поэтому поддерживаюся почти все существующие кодировки.
Внутренняя кодировка должна быть совместима со строковыми
функциями стандартной библиотеки языка Си, т. е. не должна в
середине строк содержать нулевой байт. Например, UTF-16 не
является такой кодировкой, а UTF-8 --- является.

При генерации HTML-файлов в их заголовок проставляется
кодировка, указанная в конфигурационных файлах (по умолчанию ---
это внутренняя кодировка), однако перекодирование строк из
внутренней кодировки в кодировку HTML-файлов пока не
поддерживается, поэтому в текущей версии системы кодировка
генерируемых HTML-файлов и внутренняя кодировка должны
совпадать. Следовательно, явное задание кодировки генерируемых
HTML-файлов в конфигурационных файлах не рекомендуется.

serve
-----
Удалена конфигурационная переменная `standings_charset'.
Реализация её поддержки в предыдущих версиях была некорректной и
небезопасной. Возможно, когда будет реализована поддержка
перекодировки строк из внутренней кодировки в кодировку HTML
документов данная конфигурационная переменная будет
восстановлена.

ejudge-setup
------------
Исправлено несколько ошибок в функции генерации настроечного
скрипта.

Версия 2.1.30 (20040619)
========================
Полностью переработана процедура компиляции и инсталляции
системы в сторону большего соответствия стандартам GNU. Процесс
инсталляции системы и настройки тестового турнира подробно
описан в файле INSTALL.RUS. Для настройки под текущую систему
теперь используется скрипт configure, генерируемый с помощью
утилиты autoconf. Утилита configure принимает большое количество
опций, которые подробно описаны в файле INSTALL.RUS.

configure
---------
При конфигурировании системы с помощью configure можно указать
значения по умолчанию для важнейших конфигурационных параметров
системы ejudge, например, для пути к каталогу файлов
конфигурации турниров или для пути к сокету связи с сервером
базы пользователей и т. д. Теперь если соответствующая
переменная в конфигурационном файле не установлена, программы
системы ejudge будут использовать "встроенное" (т. е. указанное
при конфигурировании системы) значение. В случае CGI-программ
`master', `judge', `team', `register', `users' это позволяет
вообще обходиться без конфигурационных файлов, если значения
всех переменных заданы при конфигурировании системы. Если
используется путь к конфигурационному файлу, заданный при
конфигурировании системы, можно не указывать его как параметр
запуска программ edit-userlist, userlist-server и т. д.
Таким образом, процесс конфигурирования системы ejudge перенесён
отчасти и на процесс компиляции системы из исходников.

Использование скрипта configure позволяет автоматически
адаптироваться к некоторым вариантам системы Linux. Так, если в
системе не установлен патч на ядро для понижения привилегий
процессов, не будут компилироваться соответствующие утилиты.
Если не установлены утилиты локализации, локализация будет
отключена. Для более подробного описания см. INSTALL.RUS.
По прежнему поддерживается только Linux, попыток переноса
системы на другие платформы пока не принималось.

Скрипт configure определяет присутствие в системе некоторых
систем программирования на языках C, C++, Java, Pascal и др. В
случае их обнаружения автоматически настраиваются скрипты
компиляции. Если системы программирования располагаются не в
стандартных каталогах, их местоположение можно указать явно с
помощью ключей configure.

ejudge-setup
------------
Появилась новая утилита ejudge-setup, предназначенная для
начальной настройки системы ejudge после её компиляции. Утилита
предоставляет интерфейс меню и работает в консольном режиме. С
помощью неё можно уточнить настройки системы ejudge. Задача этой
утилиты --- сгенерировать настроечный скрипт, который, будучи
выполненым, создаст все необходимые каталоги и скопирует в них
необходимые файлы. Утилита начальной настройки может запускаться
из-под обычного непривилегированного пользователя, в то время
как для выполнения настроечного скрипта необходимы, как правило,
привилегии суперпользователя root.

Сгенерированная утилита начальной настройки создаёт все
необходимые конфигурационные файлы, создаёт базу пользователя с
единственным пользователем (параметры которого определяются с
помощью ejudge-setup), обладающим всеми полномочиями системы
ejudge, создаёт конфигурационные файлы для сервера компиляции с
поддержкой всех обнаруженных при конфигурировании системы систем
программирования, создаёт конфигурационные файлы для тестового
турнира и копирует тесты в каталог тестового турнира. Кроме
этого автоматически создаётся рабочий диск для тестирования
программ, а также в каталог CGI-программ веб-сервера
устанавливаются символические ссылки на CGI-программы системы
ejudge.

Скомпилированные программы и файлы, необходимые для их работы,
по команде `make install' инсталлируются в каталог, указанный с
помощью опции --prefix=PREFIX скрипта configure. Если эта опция
не указана, используется путь по умолчанию, равный
HOME/inst-ejudge, где HOME --- домашний каталог пользователя,
запустившего configure. В каталоге PREFIX при инсталляции
создаются следующие каталоги:
        bin/            исполняемые файлы
        cgi-bin/        исполняемые файлы CGI программ
        include/        заголовочные файлы библиотеки libchecker
        lib/            объектные модули библиотеки libchecker
        libexec/ejudge  различные вспомогательные скрипты и программы
        share/ejudge    исходный код библиотеки testlib (pascal)
        share/locale    каталог сообщений
То есть, за исключением каталога cgi-bin структура каталогов
соответствует стандартам GNU.

ejudge-config
-------------
Данный скрипт предназначается для получения информации о
параметрах системы ejudge (точнее, библиотеки libchecker),
необходимой для компиляции проверяющих программ. Скрипт
поддерживает следующие опции:
        --cflags
                возвращает флаги, необходимые для компилятора
                языка Си (например, путь к каталогам
                заголовочных файлов)
        --ldflags
                возвращает флаги, необходимые для компоновщика
        --libs
                возвращает необходимые библиотеки

Таким образом, для компиляции проверяющей программы можно
использовать следующую командную строку:
gcc `ejudge-config --clags --ldflags` prog.c -o prog `ejudge-config --libs`
Здесь предполагается, что скрипт ejudge-config находится в
каталоге, указанном в переменной PATH.

ejudge.xml
----------
Для хранения новых конфигурационных переменных расширен набор
тегов в файле ejudge.xml. Поддерживаются следующие новые теги:
charset, config_dir, contests_home_dir, full_cgi_data_dir,
compile_home_dir, testing_work_dir, script_dir,
serialization_key. Предполагается, что в дальнейшем эти элементы
будут использоваться в утилите редактирования конфигурационных
настроек системы. Кроме того, введён новый атрибут ejudge_user,
являющийся синонимом атрибута local_user. Новое имя атрибута
лучше отражает его семантику.

run
---
Система ejudge теперь поддерживает набор "стандартных
проверяющих программ". К стандартным проверяющим программам, в
частности, относятся программа, сравнивающая два файла
текстуально, или программа, сравнивающая два целых числа в
файлах. Набор стандартных проверяющих программ компилируется
вместе с компиляцией всей системы и инсталлируется в каталог
скриптов (PREFIX/libexec/ejudge). Чтобы использовать стандартную
проверяющую программу нужно в секции описания задачи установить
конфигурационную переменную `standard_checker' в имя стандартной
проверяющей программы. Например,
standard_checker = cmp_int
Набор стандартных проверяющих программ позволяет во многих
случаях избежать написания новых проверяющих программ для
задач. Для полного описания стандартных проверяющих программ
обратитесь к документации.

Местоположение стандартных проверяющих программ можно задать
явно с помощью глобальной конфигурационной переменной
`ejudge_checkers_dir'. По умолчанию её значение равно
PREFIX/libexec/ejudge. Изменить значение по умолчанию можно либо
при конфигурировании системы с помощью configure, либо при
последующей начальной настройке с помощью ejudge-setup.

libchecker
----------
Существенно доработана библиотека для написания проверяющих
программ libchecker. Добавлены новые функции
normalize_spaces_in_file, read_corr_unsigned_int,
read_corr_unsigned_long_long, read_in_long_long, read_int,
read_in_unsigned_int, read_in_unsigned_long_long,
read_team_unsigned_int, read_team_unsigned_long_long,
read_unsigned_int, read_unsigned_long_long. Заголовочные файлы
библиотеки могут использоваться из программы на C++.

serve, compile
--------------
Поддерживается возможность передачи серверу компиляции compile
произвольного количества переменных окружения в запросе на
компиляцию. Переданные переменные окружения будут затем переданы
далее в запускаемый скрипт компиляции. Чтобы установить
переменные окружения, необходимо в конфигурационном файле
турнира serve.cfg в секции описания языка программирования
использовать конфигурационную переменную `compiler_env'. Каждое
использование этой переменной устанавливает одну переменную
окружения, но конфигурационная переменная `compiler_env' может
повторяться в секции описания языка программирования несколько
раз.

run
---
Поддерживается возможность передачи произвольных переменных
окружения в проверяющую программу. Для задания переменных
окружения используется конфигурационная переменная
`checker_env', которая может появляться как в секции описания
задачи, так и в секции описания тестировщика. Поддерживается
наследоваение значений этой переменной от абстрактной задачи или
абстрактного тестировщика. Переменные окружения, полученные из
всех источников (секция описания задачи, секция описания
тестировщика и т. д.) объединяются и передаются проверяющей
программе. Каждое использование конфигурационной переменной
`checker_env' позволяет установить одну переменную окружения, но
конфигурационная переменная `checker_env' может быть
использована несколько раз.

serve, compile, run
-------------------
Поддерживаются подстановки значений одних конфигурационных
переменных в значения других конфигурационных переменных. Такие
подстановки похожи на подстановки значений переменных в
программах на языке shell и тому подобных. Например, чтобы в
определении конфигурационной переменной `start_env' использовать
глобальную конфигурационную переменную `script_dir', определение
конфигурационной переменной `start_env' может выглядеть
следующим образом:
start_env = "LD_PRELOAD=${script_dir}/libdropcaps.so"

Подстановки такого рода пока обрабатываются только для
переменных `compiler_env', `checker_env' и `start_env'. Кроме
того, в подстановках пока можно использовать только глобальные
конфигурационные переменные. Механизм подстановок в чём-то
дублирует механизм форматных преобразований, и, возможно, в
следующих версиях появится некоторый объединённый механизм
подстановок и форматных преобразований.

serve
-----
При старте сервер турнира может создать в каталогах
html-документов веб-сервера символические ссылки на html файлы с
таблицами текущего положения участников. В предыдущих версиях
символические ссылки необходимо было создавать вручную.

Чтобы автоматическое создание символических ссылок работало,
необходимо, чтобы в файле конфигурации турнира serve.cfg была
установлена глобальная конфигурационная переменная
`htdocs_dir'. В ней должен быть указан путь к корневому каталогу
html-документов веб-сервера (на многих Linux-системах это
/home/httpd/html). Если переменная `htdocs_dir' не определена,
используется значение по умолчанию, которое можно установить при
конфигурировании системы с помощью configure. Все пути к
символическим ссылкам указываются относительно этой
конфигурационной переменной.

Для указания пути, по которому должны быть созданы символические
ссылки, используются глобальные конфигурационные переменные
`stand_symlink_dir', `stand2_symlink_dir', `plog_symlink_dir'
для основного файла таблицы результатов, дополнительного файла
таблицы результатов и файла журнала посылкок. Все пути
указываются относительно корневого каталога html документов,
задаваемого в конфигурационной переменной `htdocs_dir'. Имена
файлов в этих каталогах будут совпадать с именами файлов,
задаваемыми в конфигурационных переменных `standings_file_name',
`stand2_file_name', `plog_file_name'. Например, если переменная
`standings_file_name' установлена в значение "standings.shtml",
переменная `htdocs_dir' --- в значение /home/httpd/html, а
переменная `stand_symlink_dir' --- в значение /contests/1, то
при старте программы `serve' в каталоге
/home/httpd/html/contests/1 будет создана символическая ссылка
на файл с таблицей текущих результатов, которая будет иметь имя
standings.shtml. Если в настройках веб-сервера нет особенностей
(типа виртуальных хостов), то таблица результатов будет доступна
по URL http://HOST/contests/1/standings.shtml. Естественно,
чтобы `serve' мог создать символическую ссылку, необходимо,
чтобы у пользователя, под которым работает `serve' было
достаточно полномочий для записи в соответствующий каталог.

Версия 2.1.29 (20040420)
========================
Все параметры периода компиляции, которые не могут быть изменены
с помощью конфигурационных файлов, вынесены в отдельный
заголовочный файл settings.h. Файл содержит определения
следующих констант:
MAX_CGI_VALUE_LEN
  Максимальный размер данных, принимаемый в одной
  CGI-переменной CGI-программами от браузеров клиентов. Таким
  образом, эта константа определяет   максимальный размер файла,
  который может быть принят CGI-программами. В особенности это
  затрагивает:
    o максимальный размер посылки пользователя или
      привилегированного пользователя;
    o максимальный размер сообщения;
    o максимальный размер загружаемого на сервер протокола
      тестирования;
    o максимальный размер сливаемых журналов посылок.
  Обратите внимание, что некоторые глобальные конфигурационные
  переменные, например, max_run_size, накладывают дополнительные
  ограничения на размер принимаемых данных.
  Размер этой константы по умолчанию - 1 мегабайт.
MAX_SERVE_PACKET_LEN
  Максимальный размер пакета данных, принимаемого программой
  `serve' от CGI-программ. Если пакет данных превышает
  максимальный размер, диагностируется ошибка протокола. Эта
  константа накладывает ограничения на все данные, пересылаемые
  от CGI-программ `master', `judge', `team'. Затрагиваемые
  аспекты перечислены выше. 
  Обратите внимание, что некоторые глобальные конфигурационные
  переменные, например, max_run_size, накладывают дополнительные
  ограничения на размер принимаемых данных.
  Размер этой константы по умолчанию - 1 мегабайт.
MAX_USERLIST_PACKET_LEN
  Максимальный размер пакета данных, принимаемого программой
  `userlist-serve' от своих клиентов. Данная константа имеет
  меньшее значение, чем две предыдущих, так как клиенты
  программы `userlist-serve' никогда не пересылают ей
  значительных объёмов данных.
SERVE_PACKET_NAME_SIZE
  Размер буфера, необходимого для хранения имени файла,
  содержащего команду, передаваемую от программы `serve'
  программам `compile' и `run'. Текущее значение этой константы
  равно 13. Таким образом, длина имени файла пакета равно 12, из
  которых первый символ отводится под приоритет пакета, а
  оставшиеся 11 задают уникальное имя пакета, формируемое из
  текущего времени, идентификатора процесса команды `serve',
  номера посылки и т. д.
MAX_LANGUAGE
  Максимальное количество одновременно поддерживаемых в одном
  турнире языков программирования. Каждому языку
  программирования соответствует его идентификатор в диапазоне
  от 1 до MAX_LANGUAGE. Если в конфигурационном файле описания
  турнира `serve.cfg' задано более чем MAX_LANGUAGE описаний
  языков программирования (т. е. секций [language]), сервер
  турнира не может быть запущен.
  Текущее значение этой константы - 31.
MAX_PROBLEM
  Максимальное количество поддерживаемых в одном турнире
  неабстрактных задач. Каждая неабстрактная задача получает свой
  уникальный идентификатор задачи в диапазоне от 1 до
  MAX_PROBLEM. Абстрактные задачи не имеют идентификатора,
  поэтому данное ограничение на них не распространяется. Если в
  конфигурационном файле описания турнира `serve.cfg' задано
  более чем MAX_PROBLEM описаний неабстрактных задач, сервер
  турнира не может быть запущен.
  Текущее значение этой константы - 100.
MAX_TESTER
  Максимальное количество поддерживаемых в одном турнире
  неабстрактных тестировщиков. Каждый неабстрактный тестировщик
  получает свой уникальный идентификатор в диапазоне от 1 до
  MAX_TESTER. Абстрактные тестировщики не имеют идентификатора.
  Тестировщик по умолчанию (т. е. для которого конфигурационная
  переменная any установлена в true) получает единственный
  идентификатор тестировщика вне зависимости от того, ко скольки
  задачам он применяется. Если в конфигурационном файле описания
  турнира `serve.cfg' задано более чем MAX_TESTER описаний
  неабстрактных тестировщиков, сервер турнира не может быть
  запущен.
  Текущее значение этой константы - 100.

В конфигурационный файл описания турнира contest.xml добавлен
новый атрибут closed элемента <contest>. Атрибут может принимать
значения "yes" и "no". Его значение по умолчанию - "no". Если
этот атрибут равен "yes", данный турнир считается "закрытым"
(оконченным), то есть регистрация на него с помощью
CGI-программы `register' невозможна, и запуск CGI-программы
`team' для данного турнира также невозможен (будет выведено
сообщение о том, что данный турнир закрыт). Данный атрибут
турнира может устанавливаться, когда желательно предотвратить
случайные бессмысленные попытки регистрации на турнир и участия
в нём.

В конфигурационный файл описания турнира serve.cfg добавлены
конфигурационные переменные `priority_adjustment',
`user_priority_adjustment' для установки приоритета проверки
решений. Приоритет проверки решений изменяется от -16 (самый
высокий приоритет) до 15 (самый низкий приоритет) и может
устанавливаться глобально для турнира, в зависимости от
участника турнира, в зависимости от языка программирования,
задачи или тестировщика. Приоритет по умолчанию - 0,
конфигурационные переменные описывают изменение приоритета,
например, priority_adjustment равный -2 в секции описания задачи
указывает, что проверка решений по данной задаче получает -2 к
текущему значению приоритета. Полное значение приоритета
получается сложением глобального приоритета, приоритета задачи,
приоритета языка программирования и приоритета тестировщика.

Программа `run' выбирает запросы на тестирование из каталога
запросов в зависимости от приоритета запроса. Более приоритетный
запрос обрабатывается первым. Если во время тестирования
некоторой посылки поступает более приоритетная посылка,
тестирование текущей посылки доводится до конца. Обратите
внимание, что приоритет тестирования не имеет отношения к
приоритету процесса (т. н. nice), с которым работает программа
тестирования.

В конфигурационный файл serve.cfg добавлена конфигурационная
переменная `disable_language' секции описания задачи. Данная
конфигурационная переменная позволяет указать языки
программирования, которые не могут использоваться для посылок по
данной задаче. Каждый раз указывается только одно короткое имя
языка программирования, но переменная `disable_language' может
быть использована несколько раз в описании одной задачи.
Например,
disable_language = "gcc"
disable_language = "g++"
Запрещает для некоторой задачи использование языков с коротким
именем gcc и g++.

register
--------
Поддерживается атрибут closed файла описания турнира
contest.xml. Если атрибут установлен, данный турнир не
отображается в списке турниров, на которые возможна регистрация,
либо для такого турнира не отображается ссылка на страницу сдачи
решений.

serve
-----
Параметры настройки фильтра посылок привилегированных программ
`master' и `judge' теперь сохраняются не только для данного
пользователя, но для пользователя и идентификатора сессии. Таким
образом для каждого окна браузера, в котором отображаются
страницы программ `master' или `judge' установки фильтра посылок
отслеживаются независимо, даже если все они работают под одним
идентификатором пользователя.

serve,run
---------
Поддерживается система приоритетов тестирования, описанная выше.

team
----
Не поддерживаются конфигурационные переменные `max_run_size' и
`max_clar_size'. Проверка соответствующих ограничений полностью
переложена на сервер турнира `serve', где она уже была
реализована.

Поддерживается атрибут closed файла конфигурации турнира
contest.xml. Если атрибут установлен в "yes", сразу же после
запуска программы генерируется страница с сообщением о том, что
турнир закрыт.

userlist-server
---------------
Поддерживается атрибут closed файла конфигурации турнира
contest.xml.

master,serve
------------
Добавлена возможность перетестирования всех посылок, которые
удовлетворяют текущему выражению фильтра. Для этого нужно нажать
на кнопку "Rejudge displayed runs". После нажатия на кнопку
будет отображена страница подтверждения операции, на которой
будут перечислены все пересуживаемые посылки.

serve
-----
Поддерживается конфигурационная переменная `disable_language'
секции описания задачи.

Версия 2.1.28 (20040402)
========================
Добавлена новая глобальная конфигурационная переменная
`enable_report_upload'. Добавлена новая конфигурационная
переменная описания задачи `date_penalty'.

clean-users
-----------
Добавлена поддержка автоматического удаления неактивных
регистрационных имён из базы пользователей. Регистрационное имя
считается неактивным, если под данным регистрационным именем не
была сделана ни одна попытка сдачи задач и не был задан ни один
вопрос. Регистрационное имя никогда не считается неактивным,
если оно привилегированное (т. е. указано в элементе <cap>
конфигурационного файла ejudge.xml), или если для него
установлен флаг never_clean.

Для активации режима удаления записей из базы пользователей
необходимо в командной строке программы clean-users указать
опцию -r. При обнаружении неактивного регистрационного имени на
стандартный поток вывода будет напечатан запрос о подтверждении
операции удаления, на который нужно ответить либо 'y', либо
'n'. Если дополнительно к опции -r указана опция -f, запрос о
подтверждении не выводится, и все неактивные регистрационные
имена удаляются автоматически.

serve,master,judge
------------------
Привилегированные пользователи могут просматривать как судейский
протокол тестирования, так и протокол тестирования,
предназначенный для участников. На странице просмотра исходного
текста посылки и протокола тестирования добавлена ссылка
"View team report", при нажатии на которую отображается
пользовательский протокол тестирования. Естественно, что для
того, чтобы пользовательский протокол тестирования генерировался
и отображался глобальная конфигурационная переменная
`team_enable_rep_view' должна быть установлена в true. Чтобы
пользователь мог просматривать протокол тестирования, для него в
соответствующем турнире должен быть установлен бит полномочий
VIEW_REPORT.

serve,master,judge
------------------
Привилегированный пользователь может загружать на сервер протокол
тестирования (как пользовательский, так и судейский). После
этого новый загруженный протокол тестирования будет отображаться
по команде "View report". Чтобы пользователь мог загрузить
протокол тестирования на сервер, глобальная конфигурационная
переменная `enable_report_upload' должна быть установлена в
true, а для пользователя в соответствующем турнире должен быть
установлен бит полномочий EDIT_RUN. Если в турнире включена
поддержка протоколов тестирования участников
(`team_enable_rep_view') при загрузке протокола на сервер можно
выбрать, заместит ли загружаемый протокол протокол участника,
судьи или сразу оба.

serve
-----
Добавлена возможность назначения штрафа за задачу в зависимости
от времени сдачи задачи. Например, если попытка по задаче
послана до 5 апреля 2004 г., она не получает штрафных очков,
если она послана 5-11 апреля, она получает одно штрафное очко, а
если 12 апреля и позднее - 2 штрафных очка. Для этого
используется конфигурационная переменная `date_penalty' секции
определения задачи. Чтобы реализовать указанную выше политику
штрафования, секция описания задачи должна содержать следующий
фрагмент:
date_penalty = "2004/04/05 0"
date_penalty = "2004/04/12 -1"
date_penalty = "2005/01/01 -2"
Каждое определение переменной `date_penalty' в рамках одной
секции описания задачи добавляет новую спецификацию штрафования
к уже существующим. Значение переменной `date_penalty' не
наследуется от абстрактных задач. Спецификации `date_penalty'
одной задачи не зависят от `date_penalty' других задач.
Спецификации упорядочены и проверяются в порядке их задания в
конфигурационном файле. Каждая спецификация штрафа имеет вид
DATE ADD-VALUE
где DATE - календарная дата, задаваемая в стандартном для ejudge
формате YYYY/MM/DD [hh[:mm[:ss]]], ADD-VALUE - значение,
прибавляемое к количеству баллов, полученному в результате
тестирования. Получившееся значение не может быть меньше 0 (в
этом случае оно устанавливается в 0) и больше максимального
значения баллов за данную задачу (в этом случае оно
устанавливается в максимальное количество баллов). Штрафование в
зависимости от времени работает только в режиме турнира KIROV.

userlist-server
---------------
Поддерживаются произвольные идентификаторы пользователя и группы
(в том числе отрицательные).

Версия 2.1.27 (20040327)
========================
Добавлены несколько новых возможностей администраторского
режима (приостановка/возобновление печати, загрузка исходного
текста посылки в бинарном виде, сравнение посылок). Добавлена
поддержка бинарных файлов. Добавлено отображение времени
последней успешной сдачи в таблицу текущего положения участников
турнира. Добавлены несколько новых конфигурационных переменных.

Изменён формат XML-представления журнала посылок. В элемент
<run> добавлен атрибут nsec, который содержит наносекундную
составляющую времени посылки. Как следствие, атрибут time теперь
содержит время в секундах вместо времени в миллисекундах, как
в предыдущей версии.

master,judge,team,register,users
--------------------------------
Максимальный размер данных, которые принимаются от веб-клиента
увеличен до 1 МБайта.

master,judge,team,serve
-----------------------
При отправке решений на проверку допускаются бинарные файлы, то
есть файлы, содержащие нулевой байт. Такие файлы без изменений
передаются на сервер.

Если для языка программирования, выбранного для данной посылки,
установлена в true конфигурационная переменная `binary',
поступивший файл будет записан в архив без изменений (т. е. со
всеми нулевыми байтами). В противном случае файл будет обрезан
по первому нулевому байту и будет диагностирована ошибка посылки
решения. По умолчанию установлен режим текстовых посылок.

master,judge,team,serve
-----------------------
Обновлён формат файла состояния сервера турнира. Его размер
установлен равным 128 байт, при этом в настоящее время 77 байт
не используются. Это позволит безболезненно добавлять новые поля
состояния сервера, аналогично тому, как добавлялись поля в базу
посылок. Новая версия формата файла состояния получила номер 2 и
новое значение магической константы в заголовке. Для обратной
совместимости утилиты master,judge,team поддерживают чтение
файла состояния сервера версии 1.

master,serve
------------
Администратор турнира может приостановить обслуживание запросов
на печать. Для этого он должен иметь установленным бит
полномочий CONTROL_CONTEST. Для приостановки печати используется
кнопка ``Suspend printing'', появляющаяся на главной странице
интерфейса администратора, если в данном турнире печать
разрешена. Снова разрешить печать посылок можно с помощью
кнопки ``Resume printing'', появляющейся вместо предыдущей
кнопки в режиме приостановки печати. В режиме приостановки
печати участники турнира не смогут послать запрос на печать,
однако привилегированные пользователи могут печатать как
обычно.

serve
-----
При запуске сервер считывает своё предыдущее состояние,
восстанавливая таким образом значения флагов приостановки
обслуживания клиентов, приостановки проверки решений,
окончательной проверки решения (для турнира по системе
OLYMPIADS) и приостановки печати решений.

serve
-----
В базу посылок добавлена наносекундная составляющая времени
посылки. Теперь все посылки, принятые одним сервером, будут
иметь уникальное время приёма. Это позволяет наконец решить
проблему упорядочивания нескольких посылок, пришедших в одну
секунду. Стабильность слияния посылок от нескольких серверов
распределённого турнира требует, чтобы при одинаковом времени
приёма посылки были как-то упорядочены по вторичному критерию,
но любой вторичный критерий может привести к необходимости
переупорядочивать посылки во время работы сервера турнира.
Переупорядочивание посылок, которые были отправлены на
компиляцию или проверку приведёт либо к потере результатов, либо
к подмене результатов. Решением этой проблемы является
требование уникальности времени приёма для всех посылок,
обрабатываемых одним сервером, что достигается добавлением
наносекундной компоненты. С большой вероятностью каждая посылка
будет иметь уникальное время получения даже и в распределённом
турнире, но полагаться на это нельзя.

Формат базы посылок новой версии совместим снизу вверх с
форматом базы посылок предыдущей версии (значение наносекундной
составляющей времени полагается равным нулю).

userlist-server
---------------
В базу пользователей добавлено поле `location', которое
предназначено для использования администратором очного турнира
для указания местоположения команды в классе. Значение этого
поля выводится на заглавную страницу распечатки листинга
программы.

edit-userlist
-------------
Поддерживается редактирование поля `location'.

serve
-----
В таблице текущего положения команд печатается информация о
последней успешной сдаче (Last success).

serve,master,judge
------------------
Из страницы просмотра исходного текста посылки возможна загрузка
исходного текста. Для этого необходимо нажать на ссылку
"Download run". Страница просмотра исходного текста уже содержит
сам исходный текст, но возможность загрузки исходного текста
необходима по следующим причинам:
  1. Исходный текст можно сразу сохранить в файл, а не
     копировать его через буфер обмена, избегая таким образом
     искажения данных, возможных при копировании через буфер
     обмена.
  2. Для посылок, в секции описания которых установлен флаг
     `binary', исходный текст посылки не отображается, так как
     может содержать непечатные символы, и во многих случаях
     (например, в случае посылки архива исходных текстов) его
     отображение вообще бессмысленно.

serve,master,judge
------------------
Из страницы просмотра исходного текста возможно сравнение
исходного текста данной посылки с исходным текстом другой
посылки. Для этого нужно ввести номер посылки и нажать на кнопку
"Compare". Сравнение ведётся с помощью программы diff командой
"diff -u". Путь к команде diff можно задать с помощью глобальной
конфигурационной переменной `diff_path'. При отображении
страницы просмотра исходного текста в поле ввода номера
сравниваемой посылки записывается номер ближайшей (в сторону
уменьшения) посылки, для которой значения идентификатора
команды, идентификатора языка программирования и идентификатора
задачи совпадают со значениями соответствующих полей текущей
посылки. 

userlist-server
---------------
В базу пользователей добавлено новое поле `never_clean'. Если
для некоторого пользователя это поле установлено в значение
`true', утилита clean-users, которая просматривает все базы
посылок и отмечает команды, не задавшие ни одного вопроса и не
пославшие ни одну посылку, как кандидаты на удаление, никогда не
будет отмечать таких пользователей как кандидатов на удаление.

edit-userlist
-------------
Поддерживается редактирование нового поля `never_clean'.

clean-users
-----------
Корректно обрабатываются турниры с пустым журналом посылок.
Поддерживается флаг `never_clean' участника.
Для каждого пользователя собирается информация о турнирах, в
которых этот пользователь запускал команду VIRTUAL_START или
VIRTUAL_STOP. Если некоторый пользователь не послал ни одной
программы и не задал ни одного вопроса, но имеет события
VIRTUAL_START или VIRTUAL_STOP, зарегистрированные за ним, все
номера виртуальных турниров, в которых есть такие события,
печатаются в разделе "Virtual contests for start/stop only
users".

serve
-----
Исправлены некоторые ошибки в процедуре слияния журналов
посылки. Данная возможность должна теперь работать нормально
во всех ситуациях.

Версия 2.1.26 (20040219)
========================
Добавлено сохранение некоторых параметров состояния клиента
участника турнира. Добавлена новая конфигурационная переменная
для указания каталога сохранения состояния.

Добавлена поддержка печати на принтер.

Исправлено большое количество ошибок, проявляющихся в режиме турнира
`OLYMPIADS'.

В формат конфигурационного файла `contest.xml' внесено изменение,
которое делают его несовместимым с форматом файла предыдущих версий.
Система ejudge при чтении конфигурационных файлов старых версий будет
выдавать ошибку. Чтобы исправить конфигурационный файл сделайте в нем
замену названия бита полномочий SUBMIT_RUNS на SUBMIT_RUN.

serve
-----
В базу посылок добавлено поле `pages' для сохранения количества
напечатанных страниц для данной посылки. Это поле
устанавливается, когда посылка печатается самим участником с
помощью CGI-программы team. Поле используется, чтобы не печатать
несколько раз одну и ту же посылку, и для подсчёта общего
количества напечатанных страниц для проверки квоты страниц.

serve,master
------------
Добавлена поддержка редактирования значения поля `pages'.

serve,master,judge,team
-----------------------
Добавлена поддержка печати листинга программы на принтер. Для
привилегированных пользователей печать доступна всегда из
диалога просмотра информации о посылке. Для печати
привилегированный пользователь должен иметь полномочие
`PRINT_RUN'. Привилегированный пользователь может напечатать
несколько раз одну и ту же посылку, для него не ограничивается
количество напечатанных страниц. Обычному участнику турнира
печать доступна, если установлена глобальная конфигурационная
переменная `enable_printing'. Максимальное количество страниц
для одного пользователя устанавливается с помощью глобальной
конфигурационной переменной `team_page_quota' (по умолчанию
значение равно 50). Квота учитывает заглавную страницу,
содержащую информацию о посылке.

Для печати используется программа `a2ps'. Путь к данной
программе задаётся с помощью глобальной конфигурационной
переменной `a2ps_path'. Дополнительные аргументы программы
`a2ps' задаются с помощью глобальной конфигурационной переменной
`a2ps_args'. Путь к программе постановки в очередь печати `lpr'
задаётся с помощью глобальной конфигурационной переменной
`lpr_path'. Дополнительные аргументы для программы `lpr'
задаются с помощью глобальной конфигурационной переменной
`lpr_args'.

contest.xml
-----------
Добавлен новый бит полномочий `PRINT_RUN'. Бит полномочий
`SUBMIT_RUNS' переименован в `SUBMIT_RUN', поэтому новая версия
системы будет выдавать ошибку при чтении конфигурационных файлов
предыдущих версий.

userlist-server
---------------
При генерации случайных паролей в паролях не используются
символы, которые легко спутать друг с другом: 'l', 'I', '1',
'O', '0'.

serve,run
---------
Добавлена новая конфигурационная переменная описания задачи
`accept_partial'. Переменная действует только в режиме турнира
OLYMPIAD. Если эта переменная установлена в true, то решения
участников принимаются на проверку даже в случае, когда они не
прошли всех тестов из условия. Соответствующим образом обновлён
протокол взаимодействия программ `serve' и `run'.

serve
-----
В действительности сделано, чтобы привилегированный пользователь
мог делать посылки до начала и после окончания турнира. Эта
возможность заявлялась, но была отключена.

serve
-----
Поскольку добавление очередной посылки может добавлять её не в
конец базы посылок, после добавления посылки может потребоваться
переименование архивных файлов. Ранее добавление посылки не в
конец приводило к потере посылки.

serve
-----
В режиме турнира OLYMPIAD переключиться в режим проверки можно и
до конца турнира.

serve,master
------------
Добавлена поддержка команды `Set accepting mode', которая
переключает турнир из режима проверки в режим приёма посылок.
Команда действует только в режиме турнира OLYMPIAD.

run
---
Существенно улучшена поддержка режима турнира `OLYMPIAD'. Этот
режим почти всегда обрабатывается так же, как `KIROV'. Улучшены
возможности по прерыванию работы программы по Ctrl-C. Во всех
случаях поддерживаются тесты с нулевой суммой баллов.

serve
-----
При перезаписи архивного файла (например, протокола
тестирования) предварительно удаляются предыдущая запись с
данным номером. Это исправляет ошибку, когда, например,
предыдущая запись не была сжата (не имела суффикс .gz), а новая
запись - сжата (имеет суффикс .gz в имени файла). Таким образом
оказывается, что архив протоколов содержит два протокола для
некоторой посылки. Эти два протокола в некоторых ситуациях
конфликтуют друг с другом.

serve
-----
Добавлена поддержка сохранения параметров состояния клиента
участника турнира. Синтаксис файла состояния основан на XML. В
настоящее время сохраняется пока статус просмотра сообщений, то
есть для каждого сообщения, адресованного участнику турнира
сохраняется, просматривал ли участник это сообщение. Файлы
состояния участника подгружаются по требованию и создаются при
необходимости. Если сохраняемое состояние участника изменилось,
оно сохраняется в момент завершения работы программы serve.

Добавлена новая глобальная конфигурационная переменная
`team_extra_dir'. Она содержит каталог, в котором размещаются
файлы сохраняемого состояния участников. По умолчанию эта
переменная равна ${var_dir}/team_extra, где ${var_dir} -
значение глобальной конфигурационной переменной `var_dir'.
Файлы сохраняемого состояния хранятся в подкаталогах этого
каталога, организованные в дерево каталогов. В каждом каталоге
находится не более 32 подкаталогов или непосредственно файлов,
аналогично тому, как организован архив посылок.

serve,team
----------
Если у участника турнира есть непросмотренные сообщения, в
разделе состояния турнира выводится сообщение "You have X unread
message(s)" (или "Непросмотренных сообщений: X"). У участника
турнира сообщения, направленные участником судьям имеют статус
"U", если эти сообщения не просмотрены судьями (у судей эти же
сообщения имеют статус "N"). Сообщения от судей всем участникам
или от судей конкретному участнику имеют статус "N", если
сообщения не были ни разу просмотрены этим участником.
Просмотренные сообщения не имеют специального статуса.

serve
-----
Добавлена новая конфигурационная переменная описания задачи
`hidden'. Если эта переменная установлена в true, такая задача
не показывается в таблице текущих результатов турнира, но
остаётся доступной для сдачи участниками.

master,judge
------------
Если в URL не задан идентификатор турнира contest_id, и имя
CGI-программы имеет вид master или judge, то выводится
приглашение ко вводу регистрационного имени, пароля и
идентификатора турнира.

userlist-server
---------------
Резервные копии базы данных пользователей, которые сохраняются
один раз в 24 часа, теперь записываются в сжатом формате GZIP.

Если сохранение текущего состояния базы пользователей
завершилось из-за ошибки, временный файл, создаваемый в процессе
записи, удаляется.

compile
-------
Улучшена обработка ошибочных ситуаций. Программа compile теперь
не завершит свою работу в случае, если исчерпано дисковое
пространство. Вместо этого она будет пытаться выполнить запись с
интервалом 5 сек.

compile,run
-----------
Если программа переходит в состояние ожидания сериализационного
семафора (см. описание глобальной конфигурационной переменной
`cr_serialization_key'), на стандартный поток ошибок печатается
диагностическое сообщение "waiting for lock".

Версия 2.1.25 (20031229)
========================
Добавлены новые возможности редактирования базы посылок. Формат
конфигурационных файлов не изменился.

serve,master
------------
На странице просмотра исходного кода текущей посылки
администратор турнира может редактировать количество тестов, на
которых прошла данная посылка, а также количество очков за эту
посылку. Последнее доступно только в режиме турнира KIROV или
OLYMPIAD.

serve,master
------------
Со страницы просмотра исходного кода текущей посылки
привилегированный пользователь может быстро перейти к просмотру
протокола тестирования и наоборот.

userlist-server,register
------------------------
При добавлении новых членов команды сервер базы пользователей
строже проверяет ограничения на максимальное количество членов
команды. 

serve
-----
В базу данных посылок добавлено поле `is_readonly', которое
может принимать булевское значение. Если это поле установлено в
true, всякое изменение полей данной посылки, за исключением
самого поля `is_readonly' запрещено. Посылка с установленным
флагом `is_readonly' никогда не пересуживается.

serve,master
------------
Добавлена поддержка редактирования нового поля `is_readonly'.

serve,run
---------
Добавлена новая конфигурационная переменная `disable_testing',
которая доступна как на глобальном уровне, так и на уровне
описания задачи. Если эта конфигурационная переменная для
некоторой задачи установлена в true, никакого тестирования
посылок по этой задаче не ведётся. При поступлении они получают
статус "Accepted for testing", который может быть изменён
вручную. Программа run для задач с установленным флагом
`disable_testing' не проверяет наличия тестов и проверяющей
программы. Все запросы на тестирование данной задачи
игнорируются.

serve,master,judge
------------------
В язык фильтра посылок добавлены новые выражения для новых полей
базы данных посылок: imported[(run_id)], curimported,
hidden[(run_id)], curhidden, readonly[(run_id)], curreadonly,
varant[(run_id)], curvariant, rawvariant[(run_id)],
currawvariant. Отличие конструкции rawvariant от variant в том,
что rawvariant всегда берёт значение номера варианта из базы
посылок. variant, если значение в базе посылок установлено в 0
(то есть используется вариант из таблицы вариантов), возвращает
номер варианта из таблицы вариантов.

serve,master,judge
------------------
При просмотре подробной информации о посылке ("View source")
некоторые поля помечаются как гиперссылки. При нажатии на них
автоматически конструируется выражение для фильтра посылок,
отбирающее только посылки, у которых значение соответствующего
поля совпадает со значением поля у текущей посылки. Например,
если проследовать по гиперссылке в поле "IP-address", выражение
фильтра будет равно "ip == ip(run_id)", где вместо run_id будет
подставлен номер текущей посылки. Таким образом фильтруются
только записи в базе, соответствующие посылкам с того же самого
IP-адреса. Предыдущее выражение фильтра будет очищено.

serve
-----
Добавлена конфигурационная переменная описания задачи
`variable_full_score'. Если эта переменная установлена в true,
изменяется правило вычисления баллов за полностью решённую
задачу в режимах турнира OLYMPIAD или KIROV. В обычном режиме за
полностью решённую задачу (то есть за посылку, которая имеет
статус OK) даётся количество баллов, определённое в переменной
`full_score' описания задачи (далее из этого числа вычитаются
штрафные баллы и т. д.). В режиме, включаемом конфигурационной
переменной `variable_full_score' за удачную посылку (то есть
посылку, имеющую статус OK) даётся столько баллов, сколько
указано в поле score этой посылки. Данная конфигурационная
переменная удобна в случаях, если статус OK выставляется вручную
(например, по результатам ручного тестирования), и необходимо
ранжировать принятые решения по баллам.

serve,master,judge
------------------
В список участников турнира, генерируемый по ссылке "View teams"
из главного экрана, добавлена возможность быстрого включения
фильтра посылок для некоторого участника. Для этого нужно
кликнуть на гиперссылке идентификатора участника (первое поле).
Просмотр вернётся в главный экран и будет включён фильтр на
идентификатор пользователя.

После редактирования поля в режиме просмотра исходного текста
посылки ("View source" из главного экрана) текущий экран не
переключается на главный, а остаётся в режиме просмотра
исходного текста этой посылки.

master,judge
------------
Из формы входа в программу убран выбор возможного варианта
поддержки сессии. Программы master и judge поддерживают три
варианта: 1) передавать всегда login/password в скрытых
переменных формы, 2) генерировать идентификатор сессии и
передавать его в скрытых переменных формы, 3) генерировать
идентификатор сессии и передавать его в URL, 4) генерировать
идентификатор сессии и сохранять его в cookie. По умолчанию
предлагался выбор третьего варианта. Теперь меню выбора удалено,
и всегда выбирается третий вариант. В дальнейшем планируется
удалить из программ master, judge, team обработку остальных
вариантов поддержки сессии.

Версия 2.1.24 (20031208)
========================
В данной версии добавлены новые возможности, и незначительно
изменились некоторые директивы конфигурационных
файлов. Изменился формат файла состояния сервера, который
генерируется программой serve и используется CGI-программами
master, judge и team. Новые версии этих программ выдадут ошибку
чтения файла состояния и немедленно завершатся при попытке их
запустить в каталоге турнира старой версии. Чтобы устранить эту
неприятность, один раз запустите serve на этом турнире. Как
только файл состояния будет перегенерирован, serve можно
остановить.

Из архива исходных текстов системы удалены все неиспользуемые
исходные тексты и устаревшие дополнительные материалы. В
результате архив значительно сократился в размере.

Конфигурационный файл contest.xml
---------------------------------
Удалена поддержка элемента <observer_access>. Этот элемент был
введён для CGI-программы `observer', которая не была
реализована. Удалена поддержка бита полномочий OBSERVER_LOGIN.

Добавлен новый бит полномочий SUBMIT_RUNS. Если этот бит для
некоторого пользователя установлен, этот пользователь позволяет
отправлять решения на проверку из-под CGI-программ master или
judge. Естественно, этот пользователь должен иметь полномочия
запускать соответствующую программу.

serve
-----
Оптимизирована структура архивов посылок и протоколов
тестирования. Вместо размещения всех файлов архива в одном
каталоге (например, все протоколы тестирования размещались в
каталоге var/archive/reports каталога турнира), файлы архива
структурируются в дерево таким образом, чтобы каталог на каждом
уровне содержал не более 32 записей. Максимальное количество
файлов в архиве ограничено примерно 1 миллионом, поэтому для
размещения всех файлов достаточно 3 уровней подкаталогов.
Например, протокол тестирования для посылки с номером 1905 будет
размещён в файле var/archive/reports/0/1/R/001905.
Данная оптимизация позволяет существенно увеличить скорость
открытия файлов для файловых систем, в которых записи в каталоге
хранятся в неупорядоченном виде (например, ext2/ext3).
Чтобы отменить такую форму хранения архивных файлов, необходимо
установить глобальную конфигурационную переменную
use_dir_hierarchy в 0 следующим образом:
use_dir_hierarchy = 0
По умолчанию поддержка иерархической структуры архивных каталогов
включена.

Старый и новый форматы хранения архивных файлов совместимы снизу
вверх, то есть новая версия системы ejudge будет корректно
открывать архивы, созданные в системах предыдущих версий. Однако
если поддержка иерархической структуры включена, то все
последующие посылки уже будут сохраняться в иерархической
системе каталогов и таким образом станут недоступными для
системы ejudge предыдущих версий.

Все архивные файлы, размер которых больше некоторого значения
(по умолчанию - 4096 байт) сжимаются алгоритмом gzip и
сохраняются в файле с суффиксом .gz. Настроить минимальный
размер сжимаемого файла можно с помощью глобальной
конфигурационной переменной `min_gzip_size' файла конфигурации
турнира serve.cfg. Размер по умолчанию в 4 килобайта выбран, так
как 4 Кб - размер минимальной единицы выделения дискового
пространства в современных версиях ext2/ext3 на архитектуре ia32
(этот размер совпадает с размером страницы виртуальной памяти).
Сжимать файлы меньшего размера бессмысленно, так как размер
занимаемой дисковой памяти от этого не уменьшится. Чтобы
полностью отменить сжатие архивных файлов необходимо установить
в 0 конфигурационную переменную use_gzip:
use_gzip = 0

В базе данных посылок добавлено поле для сохранения варианта
задачи. По умолчанию вариант задачи равен 0, то есть берётся
вариант задачи согласно файлу отображения вариантов
(varant_map_file). Но из-под программ judge и serve можно
послать решения, выбирая вариант явно. Кроме того, администратор
может принудительно изменить вариант задачи.

В базе данных посылок добавлен флаг "скрытой" посылки. Такие
посылки тестируются, но никак не влияют на таблицу текущих
результатов, не отображаются в публичном журнале посылок и не
могут быть проэкспортированы в XML.

serve,master,judge
------------------
Привилегированный пользователь может отправлять решения на
проверку, если у него установлен бит полномочий SUBMIT_RUNS. В
генерируемую программами master и judge html-страницу добавлена
форма посылки решения. Решение, посылаемое из программ master и
judge добавляется в базу посылок с флагом "невидимое" (hidden),
то есть оно тестируется, но никак не влияет на таблицу текущих
результатов, не отображается в публичном журнале посылок и не
может быть проэкспортировано в XML. Привилегированный
пользователь может посылать решения любой задачи (даже той,
deadline по которой уже истёк), любого варианта задачи на выбор
(если задача вариантная) с использованием любого языка
программирования (даже такого, для которого установлен флаг
disabled). Для таких посылок не проверяется время посылки, то
есть они могут быть сделаны до момента начала или после момента
окончания турнира. Для таких посылок не проверяются квоты
суммарного размера посланных файлов, количества посылок и т. д.

serve,master
------------
Добавлена возможность редактирования новых полей базы данных
посылок: variant, is_hidden. Установка номера варианта в 0
означает, что для нахождения номера варианта будет
использоваться файл отображения вариантов. 

judge
-----
Исправлена ошибка неправильного форматирования таблицы посылок
участников для событий VIRTUAL START, VIRTUAL STOP и пустой
записи EMPTY.

run
---
Допускается указание цены одного теста равной 0 баллов. Ранее
установка цены теста в 0 баллов была эквивалентна установке цены
теста в значение по умолчанию (1 балл). Тесты ценой 0 баллов
корректно обрабатываются. Тесты ценой 0 баллов полезны для того,
чтобы оценивать задачу по системе "принято"/"непринято", но при
этом предоставлять участникам детализированную информацию о
результатах работы их программы.

serve,master
------------
Изменить продолжительность турнира можно и после его окончания
(как окончания из-за команды администратора "Stop contest", так и
из-за истечения времени). Для этого должна быть установлена
конфигурационная переменная `enable_continue' файла конфигурации
турнира `serve.cfg', например
enable_continue

Администратор турнира может уменьшить заявленную продолжительность
турнира с помощью команды "Change duration" (в предыдущих версиях
продолжительность турнира могла только увеличиваться). Однако в случае,
если турнир уже идёт, уменьшение его длительности не может приводить
к тому, что текущий момент времени окажется позднее момента окончания
турнира из-за исчерпания времени турнира. Попытка такого изменения
продолжительности блокируется.

Запрещено уменьшение длительности неограниченного по времени турнира,
а также увеличение длительности ограниченного по времени турнира
до неограниченного по времени турнира.

Расширены возможности продолжения остановленного турнира.
Можно продолжить турнир конечной длительности, если его
установленная длительность такова, что текущий момент времени не
находится после окончания турнира из-за истечения времени
турнира. Турнир, уже закончившийся из-за истечения времени,
можно продлить, сначала увеличив его длительность с помощью
команды "Change duration", а затем продолжив турнир с помощью
команды "Continue". Обратите внимание, что возможность
продолжения турнира доступна, только если в конфигурационном
файле турнира установлена глобальная конфигурационная переменная
enable_continue.

serve
-----
Значение конфигурационной переменной board_fog_time, равное 0
означает, что таблица результатов вообще не "замораживается".
В предыдущих версиях отключить заморозку было невозможно (можно
было включить заморозку за 1 минуту до конца турнира).

Введены новые глобальные конфигурационные переменные турнира
`stand_freeze_time' и `stand_melt_time', которые являются
синонимами для `board_fog_time' и `board_unfog_time'
соответственно. Новые имена более соответствуют своему
назначению. Поддержка старых имён сохранена. 

serve,master,judge,team
-----------------------
Если для турнира установлен режим заморозки результатов, время
заморозки отображается клиентам в разделе состояния сервера.

team
----
Из раздела состояния сервера убрана строка "Время клиента:", так
как её название не соответствует её назначению. Время клиента
всегда означало момент календарного времени, в который на
сервере работает CGI-программа обслуживания клиентов team,
master или judge.

serve,team
----------
В конфигурационном файле турнира поддерживается новая глобальная
конфигурационная переменная `team_enable_ce_view'. Если эта
переменная установлена в ненулевое значение, в случае, если
участник на некоторой посылке получает ошибку компиляции, ему
становится доступным файл диагностики компилятора, даже если
показ протокола тестирования для участников (глобальная
конфигурационная переменная `team_enable_rep_view') отключён.

В конфигурационном файле турнира поддерживается новая глобальная
переменная и переменная описания задачи
`team_show_judge_report'. Если эта конфигурационная переменная
установлена в ненулевое значение, и включён режим показа
протокола тестирования участникам (глобальная конфигурационная
переменная `team_enable_rep_view'), участникам становится
доступным судейский протокол тестирования. Судейский протокол
тестирования содержит входные данные (тесты), результат работы
программы, вывод программы на стандартный поток ошибок, вывод
проверяющей программы и т. д. По умолчанию участники могут
видеть только сокращённый протокол, содержащий лишь результаты
проверки программы на тестах, но не сами тесты и результат
работы программы на них. Режим показа полного протокола
тестирования может включаться и выключаться для каждой задачи
индивидуально с помощью явного указания значения
конфигурационной переменной `team_show_judge_report' в описании
задачи. 

serve
-----
Исправлена ошибка, когда serve завершается аварийно (по assert),
если на турнир не был зарегистрирован ни один пользователь.

serve,master
------------
Администратор турнира может приостановить проверку поступающих
решений с помощью команды "Suspend testing". В режиме
приостановленного тестирования все решения принимаются от
участников как обычно, но не отправляются на тестирование, а
заносятся в базу посылок со статусом "Accepted for testing"
("Принято на проверку"). Решения будут оставаться в этом статусе
до тех пор, пока администратор не отправит их на проверку явно
или с помощью команды "Judge suspended runs". Назначение этой
команды --- снизить нагрузку на сервер турнира, если он
одновременно является компьютером, на котором идёт компиляция
и/или запуск решений, в конце турнира, когда поток посылок,
обычно, очень интенсивный. В режиме приостановки проверки вместо
команды "Suspend testing" становится доступна команда
"Resume testing", снова включающая режим немедленной проверки
решений.

Администратор турнира может направить на проверку все решения,
полученные в период приостановки тестирования, с помощью команды
"Judge suspended runs".

serve,master,judge
------------------
В выражении для фильтра посылок можно использовать конструкции
`status' и `curstatus', которые являются синонимами для `result'
и `curresult'.

Версия 2.1.23 (20031121)
========================
В данной версии исправлены замеченные ошибки предыдущей версии.
Новых возможностей не добавлено. Формат конфигурационных файлов
не изменился.

В архив исходных текстов добавлен неофициальный русский перевод
Стандартной общественной лицензии GNU (автор перевода - Елена
Тяпкина). Система ejudge распространяется на условиях данной
лицензии. Перевод находится в файле COPYING.RUS.

serve, compile, run
-------------------

В конфигурационных файлах поддерживаются два вида кавычек:
одинарные и двойные, а также символ \ для экранирования
следующего за ним символа. Правила использования этих
специальных символов такие же, как в файле дополнительной
информации о тестах test.inf. Например:
table_head_style = 'h2 style="common"'

serve/master
------------

При экспорте журнала посылок в формате XML корректно
обрабатываются специальные символы (", &) - они заменяются на
соответствующие HTML/XML последовательности (&quot; &amp;).

team
----

В случае ошибки регистрации пользователя выдаётся сообщение об
ошибке, в котором более точно указывается причина ошибки:
пользователь не зарегистрирован на турнир, пользователь
заблокирован администратором или неверный
логин/пароль/идентификатор турнира.

run
---

Символы `#' внутри последовательностей символов в кавычках " и
', а также после \ обрабатываются корректно. Таким образом можно
использовать символ `#' в аргументах командной строки,
передаваемых тестируемой программе.

userlist-server
---------------

При записи базы пользователей в формате XML специальных
XML-cимволы (", &, <, >) обрабатываются корректно, то есть
заменяются на соответствующие последовательности (&quot; и т. д.).

Для поиска логина пользователя или его cookie реализован
просмотр хэш-таблиц вместо последовательного просмотра
списков. Это позволило ускорить поиск в 100 раз.

register
--------

Исправлено обрезание полей ввода по символу "Номер". Этот символ
теперь корректно заменяется на свой Unicode-код &#XXXX;.

libchecker.a
------------

Если в проверяющей программе установлен флаг NEED_TGZ,
библиотека libchecker.a сохраняет в глобальных переменных
`dir_in_path' и `dir_out_path'. В переменной `dir_in_path'
находится путь к каталогу, в котором находится содержимое
рабочего каталога, создаваемого перед запуском тестируемой
программы (dir_in_path). В переменной `dir_out_path' находится
путь к каталогу в рабочем каталоге тестирования. Таким образом,
чтобы открыть входной каталог тестируемой программы можно
использовать вызов функции opendir(dir_in_path), а чтобы открыть
выходной каталог тестируемой программы - opendir(dir_out_path).

В библиотеку добавлены новые функции:
  checker_read_corr_double,
  checker_read_corr_long_long,
  checker_read_int,
  checker_read_in_long_double,
  checker_read_long_double,
  checker_read_long_long.

