<?php
abstract class Question
{
protected $text ;
protected $points ;
protected $correctAnswer ;
abstract function getAsString( ) : string;
abstract function checkAnswer( $answer ) ;
public function getQuestionText( )
{
$text = $this -> text ;
return $text ;
}
}
class MultipleChoiceQuestion extends Question
{
protected $answers ;
protected $almostCorrectAnswer ;
protected $hint ;
public function __construct
( string
$text , float
$points , array $answers , string
$correctAnswer , string
$hint ) {
$this -> text = $text ;
$this -> points = $points ;
$this -> answers = $answers ;
$this -> correctAnswer = $correctAnswer ;
$this -> hint = $hint ;
}
/* Функция получает на вход почти корректный вопрос и добавляет его в соответвующее свойство */
public function addAlmostCorrectAnswer( $almostCorrectAnswer )
{
$this -> almostCorrectAnswer = $almostCorrectAnswer ;
}
/* Функция отдает строку со списком вопросов */
public function getAsString( ) : string
{
$string = "{$this->text} \n Варианты ответов:\n " ;
foreach ( $this -> answers as $letter => $answer ) {
$string = $string . "{$letter} . {$answer} \n " ;
}
return $string ;
}
/*
Функция получает на вход ответ. Проверяет его на правильность с учетом почти корректного варианта.
Отдает в массив результаты проверки с количеством баллов.
*/
public function checkAnswer( $answer )
{
$points = $this -> points ;
$isCorrect = 0 ;
$isAlmostCorrect = 0 ;
if ( $answer == $this -> correctAnswer ) {
$isCorrect = 1 ;
} elseif ( $answer == $this -> almostCorrectAnswer ) {
$isAlmostCorrect = 1 ;
}
return array ( $isCorrect , $isAlmostCorrect , $points ) ; }
/* Функция отдает подсказку к вопросу */
public function getQuestionHint( )
{
$hint = $this -> hint ;
return $hint ;
}
}
class NumericalQuestion extends Question
{
protected $deviation ;
function __construct( string $text , float $points , float $correctAnswer , float $deviation = 0 )
{
$this -> text = $text ;
$this -> points = $points ;
$this -> correctAnswer = $correctAnswer ;
$this -> deviation = $deviation ;
}
/* Функция отдает строку со списком вопросов */
public function getAsString( ) : string
{
return "{$this->text} \n " ;
}
/*
Функция получает на вход ответ. Проверяет его с учетом возможного отклонения.
Отдает в массив результат проверки и количество баллов.
*/
public function checkAnswer( $answer )
{
$points = $this -> points ;
$isCorrect = 0 ;
if ( $answer == $this -> correctAnswer or
$this -> deviation > abs ( $this -> correctAnswer - $answer ) ) { $isCorrect = 1 ;
}
return array ( $isCorrect , $isAlmostCorrect = 0 , $points ) ; }
}
/* Функция создающая массив с вопросами */
function createQuestions( ) {
$questions = [ ] ;
$text = 'Какая планета располагается четвертой по счету от Солнца?' ;
$answers = array ( 'a' => 'Венера' , 'b' => 'Марс' , 'c' => 'Юпитер' , 'd' => 'Меркурий' ) ; $hint = 'Одноименное название носит шоколадный батончик.' ;
$q = new MultipleChoiceQuestion( $text , 10 , $answers , 'b' , $hint ) ;
$questions [ ] = $q ;
$text = 'Какой город является столицей Великобритании?' ;
$answers = array ( 'a' => 'Париж' , 'b' => 'Москва' , 'c' => 'Нью-Йорк' , 'd' => 'Лондон' ) ; $hint = '%Городнейм% из кэпитал оф грейт британ.' ;
$q = new MultipleChoiceQuestion( $text , 5 , $answers , 'd' , $hint ) ;
$questions [ ] = $q ;
$text = 'Кто придумал теорию относительности?' ;
$answers = array ( 'a' => 'Джон Леннон' , 'b' => 'Джим Моррисон' , 'c' => 'Альберт Эйнштейн' , 'd' => 'Исаак Ньютон' ) ; $hint = 'Этим парнем был...' ;
$q = new MultipleChoiceQuestion( $text , 30 , $answers , 'c' , $hint ) ;
$q -> addAlmostCorrectAnswer ( 'b' ) ;
$questions [ ] = $q ;
$q = new NumericalQuestion( 'Чему равна скорость света в км/с?' , 15 , 299792 , 210 ) ;
$questions [ ] = $q ;
$q = new NumericalQuestion( 'Чему равно число Пи?' , 30 , 3.14 , 0.01 ) ;
$questions [ ] = $q ;
$q = new NumericalQuestion( 'В каком году закончилась вторая мировая война?' , 10 , 1945 ) ;
$questions [ ] = $q ;
return $questions ;
}
/* Функция выводящая список вопросов с вариантами ответов */
function printQuestions( $questions ) {
$number = 1 ;
foreach ( $questions as $question ) {
echo "\n {$number} . " ;
echo $question -> getAsString ( ) ;
$number ++;
}
}
/*
Функция получает на вход массив вопросов и массив ответов. Проверяет ответы,
считает число баллов и выводит вопросы, на которые дан неправильный ответ.
*/
function checkAnswers( $questions , $answers )
{
die ( "Число ответов и вопросов не совпадает\n " ) ; }
$pointsTotal = 0 ;
$pointsMax = 0 ;
$correctAnswers = 0 ;
$totalQuestions = count ( $questions ) ;
for ( $i = 0 ; $i < count ( $questions ) ; $i ++ ) {
$question = $questions [ $i ] ;
$answer = $answers [ $i ] ;
list ( $isCorrect , $isAlmostCorrect , $points ) = $question -> checkAnswer ( $answer ) ;
$pointsMax += $points ;
if ( $isCorrect ) {
$correctAnswers ++;
$pointsTotal += $points ;
} elseif ( $isAlmostCorrect ) {
$correctAnswers ++;
$pointsTotal += $points / 2 ;
} else {
$number = $i + 1 ;
echo "\n Неправильный ответ на вопрос №{$number} ({$question->getQuestionText ()})\n " ;
echo "\n Подсказка: {$question->getQuestionHint ()}\n " ;
}
}
}
echo "\n Правильных ответов: {$correctAnswers} из {$totalQuestions} , баллов набрано: $pointsTotal из $pointsMax \n " ;
}
$questions = createQuestions( ) ;
printQuestions( $questions ) ;
checkAnswers
( $questions , array ( 'b' , 'd' , 'b' , 300000 , 3.14444 , 1944 ) ) ;
PD9waHAKCmVycm9yX3JlcG9ydGluZyhFX0FMTCk7CgphYnN0cmFjdCBjbGFzcyBRdWVzdGlvbgp7Cglwcm90ZWN0ZWQgJHRleHQ7Cglwcm90ZWN0ZWQgJHBvaW50czsKCXByb3RlY3RlZCAkY29ycmVjdEFuc3dlcjsKCglhYnN0cmFjdCBmdW5jdGlvbiBnZXRBc1N0cmluZygpOiBzdHJpbmc7CglhYnN0cmFjdCBmdW5jdGlvbiBjaGVja0Fuc3dlcigkYW5zd2VyKTsKCglwdWJsaWMgZnVuY3Rpb24gZ2V0UXVlc3Rpb25UZXh0KCkKCXsKCQkkdGV4dCA9ICR0aGlzLT50ZXh0OwoJCXJldHVybiAkdGV4dDsKCX0KfQoKY2xhc3MgTXVsdGlwbGVDaG9pY2VRdWVzdGlvbiBleHRlbmRzIFF1ZXN0aW9uCnsKICAgIHByb3RlY3RlZCAkYW5zd2VyczsKICAgIHByb3RlY3RlZCAkYWxtb3N0Q29ycmVjdEFuc3dlcjsKICAgIHByb3RlY3RlZCAkaGludDsKCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICR0ZXh0LCBmbG9hdCAkcG9pbnRzLCBhcnJheSAkYW5zd2Vycywgc3RyaW5nICRjb3JyZWN0QW5zd2VyLCBzdHJpbmcgJGhpbnQpCgl7CgkJJHRoaXMtPnRleHQgPSAkdGV4dDsKCQkkdGhpcy0+cG9pbnRzID0gJHBvaW50czsKCQkkdGhpcy0+YW5zd2VycyA9ICRhbnN3ZXJzOwoJCSR0aGlzLT5jb3JyZWN0QW5zd2VyID0gJGNvcnJlY3RBbnN3ZXI7CgkJJHRoaXMtPmhpbnQgPSAkaGludDsKCX0KCgkvKiDQpNGD0L3QutGG0LjRjyDQv9C+0LvRg9GH0LDQtdGCINC90LAg0LLRhdC+0LQg0L/QvtGH0YLQuCDQutC+0YDRgNC10LrRgtC90YvQuSDQstC+0L/RgNC+0YEg0Lgg0LTQvtCx0LDQstC70Y/QtdGCINC10LPQviDQsiDRgdC+0L7RgtCy0LXRgtCy0YPRjtGJ0LXQtSDRgdCy0L7QudGB0YLQstC+ICovCglwdWJsaWMgZnVuY3Rpb24gYWRkQWxtb3N0Q29ycmVjdEFuc3dlcigkYWxtb3N0Q29ycmVjdEFuc3dlcikKCXsKCQkkdGhpcy0+YWxtb3N0Q29ycmVjdEFuc3dlciA9ICRhbG1vc3RDb3JyZWN0QW5zd2VyOwoJfQoKCS8qINCk0YPQvdC60YbQuNGPINC+0YLQtNCw0LXRgiDRgdGC0YDQvtC60YMg0YHQviDRgdC/0LjRgdC60L7QvCDQstC+0L/RgNC+0YHQvtCyICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0QXNTdHJpbmcoKTogc3RyaW5nCgl7CgkJJHN0cmluZyA9ICJ7JHRoaXMtPnRleHR9XG7QktCw0YDQuNCw0L3RgtGLINC+0YLQstC10YLQvtCyOlxuIjsKCgkJZm9yZWFjaCAoJHRoaXMtPmFuc3dlcnMgYXMgJGxldHRlciA9PiAkYW5zd2VyKSB7CgkJCSRzdHJpbmcgPSAkc3RyaW5nLiJ7JGxldHRlcn0uIHskYW5zd2VyfVxuIjsKCQl9CgoJCXJldHVybiAkc3RyaW5nOwoJfQoKCS8qCgoJ0KTRg9C90LrRhtC40Y8g0L/QvtC70YPRh9Cw0LXRgiDQvdCwINCy0YXQvtC0INC+0YLQstC10YIuINCf0YDQvtCy0LXRgNGP0LXRgiDQtdCz0L4g0L3QsCDQv9GA0LDQstC40LvRjNC90L7RgdGC0Ywg0YEg0YPRh9C10YLQvtC8INC/0L7Rh9GC0Lgg0LrQvtGA0YDQtdC60YLQvdC+0LPQviDQstCw0YDQuNCw0L3RgtCwLgoJ0J7RgtC00LDQtdGCINCyINC80LDRgdGB0LjQsiDRgNC10LfRg9C70YzRgtCw0YLRiyDQv9GA0L7QstC10YDQutC4INGBINC60L7Qu9C40YfQtdGB0YLQstC+0Lwg0LHQsNC70LvQvtCyLgoKCSovCglwdWJsaWMgZnVuY3Rpb24gY2hlY2tBbnN3ZXIoJGFuc3dlcikKCXsKCQkkcG9pbnRzID0gJHRoaXMtPnBvaW50czsKCgkJJGlzQ29ycmVjdCA9IDA7CgkJJGlzQWxtb3N0Q29ycmVjdCA9IDA7CgoJCWlmICgkYW5zd2VyID09ICR0aGlzLT5jb3JyZWN0QW5zd2VyKSB7CgkJCSRpc0NvcnJlY3QgPSAxOwoJCX0gZWxzZWlmICgkYW5zd2VyID09ICR0aGlzLT5hbG1vc3RDb3JyZWN0QW5zd2VyKSB7CgkJCSRpc0FsbW9zdENvcnJlY3QgPSAxOwoJCX0KCgkJcmV0dXJuIGFycmF5KCRpc0NvcnJlY3QsICRpc0FsbW9zdENvcnJlY3QsICRwb2ludHMpOwoJfQoKCS8qINCk0YPQvdC60YbQuNGPINC+0YLQtNCw0LXRgiDQv9C+0LTRgdC60LDQt9C60YMg0Log0LLQvtC/0YDQvtGB0YMgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRRdWVzdGlvbkhpbnQoKQoJewoJCSRoaW50ID0gJHRoaXMtPmhpbnQ7CgkJcmV0dXJuICRoaW50OwoJfQoKfQoKY2xhc3MgTnVtZXJpY2FsUXVlc3Rpb24gZXh0ZW5kcyBRdWVzdGlvbgp7Cglwcm90ZWN0ZWQgJGRldmlhdGlvbjsKCglmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHRleHQsIGZsb2F0ICRwb2ludHMsIGZsb2F0ICRjb3JyZWN0QW5zd2VyLCBmbG9hdCAkZGV2aWF0aW9uID0gMCkKCXsKCQkkdGhpcy0+dGV4dCA9ICR0ZXh0OwoJCSR0aGlzLT5wb2ludHMgPSAkcG9pbnRzOwoJCSR0aGlzLT5jb3JyZWN0QW5zd2VyID0gJGNvcnJlY3RBbnN3ZXI7CgkJJHRoaXMtPmRldmlhdGlvbiA9ICRkZXZpYXRpb247Cgl9CgoJLyog0KTRg9C90LrRhtC40Y8g0L7RgtC00LDQtdGCINGB0YLRgNC+0LrRgyDRgdC+INGB0L/QuNGB0LrQvtC8INCy0L7Qv9GA0L7RgdC+0LIgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRBc1N0cmluZygpOiBzdHJpbmcKCXsKCQlyZXR1cm4gInskdGhpcy0+dGV4dH1cbiI7Cgl9CgoJLyoKCgnQpNGD0L3QutGG0LjRjyDQv9C+0LvRg9GH0LDQtdGCINC90LAg0LLRhdC+0LQg0L7RgtCy0LXRgi4g0J/RgNC+0LLQtdGA0Y/QtdGCINC10LPQviDRgSDRg9GH0LXRgtC+0Lwg0LLQvtC30LzQvtC20L3QvtCz0L4g0L7RgtC60LvQvtC90LXQvdC40Y8uCgnQntGC0LTQsNC10YIg0LIg0LzQsNGB0YHQuNCyINGA0LXQt9GD0LvRjNGC0LDRgiDQv9GA0L7QstC10YDQutC4INC4INC60L7Qu9C40YfQtdGB0YLQstC+INCx0LDQu9C70L7Qsi4KCgkqLwoJcHVibGljIGZ1bmN0aW9uIGNoZWNrQW5zd2VyKCRhbnN3ZXIpCgl7CgkJJHBvaW50cyA9ICR0aGlzLT5wb2ludHM7CgoJCSRpc0NvcnJlY3QgPSAwOwoKCQlpZiAoJGFuc3dlciA9PSAkdGhpcy0+Y29ycmVjdEFuc3dlciBvciAkdGhpcy0+ZGV2aWF0aW9uID4gYWJzKCR0aGlzLT5jb3JyZWN0QW5zd2VyIC0gJGFuc3dlcikpIHsKCQkJJGlzQ29ycmVjdCA9IDE7CgkJfQoKICAgICAgICByZXR1cm4gYXJyYXkoJGlzQ29ycmVjdCwgJGlzQWxtb3N0Q29ycmVjdCA9IDAsICRwb2ludHMpOwoJfQoKfQoKLyog0KTRg9C90LrRhtC40Y8g0YHQvtC30LTQsNGO0YnQsNGPINC80LDRgdGB0LjQsiDRgSDQstC+0L/RgNC+0YHQsNC80LggKi8KZnVuY3Rpb24gY3JlYXRlUXVlc3Rpb25zKCkgewoJJHF1ZXN0aW9ucyA9IFtdOwoKCSR0ZXh0ID0gJ9Ca0LDQutCw0Y8g0L/Qu9Cw0L3QtdGC0LAg0YDQsNGB0L/QvtC70LDQs9Cw0LXRgtGB0Y8g0YfQtdGC0LLQtdGA0YLQvtC5INC/0L4g0YHRh9C10YLRgyDQvtGCINCh0L7Qu9C90YbQsD8nOwoJJGFuc3dlcnMgPSBhcnJheSgnYScgPT4gJ9CS0LXQvdC10YDQsCcsICdiJyA9PiAn0JzQsNGA0YEnLCAnYycgPT4gJ9Cu0L/QuNGC0LXRgCcsICdkJyA9PiAn0JzQtdGA0LrRg9GA0LjQuScpOwoJJGhpbnQgPSAn0J7QtNC90L7QuNC80LXQvdC90L7QtSDQvdCw0LfQstCw0L3QuNC1INC90L7RgdC40YIg0YjQvtC60L7Qu9Cw0LTQvdGL0Lkg0LHQsNGC0L7QvdGH0LjQui4nOwoJJHEgPSBuZXcgTXVsdGlwbGVDaG9pY2VRdWVzdGlvbigkdGV4dCwgMTAsICRhbnN3ZXJzLCAnYicsICRoaW50KTsKCgkkcXVlc3Rpb25zW10gPSAkcTsKCgkkdGV4dCA9ICfQmtCw0LrQvtC5INCz0L7RgNC+0LQg0Y/QstC70Y/QtdGC0YHRjyDRgdGC0L7Qu9C40YbQtdC5INCS0LXQu9C40LrQvtCx0YDQuNGC0LDQvdC40Lg/JzsKCSRhbnN3ZXJzID0gYXJyYXkoJ2EnID0+ICfQn9Cw0YDQuNC2JywgJ2InID0+ICfQnNC+0YHQutCy0LAnLCAnYycgPT4gJ9Cd0YzRji3QmdC+0YDQuicsICdkJyA9PiAn0JvQvtC90LTQvtC9Jyk7CgkkaGludCA9ICcl0JPQvtGA0L7QtNC90LXQudC8JSDQuNC3INC60Y3Qv9C40YLQsNC7INC+0YQg0LPRgNC10LnRgiDQsdGA0LjRgtCw0L0uJzsKCSRxID0gbmV3IE11bHRpcGxlQ2hvaWNlUXVlc3Rpb24oJHRleHQsIDUsICRhbnN3ZXJzLCAnZCcsICRoaW50KTsKCgkkcXVlc3Rpb25zW10gPSAkcTsKCgkkdGV4dCA9ICfQmtGC0L4g0L/RgNC40LTRg9C80LDQuyDRgtC10L7RgNC40Y4g0L7RgtC90L7RgdC40YLQtdC70YzQvdC+0YHRgtC4Pyc7CgkkYW5zd2VycyA9IGFycmF5KCdhJyA9PiAn0JTQttC+0L0g0JvQtdC90L3QvtC9JywgJ2InID0+ICfQlNC20LjQvCDQnNC+0YDRgNC40YHQvtC9JywgJ2MnID0+ICfQkNC70YzQsdC10YDRgiDQrdC50L3RiNGC0LXQudC9JywgJ2QnID0+ICfQmNGB0LDQsNC6INCd0YzRjtGC0L7QvScpOwoJJGhpbnQgPSAn0K3RgtC40Lwg0L/QsNGA0L3QtdC8INCx0YvQuy4uLic7CgkkcSA9IG5ldyBNdWx0aXBsZUNob2ljZVF1ZXN0aW9uKCR0ZXh0LCAzMCwgJGFuc3dlcnMsICdjJywgJGhpbnQpOwoJJHEtPmFkZEFsbW9zdENvcnJlY3RBbnN3ZXIoJ2InKTsKCgkkcXVlc3Rpb25zW10gPSAkcTsKCgkkcSA9IG5ldyBOdW1lcmljYWxRdWVzdGlvbign0KfQtdC80YMg0YDQsNCy0L3QsCDRgdC60L7RgNC+0YHRgtGMINGB0LLQtdGC0LAg0LIg0LrQvC/RgT8nLCAxNSwgMjk5NzkyLCAyMTApOwoKCSRxdWVzdGlvbnNbXSA9ICRxOwoKCSRxID0gbmV3IE51bWVyaWNhbFF1ZXN0aW9uKCfQp9C10LzRgyDRgNCw0LLQvdC+INGH0LjRgdC70L4g0J/QuD8nLCAzMCwgMy4xNCwgMC4wMSk7CgoJJHF1ZXN0aW9uc1tdID0gJHE7CgoJJHEgPSBuZXcgTnVtZXJpY2FsUXVlc3Rpb24oJ9CSINC60LDQutC+0Lwg0LPQvtC00YMg0LfQsNC60L7QvdGH0LjQu9Cw0YHRjCDQstGC0L7RgNCw0Y8g0LzQuNGA0L7QstCw0Y8g0LLQvtC50L3QsD8nLCAxMCwgMTk0NSk7CgoJJHF1ZXN0aW9uc1tdID0gJHE7CgoJcmV0dXJuICRxdWVzdGlvbnM7Cn0KCi8qINCk0YPQvdC60YbQuNGPINCy0YvQstC+0LTRj9GJ0LDRjyDRgdC/0LjRgdC+0Log0LLQvtC/0YDQvtGB0L7QsiDRgSDQstCw0YDQuNCw0L3RgtCw0LzQuCDQvtGC0LLQtdGC0L7QsiAqLwpmdW5jdGlvbiBwcmludFF1ZXN0aW9ucygkcXVlc3Rpb25zKSB7CgoJJG51bWJlciA9IDE7CgoJZm9yZWFjaCAoJHF1ZXN0aW9ucyBhcyAkcXVlc3Rpb24pIHsKCQllY2hvICJcbnskbnVtYmVyfS4gIjsKCQllY2hvICRxdWVzdGlvbi0+Z2V0QXNTdHJpbmcoKTsKCgkJJG51bWJlciArKzsKCX0KCn0KCi8qCgrQpNGD0L3QutGG0LjRjyDQv9C+0LvRg9GH0LDQtdGCINC90LAg0LLRhdC+0LQg0LzQsNGB0YHQuNCyINCy0L7Qv9GA0L7RgdC+0LIg0Lgg0LzQsNGB0YHQuNCyINC+0YLQstC10YLQvtCyLiDQn9GA0L7QstC10YDRj9C10YIg0L7RgtCy0LXRgtGLLCAK0YHRh9C40YLQsNC10YIg0YfQuNGB0LvQviDQsdCw0LvQu9C+0LIg0Lgg0LLRi9Cy0L7QtNC40YIg0LLQvtC/0YDQvtGB0YssINC90LAg0LrQvtGC0L7RgNGL0LUg0LTQsNC9INC90LXQv9GA0LDQstC40LvRjNC90YvQuSDQvtGC0LLQtdGCLgoKKi8KZnVuY3Rpb24gY2hlY2tBbnN3ZXJzKCRxdWVzdGlvbnMsICRhbnN3ZXJzKQp7CiAgICBpZiAoY291bnQoJHF1ZXN0aW9ucykgIT0gY291bnQoJGFuc3dlcnMpKSB7CiAgICAgICAgZGllKCLQp9C40YHQu9C+INC+0YLQstC10YLQvtCyINC4INCy0L7Qv9GA0L7RgdC+0LIg0L3QtSDRgdC+0LLQv9Cw0LTQsNC10YJcbiIpOwogICAgfQoKICAgICRwb2ludHNUb3RhbCA9IDA7CiAgICAkcG9pbnRzTWF4ID0gMDsKICAgICRjb3JyZWN0QW5zd2VycyA9IDA7CgogICAgJHRvdGFsUXVlc3Rpb25zID0gY291bnQoJHF1ZXN0aW9ucyk7CgogICAgZm9yICgkaSA9IDA7ICRpIDwgY291bnQoJHF1ZXN0aW9ucyk7ICRpKyspIHsKCiAgICAgICAgJHF1ZXN0aW9uID0gJHF1ZXN0aW9uc1skaV07CiAgICAgICAgJGFuc3dlciA9ICRhbnN3ZXJzWyRpXTsKCiAgICAgICAgbGlzdCgkaXNDb3JyZWN0LCAkaXNBbG1vc3RDb3JyZWN0LCAkcG9pbnRzKSA9ICRxdWVzdGlvbi0+Y2hlY2tBbnN3ZXIoJGFuc3dlcik7CgogICAgICAgICRwb2ludHNNYXggKz0gJHBvaW50czsKCiAgICAgICAgaWYgKCRpc0NvcnJlY3QpIHsKCiAgICAgICAgICAgICRjb3JyZWN0QW5zd2VycyArKzsKICAgICAgICAgICAgJHBvaW50c1RvdGFsICs9ICRwb2ludHM7CgogICAgICAgIH0gZWxzZWlmICgkaXNBbG1vc3RDb3JyZWN0KSB7CgogICAgICAgIAkkY29ycmVjdEFuc3dlcnMgKys7CiAgICAgICAgICAgICRwb2ludHNUb3RhbCArPSAkcG9pbnRzIC8gMjsKCiAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICRudW1iZXIgPSAkaSArIDE7CiAgICAgICAgICAgIGVjaG8gIlxu0J3QtdC/0YDQsNCy0LjQu9GM0L3Ri9C5INC+0YLQstC10YIg0L3QsCDQstC+0L/RgNC+0YEg4oSWeyRudW1iZXJ9ICh7JHF1ZXN0aW9uLT5nZXRRdWVzdGlvblRleHQoKX0pXG4iOwoKICAgICAgICAgICAgaWYgKG1ldGhvZF9leGlzdHMoJHF1ZXN0aW9uLCAnZ2V0UXVlc3Rpb25IaW50JykpIHsKICAgICAgICAgICAgCWVjaG8gIlxu0J/QvtC00YHQutCw0LfQutCwOiB7JHF1ZXN0aW9uLT5nZXRRdWVzdGlvbkhpbnQoKX1cbiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgIH0KCiAgICBlY2hvICJcbtCf0YDQsNCy0LjQu9GM0L3Ri9GFINC+0YLQstC10YLQvtCyOiB7JGNvcnJlY3RBbnN3ZXJzfSDQuNC3IHskdG90YWxRdWVzdGlvbnN9LCDQsdCw0LvQu9C+0LIg0L3QsNCx0YDQsNC90L46ICRwb2ludHNUb3RhbCDQuNC3ICRwb2ludHNNYXhcbiI7Cn0KCiRxdWVzdGlvbnMgPSBjcmVhdGVRdWVzdGlvbnMoKTsKcHJpbnRRdWVzdGlvbnMoJHF1ZXN0aW9ucyk7CmNoZWNrQW5zd2VycygkcXVlc3Rpb25zLCBhcnJheSgnYicsICdkJywgJ2InLCAzMDAwMDAsIDMuMTQ0NDQsIDE5NDQpKTs=