<?php
/* Возвращает соответствующую числу форму слова: 1 рубль, 2 рубля, 5 рублей */
function inclineWord( $number , $word1 , $word2 , $word5 ) {
return $word1 ;
elseif ( preg_match ( '/([^1][2-4])$/' , $number ) == TRUE ) //в зависимости от последних знаков, подбирается подходящее слово return $word2 ;
elseif ( preg_match ( '/(.?[05-9]|1\d)$/' , $number ) == TRUE ) return $word5 ;
}
/*
Преобразует числа от 0 до 999 в текст. Параметр $isFemale равен нулю,
если мы считаем число для мужского рода (один рубль),
и 1 — для женского (одна тысяча)
*/
function smallNumberToText( $number , $isFemale ) {
0 => 'ноль' , 10 => 'десять' , 100 => 'сто' ,
1 => 'один' , 11 => 'одиннадцать' , 20 => 'двадцать' , 200 => 'двести' ,
2 => 'два' , 12 => 'двенадцать' , 30 => 'тридцать' , 300 => 'триста' ,
3 => 'три' , 13 => 'тринадцать' , 40 => 'сорок' , 400 => 'четыреста' ,
4 => 'четыре' , 14 => 'четырнадцать' , 50 => 'пятьдесят' , 500 => 'пятьсот' ,
5 => 'пять' , 15 => 'пятнадцать' , 60 => 'шестьдесят' , 600 => 'шестьсот' ,
6 => 'шесть' , 16 => 'шестнадцать' , 70 => 'семьдесят' , 700 => 'семьсот' ,
7 => 'семь' , 17 => 'семнадцать' , 80 => 'восемьдесят' , 800 => 'восемьсот' ,
8 => 'восемь' , 18 => 'восемнадцать' , 90 => 'девяносто' , 900 => 'девятьсот' ,
9 => 'девять' , 19 => 'девятнадцать' , 'null' => '' /* null - специальный ключ на случай если нет необходимости писать прописью, к примеру, ноль тысяч */
) ;
1 => 'одна' , 2 => 'две'
) ;
if ( $isFemale == 1 ) //на случай, если речь зайдет о тысячах и нужно будет употребить 'одна', а не 'один'
$spelling = array_replace( $spelling , $femaleSpelling ) ;
if ( preg_match ( '/^(000)$/' , $number ) == TRUE ) //если где-то в середине затерялось 3 нолика и их не нужно озвучивать $result = $spelling [ 'null' ] ;
elseif ( preg_match ( '/^(000)$/' , $number ) == FALSE ) { //тут уже раскладываем число по словам settype ( $number , "integer" ) ; //ибо для удобства числа в функцию залетают в виде строк, исправляем это $preparationArray = array ( ) ; //то, куда будем все складывать
if ( array_key_exists ( $number , $spelling ) == TRUE ) { //в случае обнаружения входного числа в массиве $preparationArray [ ] = $spelling [ $number ] ;
} elseif ( array_key_exists ( $number , $spelling ) == FALSE ) { //тут сами раскладываем число
if ( $number > 99 ) {
$hundreds = floor ( $number / 100 ) * 100 ; $decades = $number % 100 ;
$numbers = $decades % 10 ;
if ( array_key_exists ( $decades , $spelling ) == TRUE && $decades > 9 ) //не будем дописывать единицы в этом случае $numbers = 'null' ;
elseif ( $decades >= 0 ) { //расписываем десятки и числа сами
$decades -= $numbers ;
elseif ( $decades < 10 )
$decades = 'null' ;
}
} elseif ( $number <= 99 ) {
$nundreds = 'null' ;
$decades = floor ( $number / 10 ) * 10 ; $numbers = $number - $decades ;
if ( $number < 10 ) //в случае если второй знак в номере будет меньше 1, десятки не прописываются
$decades = 'null' ;
}
array_push ( $preparationArray , $spelling [ $hundreds ] , $spelling [ $decades ] , $spelling [ $numbers ] ) ; $preparationArray = array_diff ( $preparationArray , array ( '' ) ) ; //очищаем массив от пустых элементов, избегая лишних пробелов }
$result = implode ( ' ' , $preparationArray ) ; //склеиваем элементы конечного массива слов пробелами }
return $result ;
}
function numberToText( $number ) {
$preparationArray = array ( ) ;
if ( $number > 999999 ) {
$millions = smallNumberToText( $millionsPrep , 0 ) . ' ' . inclineWord( $millionsPrep , 'миллион' , 'миллиона' , 'миллионов' ) ;
$preparationArray [ ] = $millions ;
}
if ( $number > 999 ) {
if ( intval ( $thousandsPrep ) > 0 ) { //если тысяч будет больше, чем 0, то мы выведем слова, а иначе зачем это делать? $thousands = smallNumberToText( $thousandsPrep , 1 ) . ' ' . inclineWord( $thousandsPrep , 'тысяча' , 'тысячи' , 'тысяч' ) ;
$preparationArray [ ] = $thousands ;
}
}
if ( $number >= 0 ) {
if ( $number > 999 ) {
} elseif ( $number <= 999 ) {
$numbersPrep = $number ;
}
$numbers = smallNumberToText( $numbersPrep , 0 ) . ' ' . inclineWord( $numbersPrep , 'рубль' , 'рубля' , 'рублей' ) . ' ' . "({$number} )" ;
$preparationArray [ ] = $numbers ;
}
$result = implode ( ' ' , $preparationArray ) ; return $result ;
}
/* Вызовем функцию несколько раз */
$amount1 = 999999999 ;
$text1 = numberToText( $amount1 ) ;
echo "На вашем счету {$text1} \n " ;
$amount2 = 0 ;
$text2 = numberToText( $amount2 ) ;
echo "На вашем счету {$text2} \n " ;
$amount3 = 1 ;
$text3 = numberToText( $amount3 ) ;
echo "На вашем счету {$text3} \n " ;
$amount4 = 11012013 ;
$text4 = numberToText( $amount4 ) ;
echo "На вашем счету {$text4} \n " ;
$amount5 = 7000008 ;
$text5 = numberToText( $amount5 ) ;
echo "На вашем счету {$text5} \n " ;
$amount6 = 1002 ;
$text6 = numberToText( $amount6 ) ;
echo "На вашем счету {$text6} \n " ;
$amount7 = 1000 ;
$text7 = numberToText( $amount7 ) ;
echo "На вашем счету {$text7} \n " ;
$amount8 = 7000000 ;
$text8 = numberToText( $amount8 ) ;
echo "На вашем счету {$text8} \n " ;
PD9waHAKCi8qINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0L7QvtGC0LLQtdGC0YHRgtCy0YPRjtGJ0YPRjiDRh9C40YHQu9GDINGE0L7RgNC80YMg0YHQu9C+0LLQsDogMSDRgNGD0LHQu9GMLCAyINGA0YPQsdC70Y8sIDUg0YDRg9Cx0LvQtdC5ICovCmZ1bmN0aW9uIGluY2xpbmVXb3JkKCRudW1iZXIsICR3b3JkMSwgJHdvcmQyLCAkd29yZDUpIHsKCiAgICBpZiAocHJlZ19tYXRjaCgnLyheMXxbXjFdMSkkLycsICRudW1iZXIpID09IFRSVUUpCiAgICAgICAgcmV0dXJuICR3b3JkMTsKICAgIGVsc2VpZiAocHJlZ19tYXRjaCgnLyhbXjFdWzItNF0pJC8nLCAkbnVtYmVyKSA9PSBUUlVFKSAvL9CyINC30LDQstC40YHQuNC80L7RgdGC0Lgg0L7RgiDQv9C+0YHQu9C10LTQvdC40YUg0LfQvdCw0LrQvtCyLCDQv9C+0LTQsdC40YDQsNC10YLRgdGPINC/0L7QtNGF0L7QtNGP0YnQtdC1INGB0LvQvtCy0L4KICAgICAgICByZXR1cm4gJHdvcmQyOwogICAgZWxzZWlmIChwcmVnX21hdGNoKCcvKC4/WzA1LTldfDFcZCkkLycsICRudW1iZXIpID09IFRSVUUpCiAgICAgICAgcmV0dXJuICR3b3JkNTsKfQoKLyogCiAgICDQn9GA0LXQvtCx0YDQsNC30YPQtdGCINGH0LjRgdC70LAg0L7RgiAwINC00L4gOTk5INCyINGC0LXQutGB0YIuINCf0LDRgNCw0LzQtdGC0YAgJGlzRmVtYWxlINGA0LDQstC10L0g0L3Rg9C70Y4sIAogICAg0LXRgdC70Lgg0LzRiyDRgdGH0LjRgtCw0LXQvCDRh9C40YHQu9C+INC00LvRjyDQvNGD0LbRgdC60L7Qs9C+INGA0L7QtNCwICjQvtC00LjQvSDRgNGD0LHQu9GMKSwgCiAgICDQuCAxIOKAlCDQtNC70Y8g0LbQtdC90YHQutC+0LPQviAo0L7QtNC90LAg0YLRi9GB0Y/Rh9CwKSAKKi8KZnVuY3Rpb24gc21hbGxOdW1iZXJUb1RleHQoJG51bWJlciwgJGlzRmVtYWxlKSB7CgogICAgJHNwZWxsaW5nID0gYXJyYXkoCiAgICAgICAgMCAgID0+ICAn0L3QvtC70YwnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCAgPT4gICfQtNC10YHRj9GC0YwnLCAgICAgICAxMDAgPT4gICfRgdGC0L4nLAogICAgICAgIDEgICA9PiAgJ9C+0LTQuNC9JywgICAgICAgICAxMSAgPT4gICfQvtC00LjQvdC90LDQtNGG0LDRgtGMJywgICAgICAyMCAgPT4gICfQtNCy0LDQtNGG0LDRgtGMJywgICAgIDIwMCA9PiAgJ9C00LLQtdGB0YLQuCcsCiAgICAgICAgMiAgID0+ICAn0LTQstCwJywgICAgICAgICAgMTIgID0+ICAn0LTQstC10L3QsNC00YbQsNGC0YwnLCAgICAgICAzMCAgPT4gICfRgtGA0LjQtNGG0LDRgtGMJywgICAgIDMwMCA9PiAgJ9GC0YDQuNGB0YLQsCcsCiAgICAgICAgMyAgID0+ICAn0YLRgNC4JywgICAgICAgICAgMTMgID0+ICAn0YLRgNC40L3QsNC00YbQsNGC0YwnLCAgICAgICA0MCAgPT4gICfRgdC+0YDQvtC6JywgICAgICAgIDQwMCA9PiAgJ9GH0LXRgtGL0YDQtdGB0YLQsCcsCiAgICAgICAgNCAgID0+ICAn0YfQtdGC0YvRgNC1JywgICAgICAgMTQgID0+ICAn0YfQtdGC0YvRgNC90LDQtNGG0LDRgtGMJywgICAgIDUwICA9PiAgJ9C/0Y/RgtGM0LTQtdGB0Y/RgicsICAgIDUwMCA9PiAgJ9C/0Y/RgtGM0YHQvtGCJywKICAgICAgICA1ICAgPT4gICfQv9GP0YLRjCcsICAgICAgICAgMTUgID0+ICAn0L/Rj9GC0L3QsNC00YbQsNGC0YwnLCAgICAgICA2MCAgPT4gICfRiNC10YHRgtGM0LTQtdGB0Y/RgicsICAgNjAwID0+ICAn0YjQtdGB0YLRjNGB0L7RgicsCiAgICAgICAgNiAgID0+ICAn0YjQtdGB0YLRjCcsICAgICAgICAxNiAgPT4gICfRiNC10YHRgtC90LDQtNGG0LDRgtGMJywgICAgICA3MCAgPT4gICfRgdC10LzRjNC00LXRgdGP0YInLCAgICA3MDAgPT4gICfRgdC10LzRjNGB0L7RgicsICAgIAogICAgICAgIDcgICA9PiAgJ9GB0LXQvNGMJywgICAgICAgICAxNyAgPT4gICfRgdC10LzQvdCw0LTRhtCw0YLRjCcsICAgICAgIDgwICA9PiAgJ9Cy0L7RgdC10LzRjNC00LXRgdGP0YInLCAgIDgwMCA9PiAgJ9Cy0L7RgdC10LzRjNGB0L7RgicsCiAgICAgICAgOCAgID0+ICAn0LLQvtGB0LXQvNGMJywgICAgICAgMTggID0+ICAn0LLQvtGB0LXQvNC90LDQtNGG0LDRgtGMJywgICAgIDkwICA9PiAgJ9C00LXQstGP0L3QvtGB0YLQvicsICAgICA5MDAgPT4gICfQtNC10LLRj9GC0YzRgdC+0YInLAogICAgICAgIDkgICA9PiAgJ9C00LXQstGP0YLRjCcsICAgICAgIDE5ICA9PiAgJ9C00LXQstGP0YLQvdCw0LTRhtCw0YLRjCcsICAgICAgJ251bGwnID0+ICcnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bGwgLSDRgdC/0LXRhtC40LDQu9GM0L3Ri9C5INC60LvRjtGHINC90LAg0YHQu9GD0YfQsNC5INC10YHQu9C4INC90LXRgiDQvdC10L7QsdGF0L7QtNC40LzQvtGB0YLQuCDQv9C40YHQsNGC0Ywg0L/RgNC+0L/QuNGB0YzRjiwg0Log0L/RgNC40LzQtdGA0YMsINC90L7Qu9GMINGC0YvRgdGP0YcgICovCiAgICApOwogICAgCiAgICAkZmVtYWxlU3BlbGxpbmcgPSBhcnJheSgKICAgICAgICAxICAgPT4gICfQvtC00L3QsCcsICAgICAgICAyICAgPT4gICfQtNCy0LUnCiAgICApOwogICAgCiAgICBpZiAoJGlzRmVtYWxlID09IDEpIC8v0L3QsCDRgdC70YPRh9Cw0LksINC10YHQu9C4INGA0LXRh9GMINC30LDQudC00LXRgiDQviDRgtGL0YHRj9GH0LDRhSDQuCDQvdGD0LbQvdC+INCx0YPQtNC10YIg0YPQv9C+0YLRgNC10LHQuNGC0YwgJ9C+0LTQvdCwJywg0LAg0L3QtSAn0L7QtNC40L0nCiAgICAgICAgJHNwZWxsaW5nID0gYXJyYXlfcmVwbGFjZSgkc3BlbGxpbmcsICRmZW1hbGVTcGVsbGluZyk7CgogICAgaWYgKHByZWdfbWF0Y2goJy9eKDAwMCkkLycsICRudW1iZXIpID09IFRSVUUpIC8v0LXRgdC70Lgg0LPQtNC1LdGC0L4g0LIg0YHQtdGA0LXQtNC40L3QtSDQt9Cw0YLQtdGA0Y/Qu9C+0YHRjCAzINC90L7Qu9C40LrQsCDQuCDQuNGFINC90LUg0L3Rg9C20L3QviDQvtC30LLRg9GH0LjQstCw0YLRjAogICAgICAgICRyZXN1bHQgPSAkc3BlbGxpbmdbJ251bGwnXTsKICAgIGVsc2VpZiAocHJlZ19tYXRjaCgnL14oMDAwKSQvJywgJG51bWJlcikgPT0gRkFMU0UpIHsgLy/RgtGD0YIg0YPQttC1INGA0LDRgdC60LvQsNC00YvQstCw0LXQvCDRh9C40YHQu9C+INC/0L4g0YHQu9C+0LLQsNC8CiAgICAgICAgc2V0dHlwZSgkbnVtYmVyLCAiaW50ZWdlciIpOyAvL9C40LHQviDQtNC70Y8g0YPQtNC+0LHRgdGC0LLQsCDRh9C40YHQu9CwINCyINGE0YPQvdC60YbQuNGOINC30LDQu9C10YLQsNGO0YIg0LIg0LLQuNC00LUg0YHRgtGA0L7Quiwg0LjRgdC/0YDQsNCy0LvRj9C10Lwg0Y3RgtC+CiAgICAgICAgJHByZXBhcmF0aW9uQXJyYXkgPSBhcnJheSgpOyAvL9GC0L4sINC60YPQtNCwINCx0YPQtNC10Lwg0LLRgdC1INGB0LrQu9Cw0LTRi9Cy0LDRgtGMCgogICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCRudW1iZXIsICRzcGVsbGluZykgPT0gVFJVRSkgeyAvL9CyINGB0LvRg9GH0LDQtSDQvtCx0L3QsNGA0YPQttC10L3QuNGPINCy0YXQvtC00L3QvtCz0L4g0YfQuNGB0LvQsCDQsiDQvNCw0YHRgdC40LLQtQogICAgICAgICAgICAkcHJlcGFyYXRpb25BcnJheVtdID0gJHNwZWxsaW5nWyRudW1iZXJdOwogICAgICAgIH0gZWxzZWlmIChhcnJheV9rZXlfZXhpc3RzKCRudW1iZXIsICRzcGVsbGluZykgPT0gRkFMU0UpIHsgLy/RgtGD0YIg0YHQsNC80Lgg0YDQsNGB0LrQu9Cw0LTRi9Cy0LDQtdC8INGH0LjRgdC70L4KCiAgICAgICAgICAgIGlmICgkbnVtYmVyID4gOTkpIHsKICAgICAgICAgICAgICAgICRodW5kcmVkcyA9IGZsb29yKCRudW1iZXIgLyAxMDApICogMTAwOwogICAgICAgICAgICAgICAgJGRlY2FkZXMgPSAkbnVtYmVyICUgMTAwOwogICAgICAgICAgICAgICAgJG51bWJlcnMgPSAkZGVjYWRlcyAlIDEwOwoKICAgICAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCRkZWNhZGVzLCAkc3BlbGxpbmcpID09IFRSVUUgJiYgJGRlY2FkZXMgPiA5KSAvL9C90LUg0LHRg9C00LXQvCDQtNC+0L/QuNGB0YvQstCw0YLRjCDQtdC00LjQvdC40YbRiyDQsiDRjdGC0L7QvCDRgdC70YPRh9Cw0LUKICAgICAgICAgICAgICAgICAgICAkbnVtYmVycyA9ICdudWxsJzsKICAgICAgICAgICAgICAgIGVsc2VpZiAoJGRlY2FkZXMgPj0gMCkgeyAvL9GA0LDRgdC/0LjRgdGL0LLQsNC10Lwg0LTQtdGB0Y/RgtC60Lgg0Lgg0YfQuNGB0LvQsCDRgdCw0LzQuAoKICAgICAgICAgICAgICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygkZGVjYWRlcywgJHNwZWxsaW5nKSA9PSBGQUxTRSkKICAgICAgICAgICAgICAgICAgICAgICAgJGRlY2FkZXMgLT0gJG51bWJlcnM7CiAgICAgICAgICAgICAgICAgICAgZWxzZWlmICgkZGVjYWRlcyA8IDEwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAkZGVjYWRlcyA9ICdudWxsJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlaWYgKCRudW1iZXIgPD0gOTkpIHsKICAgICAgICAgICAgICAgICRudW5kcmVkcyA9ICdudWxsJzsgICAgIAogICAgICAgICAgICAgICAgJGRlY2FkZXMgPSBmbG9vcigkbnVtYmVyIC8gMTApICogMTA7CiAgICAgICAgICAgICAgICAkbnVtYmVycyA9ICRudW1iZXIgLSAkZGVjYWRlczsKCiAgICAgICAgICAgICAgICBpZiAoJG51bWJlciA8IDEwKSAvL9CyINGB0LvRg9GH0LDQtSDQtdGB0LvQuCDQstGC0L7RgNC+0Lkg0LfQvdCw0Log0LIg0L3QvtC80LXRgNC1INCx0YPQtNC10YIg0LzQtdC90YzRiNC1IDEsINC00LXRgdGP0YLQutC4INC90LUg0L/RgNC+0L/QuNGB0YvQstCw0Y7RgtGB0Y8KICAgICAgICAgICAgICAgICAgICAkZGVjYWRlcyA9ICdudWxsJzsKICAgICAgICAgICAgfSAKICAgICAgICAgICAgYXJyYXlfcHVzaCgkcHJlcGFyYXRpb25BcnJheSwgJHNwZWxsaW5nWyRodW5kcmVkc10sICRzcGVsbGluZ1skZGVjYWRlc10sICRzcGVsbGluZ1skbnVtYmVyc10pOwogICAgICAgICAgICAkcHJlcGFyYXRpb25BcnJheSA9IGFycmF5X2RpZmYoJHByZXBhcmF0aW9uQXJyYXksIGFycmF5KCcnKSk7IC8v0L7Rh9C40YnQsNC10Lwg0LzQsNGB0YHQuNCyINC+0YIg0L/Rg9GB0YLRi9GFINGN0LvQtdC80LXQvdGC0L7Qsiwg0LjQt9Cx0LXQs9Cw0Y8g0LvQuNGI0L3QuNGFINC/0YDQvtCx0LXQu9C+0LIKICAgICAgICB9CiAgICAgICAgJHJlc3VsdCA9IGltcGxvZGUoJyAnLCAkcHJlcGFyYXRpb25BcnJheSk7IC8v0YHQutC70LXQuNCy0LDQtdC8INGN0LvQtdC80LXQvdGC0Ysg0LrQvtC90LXRh9C90L7Qs9C+INC80LDRgdGB0LjQstCwINGB0LvQvtCyINC/0YDQvtCx0LXQu9Cw0LzQuAogICAgfQogICAgcmV0dXJuICRyZXN1bHQ7Cn0KCmZ1bmN0aW9uIG51bWJlclRvVGV4dCgkbnVtYmVyKSB7CiAgICAKICAgICRwcmVwYXJhdGlvbkFycmF5ID0gYXJyYXkoKTsKICAgICRudW1iZXIgPSBzdHJ2YWwoJG51bWJlcik7CgogICAgaWYgKCRudW1iZXIgPiA5OTk5OTkpIHsKICAgICAgICAkbWlsbGlvbnNQcmVwID0gbWJfc3Vic3RyKCRudW1iZXIsIDAsIC02KTsKICAgICAgICAkbWlsbGlvbnMgPSBzbWFsbE51bWJlclRvVGV4dCgkbWlsbGlvbnNQcmVwLCAwKSAuICcgJyAuIGluY2xpbmVXb3JkKCRtaWxsaW9uc1ByZXAsICfQvNC40LvQu9C40L7QvScsICfQvNC40LvQu9C40L7QvdCwJywgJ9C80LjQu9C70LjQvtC90L7QsicpOwogICAgICAgICRwcmVwYXJhdGlvbkFycmF5W10gPSAkbWlsbGlvbnM7CiAgICB9CgogICAgaWYgKCRudW1iZXIgPiA5OTkpIHsKICAgICAgICAkdGhvdXNhbmRzUHJlcCA9IG1iX3N1YnN0cigkbnVtYmVyLCAtNiwgLTMpOyAKICAgICAgICBpZiAoaW50dmFsKCR0aG91c2FuZHNQcmVwKSA+IDApIHsgLy/QtdGB0LvQuCDRgtGL0YHRj9GHINCx0YPQtNC10YIg0LHQvtC70YzRiNC1LCDRh9C10LwgMCwg0YLQviDQvNGLINCy0YvQstC10LTQtdC8INGB0LvQvtCy0LAsINCwINC40L3QsNGH0LUg0LfQsNGH0LXQvCDRjdGC0L4g0LTQtdC70LDRgtGMPwogICAgICAgICAgICAkdGhvdXNhbmRzID0gc21hbGxOdW1iZXJUb1RleHQoJHRob3VzYW5kc1ByZXAsIDEpIC4gJyAnIC4gaW5jbGluZVdvcmQoJHRob3VzYW5kc1ByZXAsICfRgtGL0YHRj9GH0LAnLCAn0YLRi9GB0Y/Rh9C4JywgJ9GC0YvRgdGP0YcnKTsKICAgICAgICAgICAgJHByZXBhcmF0aW9uQXJyYXlbXSA9ICR0aG91c2FuZHM7CiAgICAgICAgfSAgICAgICAKICAgIH0KCiAgICBpZiAoJG51bWJlciA+PSAwKSB7CiAgICAgICAgaWYgKCRudW1iZXIgPiA5OTkpIHsKICAgICAgICAgICAgJG51bWJlcnNQcmVwID0gbWJfc3Vic3RyKCRudW1iZXIsIC0zKTsKICAgICAgICB9IGVsc2VpZiAoJG51bWJlciA8PSA5OTkpIHsKICAgICAgICAgICAgJG51bWJlcnNQcmVwID0gJG51bWJlcjsKICAgICAgICB9CiAgICAgICAgJG51bWJlcnMgPSBzbWFsbE51bWJlclRvVGV4dCgkbnVtYmVyc1ByZXAsIDApIC4gJyAnIC4gaW5jbGluZVdvcmQoJG51bWJlcnNQcmVwLCAn0YDRg9Cx0LvRjCcsICfRgNGD0LHQu9GPJywgJ9GA0YPQsdC70LXQuScpIC4gJyAnIC4gICIoeyRudW1iZXJ9KSI7CiAgICAgICAgJHByZXBhcmF0aW9uQXJyYXlbXSA9ICRudW1iZXJzOwogICAgfQogICAgJHJlc3VsdCA9IGltcGxvZGUoJyAnLCAkcHJlcGFyYXRpb25BcnJheSk7CiAgICByZXR1cm4gJHJlc3VsdDsKfQoKCi8qINCS0YvQt9C+0LLQtdC8INGE0YPQvdC60YbQuNGOINC90LXRgdC60L7Qu9GM0LrQviDRgNCw0LcgKi8KJGFtb3VudDEgPSA5OTk5OTk5OTk7CiR0ZXh0MSA9IG51bWJlclRvVGV4dCgkYW1vdW50MSk7CiAKZWNobyAi0J3QsCDQstCw0YjQtdC8INGB0YfQtdGC0YMgeyR0ZXh0MX1cbiI7CiAKJGFtb3VudDIgPSAwOwokdGV4dDIgPSBudW1iZXJUb1RleHQoJGFtb3VudDIpOwogCmVjaG8gItCd0LAg0LLQsNGI0LXQvCDRgdGH0LXRgtGDIHskdGV4dDJ9XG4iOwogCiRhbW91bnQzID0gMTsKJHRleHQzID0gbnVtYmVyVG9UZXh0KCRhbW91bnQzKTsKIAplY2hvICLQndCwINCy0LDRiNC10Lwg0YHRh9C10YLRgyB7JHRleHQzfVxuIjsKIAokYW1vdW50NCA9IDExMDEyMDEzOwokdGV4dDQgPSBudW1iZXJUb1RleHQoJGFtb3VudDQpOwogCmVjaG8gItCd0LAg0LLQsNGI0LXQvCDRgdGH0LXRgtGDIHskdGV4dDR9XG4iOwoKJGFtb3VudDUgPSA3MDAwMDA4OwokdGV4dDUgPSBudW1iZXJUb1RleHQoJGFtb3VudDUpOwogCmVjaG8gItCd0LAg0LLQsNGI0LXQvCDRgdGH0LXRgtGDIHskdGV4dDV9XG4iOwoKJGFtb3VudDYgPSAxMDAyOwokdGV4dDYgPSBudW1iZXJUb1RleHQoJGFtb3VudDYpOwogCmVjaG8gItCd0LAg0LLQsNGI0LXQvCDRgdGH0LXRgtGDIHskdGV4dDZ9XG4iOwoKJGFtb3VudDcgPSAxMDAwOwokdGV4dDcgPSBudW1iZXJUb1RleHQoJGFtb3VudDcpOwogCmVjaG8gItCd0LAg0LLQsNGI0LXQvCDRgdGH0LXRgtGDIHskdGV4dDd9XG4iOwoKJGFtb3VudDggPSA3MDAwMDAwOwokdGV4dDggPSBudW1iZXJUb1RleHQoJGFtb3VudDgpOwogCmVjaG8gItCd0LAg0LLQsNGI0LXQvCDRgdGH0LXRgtGDIHskdGV4dDh9XG4iOw==