private function showProblem($id, $ignore_git = FALSE)
 {
     try {
         $problem = new Problem($id);
         if ($problem->exists()) {
             throw new fValidationException("Problem {$id} already exists.");
         }
     } catch (fNotFoundException $e) {
         // fall through
     }
     $data_base_dir = Variable::getString('data-base-path');
     if (!is_dir($data_base_dir)) {
         throw new fValidationException("Data base directory {$data_base_dir} does not exist.");
     }
     if (!$ignore_git) {
         $this->gitPullOriginMaster();
     }
     $problem_dir = "{$data_base_dir}/problems/{$id}";
     if (!is_dir($problem_dir)) {
         throw new fValidationException("Problem directory {$problem_dir} does not exist.");
     }
     $problem_conf = "{$problem_dir}/problem.conf";
     if (!is_file($problem_conf)) {
         throw new fValidationException("Problem configuration file {$problem_conf} does not exist.");
     }
     $problem_text = "{$problem_dir}/problem.text";
     if (!is_file($problem_text)) {
         throw new fValidationException("Problem description file {$problem_text} does not exist.");
     }
     $data_dir = "{$problem_dir}/data";
     if (!is_dir($data_dir)) {
         throw new fValidationException("Problem {$id} does not have a data directory at {$data_dir}");
     }
     $properties_content = file_get_contents($problem_conf);
     $ini_content = str_replace(': ', ' = ', $properties_content);
     $ini = parse_ini_string($ini_content);
     if (!array_key_exists('title', $ini) or empty($ini['title'])) {
         throw new fValidationException('Problem title is not specified in problem.conf');
     }
     if (!array_key_exists('author', $ini)) {
         throw new fValidationException('Problem author is not specified in problem.conf');
     }
     if (!array_key_exists('case_count', $ini) or empty($ini['case_count'])) {
         throw new fValidationException('Problem case count is not specified in problem.conf');
     }
     if (!array_key_exists('case_score', $ini) or empty($ini['case_score'])) {
         throw new fValidationException('Problem case score is not specified in problem.conf');
     }
     if (!array_key_exists('time_limit', $ini) or empty($ini['time_limit'])) {
         throw new fValidationException('Problem time limit is not specified in problem.conf');
     }
     if (!array_key_exists('memory_limit', $ini) or empty($ini['memory_limit'])) {
         throw new fValidationException('Problem memory limit is not specified in problem.conf');
     }
     if (!array_key_exists('secret_before', $ini) or empty($ini['secret_before'])) {
         throw new fValidationException('Problem secret-before time is not specified in problem.conf');
     }
     if (empty($ini['author'])) {
         $ini['author'] = '-';
     }
     $problem = new Problem();
     $problem->setId($id);
     $problem->setTitle($ini['title']);
     $problem->setDescription(file_get_contents($problem_text));
     $problem->setAuthor($ini['author']);
     $problem->setCaseCount($ini['case_count']);
     $problem->setCaseScore($ini['case_score']);
     $problem->setTimeLimit($ini['time_limit']);
     $problem->setMemoryLimit($ini['memory_limit']);
     $problem->setSecretBefore($ini['secret_before']);
     $problem->validate();
     for ($t = 1; $t <= $problem->getCaseCount(); $t++) {
         $input = "{$data_dir}/{$t}.in";
         if (!is_file($input)) {
             throw new fValidationException("Case input file {$input} is not found in {$data_dir}");
         }
         $output = "{$data_dir}/{$t}.out";
         if (!is_file($output)) {
             throw new fValidationException("Case output file {$output} is not found in {$data_dir}");
         }
     }
     $problem->store();
 }