<?php
/* Возвращает соответствующую числу форму слова: 1 рубль, 2 рубля, 5 рублей */
function inclineWord( $number , $word1 , $word2 , $word3 ) {
if ( $number % 100 > 10 and $number % 100 < 20 ) {
$number %= 100 ;
} elseif ( $number > 0 ) {
$number %= 10 ;
}
if ( $number == 1 ) {
$word = $word1 ;
} elseif ( $number >= 2 and $number <= 4 ) {
$word = $word2 ;
} elseif ( $number >= 5 and $number <= 9 or $number > 10 and $number < 20 or $number == 0 ) {
$word = $word3 ;
}
return $word ;
}
/*
Преобразует числа от 0 до 999 в текст. Параметр $isFemale равен нулю,
если мы считаем число для мужского рода (один рубль),
и 1 — для женского (одна тысяча). Параметр $totalNumberLength
помогает определить число ноль.
*/
function smallNumberToText( $number , $isFemale , $totalNumberLength ) {
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 => 'девятнадцать'
) ;
if ( $isFemale ) {
1 => 'одна' ,
2 => 'две'
) ;
$spelling = array_replace( $spelling , $femaleSpelling ) ;
}
if ( $number > 0 ) {
// Разделение числа на единичный массив
for ( $i = 0 ; $i < $lengthOfNumber ; $i ++ ) {
// Объединение чисел с особой формой
if ( $i == 0 and $number % 100 > 10 and $number % 100 < 20 ) {
$numbers [ ] = ( $number % 100 ) ;
$number = floor ( $number / 100 ) ; } else {
$numbers [ ] = ( $number % 10 ) ;
$number = floor ( $number / 10 ) ; }
}
$arraySize = count ( $numbers ) ; /*
Подбор множителя, с его помощью из словаря запрашиваются сотни/десятки.
Например, если размер ранее полученного массива с числами равен двум
и длина числа тоже равна двум, то множитель устанавливает значение 10.
В цикле, которой следует ниже, после итерации множитель уменьшается до 1.
*/
$mult = ( $arraySize > 1 ) ? ( ( $lengthOfNumber == 3 ) ? 100 : 10 ) : 1 ;
/* Берет по порядку значения из массива, делает запрос в словарь
и записывает полученное текстовое значение в массив $words */
for ( $i = 0 ; $i < $arraySize ; $i ++ ) {
if ( $numbers [ $i ] != 0 ) {
$words [ ] = $spelling [ $numbers [ $i ] * $mult ] ;
}
// Уменьшение множителя для следующей итерации
$mult = ( $lengthOfNumber == 3 and $arraySize == 2 ) ? 1 : $mult / 10 ;
}
} elseif ( $totalNumberLength < 1 ) {
$text = $spelling [ $number ] ;
} else {
$text = null ;
}
return $text ;
}
function numberToText( $number ) {
0 => array ( 0 => 'рубль' , 1 => 'рубля' , 2 => 'рублей' ) , 1 => array ( 0 => 'тысяча' , 1 => 'тысячи' , 2 => 'тысяч' ) , 2 => array ( 0 => 'миллион' , 1 => 'миллиона' , 2 => 'миллионов' ) ) ;
$divisibleNumber = $number ;
// Цикл выполняется N-е кол-во раз в зависимости от длины числа или один раз для обработки нуля
for ( $x = 0 ; $x < ceil ( $lengthOfNumber / 3 ) or
$x == 0 ; $x ++ ) {
// Делит число на массив по три единицы
$numbers [ ] = $divisibleNumber % 1000 ;
$divisibleNumber = floor ( $divisibleNumber / 1000 ) ;
// Берет от тысячного числа в массиве $numbers последнюю цифру и проверяет на женственный род
$isFemale = ( $x == 1 and $numbers [ 1 ] % 10 == 1 or $x == 1 and $numbers [ 1 ] % 10 == 2 ) ? 1 : 0 ;
$numberInText = smallNumberToText( $numbers [ $x ] , $isFemale , $lengthOfNumber ) ;
$inclinedWord = inclineWord( $numbers [ $x ] , $spelling [ $x ] [ 0 ] , $spelling [ $x ] [ 1 ] , $spelling [ $x ] [ 2 ] ) ;
// Формирование и запись результата
if ( $x == 0 ) {
if ( $numberInText ) {
$text = $numberInText ;
}
$text = $text . ' ' . "($number )" . ' ' . $inclinedWord ;
} else {
$text = "($number )" . ' ' . $inclinedWord ;
}
} else {
if ( $numberInText ) {
$text = $numberInText . ' ' . $inclinedWord . ' ' . $text ;
}
}
}
return $text ;
}
/* Вызовем функцию несколько раз */
$text1 = numberToText( $amount1 ) ;
echo "На вашем счету {$text1} \n " ;
$text2 = numberToText( $amount2 ) ;
echo "На вашем счету {$text2} \n " ;
$text3 = numberToText( $amount3 ) ;
echo "На вашем счету {$text3} \n " ;
$numbers = [ 999999999 , 0 , 1 , 11012013 , 7000008 , 1002 , 1000 , 7000000 ] ;
foreach ( $numbers as $number ) {
$amount4 = $number ;
$text4 = numberToText( $amount4 ) ;
echo "На вашем счету {$text4} \n " ;
}
PD9waHAKCmVycm9yX3JlcG9ydGluZygtMSk7CgovKiDQktC+0LfQstGA0LDRidCw0LXRgiDRgdC+0L7RgtCy0LXRgtGB0YLQstGD0Y7RidGD0Y4g0YfQuNGB0LvRgyDRhNC+0YDQvNGDINGB0LvQvtCy0LA6IDEg0YDRg9Cx0LvRjCwgMiDRgNGD0LHQu9GPLCA1INGA0YPQsdC70LXQuSAqLwpmdW5jdGlvbiBpbmNsaW5lV29yZCgkbnVtYmVyLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzKSB7CgogICAgaWYgKCRudW1iZXIgJSAxMDAgPiAxMCBhbmQgJG51bWJlciAlIDEwMCA8IDIwKSB7CiAgICAgICAgJG51bWJlciAlPSAxMDA7CiAgICB9IGVsc2VpZiAoJG51bWJlciA+IDApIHsKICAgICAgICAkbnVtYmVyICU9IDEwOwogICAgfQoKICAgIGlmICgkbnVtYmVyID09IDEpIHsKICAgICAgICAkd29yZCA9ICR3b3JkMTsKICAgIH0gZWxzZWlmICgkbnVtYmVyID49IDIgYW5kICRudW1iZXIgPD0gNCkgewogICAgICAgICR3b3JkID0gJHdvcmQyOwogICAgfSBlbHNlaWYgKCRudW1iZXIgPj0gNSBhbmQgJG51bWJlciA8PSA5IG9yICRudW1iZXIgPiAxMCBhbmQgJG51bWJlciA8IDIwIG9yICRudW1iZXIgPT0gMCkgewogICAgICAgICR3b3JkID0gJHdvcmQzOwogICAgfQoKICAgIHJldHVybiAkd29yZDsKfQoKLyogCiAgICDQn9GA0LXQvtCx0YDQsNC30YPQtdGCINGH0LjRgdC70LAg0L7RgiAwINC00L4gOTk5INCyINGC0LXQutGB0YIuINCf0LDRgNCw0LzQtdGC0YAgJGlzRmVtYWxlINGA0LDQstC10L0g0L3Rg9C70Y4sIAogICAg0LXRgdC70Lgg0LzRiyDRgdGH0LjRgtCw0LXQvCDRh9C40YHQu9C+INC00LvRjyDQvNGD0LbRgdC60L7Qs9C+INGA0L7QtNCwICjQvtC00LjQvSDRgNGD0LHQu9GMKSwgCiAgICDQuCAxIOKAlCDQtNC70Y8g0LbQtdC90YHQutC+0LPQviAo0L7QtNC90LAg0YLRi9GB0Y/Rh9CwKS4g0J/QsNGA0LDQvNC10YLRgCAkdG90YWxOdW1iZXJMZW5ndGggCiAgICDQv9C+0LzQvtCz0LDQtdGCINC+0L/RgNC10LTQtdC70LjRgtGMINGH0LjRgdC70L4g0L3QvtC70YwuCiovCmZ1bmN0aW9uIHNtYWxsTnVtYmVyVG9UZXh0KCRudW1iZXIsICRpc0ZlbWFsZSwgJHRvdGFsTnVtYmVyTGVuZ3RoKSB7CgogICAgJHNwZWxsaW5nID0gYXJyYXkoCiAgICAgICAgMCAgID0+ICAn0L3QvtC70YwnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCAgPT4gICfQtNC10YHRj9GC0YwnLCAgICAgICAxMDAgPT4gICfRgdGC0L4nLAogICAgICAgIDEgICA9PiAgJ9C+0LTQuNC9JywgICAgICAgICAxMSAgPT4gICfQvtC00LjQvdC90LDQtNGG0LDRgtGMJywgICAgICAyMCAgPT4gICfQtNCy0LDQtNGG0LDRgtGMJywgICAgIDIwMCA9PiAgJ9C00LLQtdGB0YLQuCcsCiAgICAgICAgMiAgID0+ICAn0LTQstCwJywgICAgICAgICAgMTIgID0+ICAn0LTQstC10L3QsNC00YbQsNGC0YwnLCAgICAgICAzMCAgPT4gICfRgtGA0LjQtNGG0LDRgtGMJywgICAgIDMwMCA9PiAgJ9GC0YDQuNGB0YLQsCcsCiAgICAgICAgMyAgID0+ICAn0YLRgNC4JywgICAgICAgICAgMTMgID0+ICAn0YLRgNC40L3QsNC00YbQsNGC0YwnLCAgICAgICA0MCAgPT4gICfRgdC+0YDQvtC6JywgICAgICAgIDQwMCA9PiAgJ9GH0LXRgtGL0YDQtdGB0YLQsCcsCiAgICAgICAgNCAgID0+ICAn0YfQtdGC0YvRgNC1JywgICAgICAgMTQgID0+ICAn0YfQtdGC0YvRgNC90LDQtNGG0LDRgtGMJywgICAgIDUwICA9PiAgJ9C/0Y/RgtGM0LTQtdGB0Y/RgicsICAgIDUwMCA9PiAgJ9C/0Y/RgtGM0YHQvtGCJywKICAgICAgICA1ICAgPT4gICfQv9GP0YLRjCcsICAgICAgICAgMTUgID0+ICAn0L/Rj9GC0L3QsNC00YbQsNGC0YwnLCAgICAgICA2MCAgPT4gICfRiNC10YHRgtGM0LTQtdGB0Y/RgicsICAgNjAwID0+ICAn0YjQtdGB0YLRjNGB0L7RgicsCiAgICAgICAgNiAgID0+ICAn0YjQtdGB0YLRjCcsICAgICAgICAxNiAgPT4gICfRiNC10YHRgtC90LDQtNGG0LDRgtGMJywgICAgICA3MCAgPT4gICfRgdC10LzRjNC00LXRgdGP0YInLCAgICA3MDAgPT4gICfRgdC10LzRjNGB0L7RgicsICAgIAogICAgICAgIDcgICA9PiAgJ9GB0LXQvNGMJywgICAgICAgICAxNyAgPT4gICfRgdC10LzQvdCw0LTRhtCw0YLRjCcsICAgICAgIDgwICA9PiAgJ9Cy0L7RgdC10LzRjNC00LXRgdGP0YInLCAgIDgwMCA9PiAgJ9Cy0L7RgdC10LzRjNGB0L7RgicsCiAgICAgICAgOCAgID0+ICAn0LLQvtGB0LXQvNGMJywgICAgICAgMTggID0+ICAn0LLQvtGB0LXQvNC90LDQtNGG0LDRgtGMJywgICAgIDkwICA9PiAgJ9C00LXQstGP0L3QvtGB0YLQvicsICAgICA5MDAgPT4gICfQtNC10LLRj9GC0YzRgdC+0YInLAogICAgICAgIDkgICA9PiAgJ9C00LXQstGP0YLRjCcsICAgICAgIDE5ICA9PiAgJ9C00LXQstGP0YLQvdCw0LTRhtCw0YLRjCcgICAgCiAgICApOwoKICAgIGlmICgkaXNGZW1hbGUpIHsKICAgICAgICAkZmVtYWxlU3BlbGxpbmcgPSBhcnJheSgKICAgICAgICAgICAgMSAgID0+ICAn0L7QtNC90LAnLCAgCiAgICAgICAgICAgIDIgICA9PiAgJ9C00LLQtScKICAgICAgICApOwogICAgICAgICRzcGVsbGluZyA9IGFycmF5X3JlcGxhY2UoJHNwZWxsaW5nLCAkZmVtYWxlU3BlbGxpbmcpOwogICAgfQogICAgCiAgICBpZiAoJG51bWJlciA+IDApIHsKCgkgICAgJGxlbmd0aE9mTnVtYmVyID0gZmxvb3IobG9nMTAoJG51bWJlcikgKyAxKTsKCSAgICAKCSAgICAvLyDQoNCw0LfQtNC10LvQtdC90LjQtSDRh9C40YHQu9CwINC90LAg0LXQtNC40L3QuNGH0L3Ri9C5INC80LDRgdGB0LjQsgoJICAgIGZvciAoJGkgPSAwOyAkaSA8ICRsZW5ndGhPZk51bWJlcjsgJGkrKykgewogICAgICAgICAgICAvLyDQntCx0YrQtdC00LjQvdC10L3QuNC1INGH0LjRgdC10Lsg0YEg0L7RgdC+0LHQvtC5INGE0L7RgNC80L7QuQoJICAgICAgICBpZiAoJGkgPT0gMCBhbmQgJG51bWJlciAlIDEwMCA+IDEwIGFuZCAkbnVtYmVyICUgMTAwIDwgMjApIHsKCSAgICAgICAgICAgICRudW1iZXJzW10gPSAoJG51bWJlciAlIDEwMCk7CgkgICAgICAgICAgICAkbnVtYmVyID0gZmxvb3IoJG51bWJlciAvIDEwMCk7CgkgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAkbnVtYmVyc1tdID0gKCRudW1iZXIgJSAxMCk7CgkgICAgICAgICAgICAkbnVtYmVyID0gZmxvb3IoJG51bWJlciAvIDEwKTsKCSAgICAgICAgfQoJICAgIH0KCSAgICAKCSAgICAkbnVtYmVycyA9IGFycmF5X3JldmVyc2UoJG51bWJlcnMpOwoJICAgICRhcnJheVNpemUgPSBjb3VudCgkbnVtYmVycyk7CiAgICAgICAgLyoKICAgICAgICDQn9C+0LTQsdC+0YAg0LzQvdC+0LbQuNGC0LXQu9GPLCDRgSDQtdCz0L4g0L/QvtC80L7RidGM0Y4g0LjQtyDRgdC70L7QstCw0YDRjyDQt9Cw0L/RgNCw0YjQuNCy0LDRjtGC0YHRjyDRgdC+0YLQvdC4L9C00LXRgdGP0YLQutC4LgoKICAgICAgICDQndCw0L/RgNC40LzQtdGALCDQtdGB0LvQuCDRgNCw0LfQvNC10YAg0YDQsNC90LXQtSDQv9C+0LvRg9GH0LXQvdC90L7Qs9C+INC80LDRgdGB0LjQstCwINGBINGH0LjRgdC70LDQvNC4INGA0LDQstC10L0g0LTQstGD0LwgCiAgICAgICAg0Lgg0LTQu9C40L3QsCDRh9C40YHQu9CwINGC0L7QttC1INGA0LDQstC90LAg0LTQstGD0LwsINGC0L4g0LzQvdC+0LbQuNGC0LXQu9GMINGD0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdGCINC30L3QsNGH0LXQvdC40LUgMTAuCiAgICAgICAg0JIg0YbQuNC60LvQtSwg0LrQvtGC0L7RgNC+0Lkg0YHQu9C10LTRg9C10YIg0L3QuNC20LUsINC/0L7RgdC70LUg0LjRgtC10YDQsNGG0LjQuCDQvNC90L7QttC40YLQtdC70Ywg0YPQvNC10L3RjNGI0LDQtdGC0YHRjyDQtNC+IDEuCiAgICAgICAgKi8KCSAgICAkbXVsdCA9ICgkYXJyYXlTaXplID4gMSkgPyAoKCRsZW5ndGhPZk51bWJlciA9PSAzKSA/IDEwMCA6IDEwKSA6IDE7CgogICAgICAgIC8qINCR0LXRgNC10YIg0L/QviDQv9C+0YDRj9C00LrRgyDQt9C90LDRh9C10L3QuNGPINC40Lcg0LzQsNGB0YHQuNCy0LAsINC00LXQu9Cw0LXRgiDQt9Cw0L/RgNC+0YEg0LIg0YHQu9C+0LLQsNGA0YwgCiAgICAgICAg0Lgg0LfQsNC/0LjRgdGL0LLQsNC10YIg0L/QvtC70YPRh9C10L3QvdC+0LUg0YLQtdC60YHRgtC+0LLQvtC1INC30L3QsNGH0LXQvdC40LUg0LIg0LzQsNGB0YHQuNCyICR3b3JkcyAqLwoJICAgIGZvciAoJGkgPSAwOyAkaSA8ICRhcnJheVNpemU7ICRpKyspIHsKCSAgICAgICAgaWYgKCRudW1iZXJzWyRpXSAhPSAwKSB7CgkgICAgICAgICAgICAkd29yZHNbXSA9ICRzcGVsbGluZ1skbnVtYmVyc1skaV0gKiAkbXVsdF07CgkgICAgICAgIH0KICAgICAgICAgICAgLy8g0KPQvNC10L3RjNGI0LXQvdC40LUg0LzQvdC+0LbQuNGC0LXQu9GPINC00LvRjyDRgdC70LXQtNGD0Y7RidC10Lkg0LjRgtC10YDQsNGG0LjQuAoJICAgICAgICAkbXVsdCA9ICgkbGVuZ3RoT2ZOdW1iZXIgPT0gMyBhbmQgJGFycmF5U2l6ZSA9PSAyKSA/IDEgOiAkbXVsdCAvIDEwOwoJICAgIH0KCQoJICAgICR0ZXh0ID0gaW1wbG9kZSgnICcsICR3b3Jkcyk7CgogICAgfSBlbHNlaWYgKCR0b3RhbE51bWJlckxlbmd0aCA8IDEpIHsKICAgICAgICAkdGV4dCA9ICRzcGVsbGluZ1skbnVtYmVyXTsKICAgIH0gZWxzZSB7CiAgICAgICAgJHRleHQgPSBudWxsOwogICAgfQoKICAgIHJldHVybiAkdGV4dDsKfQoKZnVuY3Rpb24gbnVtYmVyVG9UZXh0KCRudW1iZXIpIHsKCiAgICAkc3BlbGxpbmcgPSBhcnJheSgKICAgICAgICAwID0+IGFycmF5KDAgPT4gJ9GA0YPQsdC70YwnLCAxID0+ICfRgNGD0LHQu9GPJywgMiA9PiAn0YDRg9Cx0LvQtdC5JyksCiAgICAgICAgMSA9PiBhcnJheSgwID0+ICfRgtGL0YHRj9GH0LAnLCAxID0+ICfRgtGL0YHRj9GH0LgnLCAyID0+ICfRgtGL0YHRj9GHJyksCiAgICAgICAgMiA9PiBhcnJheSgwID0+ICfQvNC40LvQu9C40L7QvScsIDEgPT4gJ9C80LjQu9C70LjQvtC90LAnLCAyID0+ICfQvNC40LvQu9C40L7QvdC+0LInKQogICAgKTsKICAgIAogICAgJGxlbmd0aE9mTnVtYmVyID0gZmxvb3IobG9nMTAoJG51bWJlcikgKyAxKTsKCiAgICAkZGl2aXNpYmxlTnVtYmVyID0gJG51bWJlcjsKICAgIC8vINCm0LjQutC7INCy0YvQv9C+0LvQvdGP0LXRgtGB0Y8gTi3QtSDQutC+0Lst0LLQviDRgNCw0Lcg0LIg0LfQsNCy0LjRgdC40LzQvtGB0YLQuCDQvtGCINC00LvQuNC90Ysg0YfQuNGB0LvQsCDQuNC70Lgg0L7QtNC40L0g0YDQsNC3INC00LvRjyDQvtCx0YDQsNCx0L7RgtC60Lgg0L3Rg9C70Y8KICAgIGZvciAoJHggPSAwOyAkeCA8IGNlaWwoJGxlbmd0aE9mTnVtYmVyIC8gMykgb3IgJHggPT0gMDsgJHgrKykgewoKICAgICAgICAvLyDQlNC10LvQuNGCINGH0LjRgdC70L4g0L3QsCDQvNCw0YHRgdC40LIg0L/QviDRgtGA0Lgg0LXQtNC40L3QuNGG0YsKICAgICAgICAkbnVtYmVyc1tdID0gJGRpdmlzaWJsZU51bWJlciAlIDEwMDA7CiAgICAgICAgJGRpdmlzaWJsZU51bWJlciA9IGZsb29yKCRkaXZpc2libGVOdW1iZXIgLyAxMDAwKTsKCiAgICAgICAgLy8g0JHQtdGA0LXRgiDQvtGCINGC0YvRgdGP0YfQvdC+0LPQviDRh9C40YHQu9CwINCyINC80LDRgdGB0LjQstC1ICRudW1iZXJzINC/0L7RgdC70LXQtNC90Y7RjiDRhtC40YTRgNGDINC4INC/0YDQvtCy0LXRgNGP0LXRgiDQvdCwINC20LXQvdGB0YLQstC10L3QvdGL0Lkg0YDQvtC0CiAgICAgICAgJGlzRmVtYWxlID0gKCR4ID09IDEgYW5kICRudW1iZXJzWzFdICUgMTAgPT0gMSBvciAkeCA9PSAxIGFuZCAkbnVtYmVyc1sxXSAlIDEwID09IDIpID8gMSA6IDA7CgogICAgICAgICRudW1iZXJJblRleHQgPSBzbWFsbE51bWJlclRvVGV4dCgkbnVtYmVyc1skeF0sICRpc0ZlbWFsZSwgJGxlbmd0aE9mTnVtYmVyKTsKICAgICAgICAkaW5jbGluZWRXb3JkID0gaW5jbGluZVdvcmQoJG51bWJlcnNbJHhdLCAkc3BlbGxpbmdbJHhdWzBdLCAkc3BlbGxpbmdbJHhdWzFdLCAkc3BlbGxpbmdbJHhdWzJdKTsKCiAgICAgICAgLy8g0KTQvtGA0LzQuNGA0L7QstCw0L3QuNC1INC4INC30LDQv9C40YHRjCDRgNC10LfRg9C70YzRgtCw0YLQsAogICAgICAgIGlmICgkeCA9PSAwKSB7CiAgICAgICAgICAgIGlmICgkbnVtYmVySW5UZXh0KSB7CiAgICAgICAgICAgICAgICAkdGV4dCA9ICRudW1iZXJJblRleHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGlzc2V0KCR0ZXh0KSkgewogICAgICAgICAgICAgICAgJHRleHQgPSAkdGV4dC4nICcuIigkbnVtYmVyKSIuJyAnLiRpbmNsaW5lZFdvcmQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkdGV4dCA9ICIoJG51bWJlcikiLicgJy4kaW5jbGluZWRXb3JkOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCRudW1iZXJJblRleHQpIHsKICAgICAgICAgICAgICAgICR0ZXh0ID0gJG51bWJlckluVGV4dC4nICcuJGluY2xpbmVkV29yZC4nICcuJHRleHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICR0ZXh0Owp9CgovKiDQktGL0LfQvtCy0LXQvCDRhNGD0L3QutGG0LjRjiDQvdC10YHQutC+0LvRjNC60L4g0YDQsNC3ICovCgokYW1vdW50MSA9IG10X3JhbmQoMSw5OTk5OTk5OSk7CiR0ZXh0MSA9IG51bWJlclRvVGV4dCgkYW1vdW50MSk7CiAKZWNobyAi0J3QsCDQstCw0YjQtdC8INGB0YfQtdGC0YMgeyR0ZXh0MX1cbiI7CiAKJGFtb3VudDIgPSBtdF9yYW5kKDEsOTk5OTk5OTkpOwokdGV4dDIgPSBudW1iZXJUb1RleHQoJGFtb3VudDIpOwogCmVjaG8gItCd0LAg0LLQsNGI0LXQvCDRgdGH0LXRgtGDIHskdGV4dDJ9XG4iOwogCiRhbW91bnQzID0gbXRfcmFuZCgxLDk5OTk5OTk5KTsKJHRleHQzID0gbnVtYmVyVG9UZXh0KCRhbW91bnQzKTsKIAplY2hvICLQndCwINCy0LDRiNC10Lwg0YHRh9C10YLRgyB7JHRleHQzfVxuIjsKCiRudW1iZXJzID0gWzk5OTk5OTk5OSwgMCwgMSwgMTEwMTIwMTMsIDcwMDAwMDgsIDEwMDIsIDEwMDAsIDcwMDAwMDBdOwpmb3JlYWNoICgkbnVtYmVycyBhcyAkbnVtYmVyKSB7CiAgICAkYW1vdW50NCA9ICRudW1iZXI7CiAgICAkdGV4dDQgPSBudW1iZXJUb1RleHQoJGFtb3VudDQpOwogICAgIAogICAgZWNobyAi0J3QsCDQstCw0YjQtdC8INGB0YfQtdGC0YMgeyR0ZXh0NH1cbiI7Cn0=