using System;
class Program
{
static void Main(string[] args)
{
string[] data = new string[] {
"a",
"1",
"0",
"01",
"-5",
"1.2",
"1.2.3",
"12-3",
"1a",
"+1",
"-0.123",
"1.2e2",
"1.2E2",
"1.2e",
"1.2e+3",
"1.2e-3",
"1.2e-3.5",
".5",
".5e2",
"5.e2",
};
Checker ic = new IntChecker();
Checker fc = new FloatChecker();
foreach (string str in data)
{
ic.Reset();
fc.Reset();
Console.Write(str + " : ");
foreach (char ch in str)
{
if (ic.IsError() && fc.IsError())
{
break;
}
if (!ic.IsError())
{
ic.Next(ch);
}
if (!fc.IsError())
{
fc.Next(ch);
}
}
if (ic.IsAcceptable())
{
Console.WriteLine("int({0})", int.Parse(str));
}
else if (fc.IsAcceptable())
{
Console.WriteLine("double({0})", double.Parse(str));
}
else
{
Console.WriteLine("string({0})", str);
}
}
Console.WriteLine("int.Parse(\"01\") -> {0}", int.Parse("01"));
Console.WriteLine("double.Parse(\"01\") -> {0}", double.Parse("01"));
}
}
interface Checker
{
void Reset();
void Next(char ch);
bool IsAcceptable();
bool IsError();
}
class IntChecker : Checker
{
enum IntParsingState
{
State0,
State1,
State2,
State3,
}
IntParsingState _state;
public IntChecker()
{
Reset();
}
public void Reset()
{
_state = IntParsingState.State0;
}
public void Next(char ch)
{
switch (_state)
{
case IntParsingState.State0:
if (ch == '-' ||
ch == '+')
{
_state = IntParsingState.State1;
}
else if (ch == '1' ||
ch == '2' ||
ch == '3' ||
ch == '4' ||
ch == '5' ||
ch == '6' ||
ch == '7' ||
ch == '8' ||
ch == '9')
{
_state = IntParsingState.State2;
}
else
{
_state = IntParsingState.State3;
}
break;
case IntParsingState.State1:
if (ch == '1' ||
ch == '2' ||
ch == '3' ||
ch == '4' ||
ch == '5' ||
ch == '6' ||
ch == '7' ||
ch == '8' ||
ch == '9')
{
_state = IntParsingState.State2;
}
else
{
_state = IntParsingState.State3;
}
break;
case IntParsingState.State2:
if (ch == '0' ||
ch == '1' ||
ch == '2' ||
ch == '3' ||
ch == '4' ||
ch == '5' ||
ch == '6' ||
ch == '7' ||
ch == '8' ||
ch == '9')
{
_state = IntParsingState.State2;
}
else
{
_state = IntParsingState.State3;
}
break;
case IntParsingState.State3:
_state = IntParsingState.State3;
break;
}
}
public bool IsAcceptable()
{
return _state == IntParsingState.State2;
}
public bool IsError()
{
return _state == IntParsingState.State3;
}
}
class FloatChecker : Checker
{
enum FloatParsingState
{
Error,
State00,
State01,
State02,
State03,
State04,
State05,
State06,
State07,
State08,
State09,
State10,
State11,
}
FloatParsingState _state;
public FloatChecker()
{
Reset();
}
public void Reset()
{
_state = FloatParsingState.State00;
}
void Transition(char ch, FloatParsingState whenX, FloatParsingState whenY, FloatParsingState whenZ, FloatParsingState whenDot)
{
if (ch == '-' || ch == '+')
{
_state = whenX;
}
else if (char.IsDigit(ch))
{
_state = whenY;
}
else if (ch == 'e' || ch == 'E')
{
_state = whenZ;
}
else if (ch == '.')
{
_state = whenDot;
}
else
{
_state = FloatParsingState.Error;
}
}
public void Next(char ch)
{
switch (_state)
{
case FloatParsingState.State00:
Transition(
ch,
FloatParsingState.State01,
FloatParsingState.State02,
FloatParsingState.Error,
FloatParsingState.State03);
break;
case FloatParsingState.State01:
Transition(
ch,
FloatParsingState.Error,
FloatParsingState.State02,
FloatParsingState.Error,
FloatParsingState.State03);
break;
case FloatParsingState.State02:
Transition(
ch,
FloatParsingState.Error,
FloatParsingState.State02,
FloatParsingState.State04,
FloatParsingState.State05);
break;
case FloatParsingState.State03:
Transition(
ch,
FloatParsingState.Error,
FloatParsingState.State06,
FloatParsingState.Error,
FloatParsingState.Error);
break;
case FloatParsingState.State04:
Transition(
ch,
FloatParsingState.State07,
FloatParsingState.State08,
FloatParsingState.State08,
FloatParsingState.Error);
break;
case FloatParsingState.State05:
Transition(
ch,
FloatParsingState.Error,
FloatParsingState.State09,
FloatParsingState.State04,
FloatParsingState.Error);
break;
case FloatParsingState.State06:
Transition(
ch,
FloatParsingState.Error,
FloatParsingState.State10,
FloatParsingState.State04,
FloatParsingState.Error);
break;
case FloatParsingState.State07:
Transition(
ch,
FloatParsingState.Error,
FloatParsingState.State08,
FloatParsingState.Error,
FloatParsingState.Error);
break;
case FloatParsingState.State08:
Transition(
ch,
FloatParsingState.Error,
FloatParsingState.State11,
FloatParsingState.Error,
FloatParsingState.Error);
break;
case FloatParsingState.State09:
Transition(
ch,
FloatParsingState.Error,
FloatParsingState.State09,
FloatParsingState.State04,
FloatParsingState.Error);
break;
case FloatParsingState.State10:
Transition(
ch,
FloatParsingState.Error,
FloatParsingState.State10,
FloatParsingState.State04,
FloatParsingState.Error);
break;
case FloatParsingState.State11:
Transition(
ch,
FloatParsingState.Error,
FloatParsingState.State11,
FloatParsingState.Error,
FloatParsingState.Error);
break;
}
}
public bool IsAcceptable()
{
return
_state == FloatParsingState.State02 ||
_state == FloatParsingState.State05 ||
_state == FloatParsingState.State06 ||
_state == FloatParsingState.State08 ||
_state == FloatParsingState.State09 ||
_state == FloatParsingState.State10 ||
_state == FloatParsingState.State11;
}
public bool IsError()
{
return _state == FloatParsingState.Error;
}
}
dXNpbmcgU3lzdGVtOwpjbGFzcyBQcm9ncmFtCnsKICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCiAgewogICAgc3RyaW5nW10gZGF0YSA9IG5ldyBzdHJpbmdbXSB7CiAgICAgICJhIiwKICAgICAgIjEiLAogICAgICAiMCIsCiAgICAgICIwMSIsCiAgICAgICItNSIsCiAgICAgICIxLjIiLAogICAgICAiMS4yLjMiLAogICAgICAiMTItMyIsCiAgICAgICIxYSIsCiAgICAgICIrMSIsCiAgICAgICItMC4xMjMiLAogICAgICAiMS4yZTIiLAogICAgICAiMS4yRTIiLAogICAgICAiMS4yZSIsCiAgICAgICIxLjJlKzMiLAogICAgICAiMS4yZS0zIiwKICAgICAgIjEuMmUtMy41IiwKICAgICAgIi41IiwKICAgICAgIi41ZTIiLAogICAgICAiNS5lMiIsCiAgICB9OwogICAgCiAgICBDaGVja2VyIGljID0gbmV3IEludENoZWNrZXIoKTsKICAgIENoZWNrZXIgZmMgPSBuZXcgRmxvYXRDaGVja2VyKCk7CiAgICBmb3JlYWNoIChzdHJpbmcgc3RyIGluIGRhdGEpCiAgICB7CiAgICAgIGljLlJlc2V0KCk7CiAgICAgIGZjLlJlc2V0KCk7CiAgICAgIENvbnNvbGUuV3JpdGUoc3RyICsgIiA6ICIpOwogICAgICBmb3JlYWNoIChjaGFyIGNoIGluIHN0cikKICAgICAgewogICAgICAgIGlmIChpYy5Jc0Vycm9yKCkgJiYgZmMuSXNFcnJvcigpKQogICAgICAgIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFpYy5Jc0Vycm9yKCkpCiAgICAgICAgewogICAgICAgICAgaWMuTmV4dChjaCk7CiAgICAgICAgfQogICAgICAgIGlmICghZmMuSXNFcnJvcigpKQogICAgICAgIHsKICAgICAgICAgIGZjLk5leHQoY2gpOwogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgaWYgKGljLklzQWNjZXB0YWJsZSgpKQogICAgICB7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImludCh7MH0pIiwgaW50LlBhcnNlKHN0cikpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGZjLklzQWNjZXB0YWJsZSgpKQogICAgICB7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImRvdWJsZSh7MH0pIiwgZG91YmxlLlBhcnNlKHN0cikpOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJzdHJpbmcoezB9KSIsIHN0cik7CiAgICAgIH0KICAgIH0KICAgIENvbnNvbGUuV3JpdGVMaW5lKCJpbnQuUGFyc2UoXCIwMVwiKSAtPiB7MH0iLCBpbnQuUGFyc2UoIjAxIikpOwogICAgQ29uc29sZS5Xcml0ZUxpbmUoImRvdWJsZS5QYXJzZShcIjAxXCIpIC0+IHswfSIsIGRvdWJsZS5QYXJzZSgiMDEiKSk7CiAgfQp9CgppbnRlcmZhY2UgQ2hlY2tlcgp7CiAgdm9pZCBSZXNldCgpOwogIHZvaWQgTmV4dChjaGFyIGNoKTsKICBib29sIElzQWNjZXB0YWJsZSgpOwogIGJvb2wgSXNFcnJvcigpOwp9CgpjbGFzcyBJbnRDaGVja2VyIDogQ2hlY2tlcgp7CiAgZW51bSBJbnRQYXJzaW5nU3RhdGUKICB7CiAgICBTdGF0ZTAsCiAgICBTdGF0ZTEsCiAgICBTdGF0ZTIsCiAgICBTdGF0ZTMsCiAgfQoKICBJbnRQYXJzaW5nU3RhdGUgX3N0YXRlOwoKICBwdWJsaWMgSW50Q2hlY2tlcigpCiAgewogICAgUmVzZXQoKTsKICB9CgogIHB1YmxpYyB2b2lkIFJlc2V0KCkKICB7CiAgICBfc3RhdGUgPSBJbnRQYXJzaW5nU3RhdGUuU3RhdGUwOwogIH0KCiAgcHVibGljIHZvaWQgTmV4dChjaGFyIGNoKQogIHsKICAgIHN3aXRjaCAoX3N0YXRlKQogICAgewogICAgICBjYXNlIEludFBhcnNpbmdTdGF0ZS5TdGF0ZTA6CiAgICAgICAgaWYgKGNoID09ICctJyB8fAogICAgICAgICAgY2ggPT0gJysnKQogICAgICAgIHsKICAgICAgICAgIF9zdGF0ZSA9IEludFBhcnNpbmdTdGF0ZS5TdGF0ZTE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGNoID09ICcxJyB8fAogICAgICAgICAgY2ggPT0gJzInIHx8CiAgICAgICAgICBjaCA9PSAnMycgfHwKICAgICAgICAgIGNoID09ICc0JyB8fAogICAgICAgICAgY2ggPT0gJzUnIHx8CiAgICAgICAgICBjaCA9PSAnNicgfHwKICAgICAgICAgIGNoID09ICc3JyB8fAogICAgICAgICAgY2ggPT0gJzgnIHx8CiAgICAgICAgICBjaCA9PSAnOScpCiAgICAgICAgewogICAgICAgICAgX3N0YXRlID0gSW50UGFyc2luZ1N0YXRlLlN0YXRlMjsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIF9zdGF0ZSA9IEludFBhcnNpbmdTdGF0ZS5TdGF0ZTM7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEludFBhcnNpbmdTdGF0ZS5TdGF0ZTE6CiAgICAgICAgaWYgKGNoID09ICcxJyB8fAogICAgICAgICAgY2ggPT0gJzInIHx8CiAgICAgICAgICBjaCA9PSAnMycgfHwKICAgICAgICAgIGNoID09ICc0JyB8fAogICAgICAgICAgY2ggPT0gJzUnIHx8CiAgICAgICAgICBjaCA9PSAnNicgfHwKICAgICAgICAgIGNoID09ICc3JyB8fAogICAgICAgICAgY2ggPT0gJzgnIHx8CiAgICAgICAgICBjaCA9PSAnOScpCiAgICAgICAgewogICAgICAgICAgX3N0YXRlID0gSW50UGFyc2luZ1N0YXRlLlN0YXRlMjsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIF9zdGF0ZSA9IEludFBhcnNpbmdTdGF0ZS5TdGF0ZTM7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEludFBhcnNpbmdTdGF0ZS5TdGF0ZTI6CiAgICAgICAgaWYgKGNoID09ICcwJyB8fAogICAgICAgICAgY2ggPT0gJzEnIHx8CiAgICAgICAgICBjaCA9PSAnMicgfHwKICAgICAgICAgIGNoID09ICczJyB8fAogICAgICAgICAgY2ggPT0gJzQnIHx8CiAgICAgICAgICBjaCA9PSAnNScgfHwKICAgICAgICAgIGNoID09ICc2JyB8fAogICAgICAgICAgY2ggPT0gJzcnIHx8CiAgICAgICAgICBjaCA9PSAnOCcgfHwKICAgICAgICAgIGNoID09ICc5JykKICAgICAgICB7CiAgICAgICAgICBfc3RhdGUgPSBJbnRQYXJzaW5nU3RhdGUuU3RhdGUyOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgX3N0YXRlID0gSW50UGFyc2luZ1N0YXRlLlN0YXRlMzsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgSW50UGFyc2luZ1N0YXRlLlN0YXRlMzoKICAgICAgICBfc3RhdGUgPSBJbnRQYXJzaW5nU3RhdGUuU3RhdGUzOwogICAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgcHVibGljIGJvb2wgSXNBY2NlcHRhYmxlKCkKICB7CiAgICByZXR1cm4gX3N0YXRlID09IEludFBhcnNpbmdTdGF0ZS5TdGF0ZTI7CiAgfQoKICBwdWJsaWMgYm9vbCBJc0Vycm9yKCkKICB7CiAgICByZXR1cm4gX3N0YXRlID09IEludFBhcnNpbmdTdGF0ZS5TdGF0ZTM7CiAgfQp9CgpjbGFzcyBGbG9hdENoZWNrZXIgOiBDaGVja2VyCnsKICBlbnVtIEZsb2F0UGFyc2luZ1N0YXRlCiAgewogICAgRXJyb3IsCiAgICBTdGF0ZTAwLAogICAgU3RhdGUwMSwKICAgIFN0YXRlMDIsCiAgICBTdGF0ZTAzLAogICAgU3RhdGUwNCwKICAgIFN0YXRlMDUsCiAgICBTdGF0ZTA2LAogICAgU3RhdGUwNywKICAgIFN0YXRlMDgsCiAgICBTdGF0ZTA5LAogICAgU3RhdGUxMCwKICAgIFN0YXRlMTEsCiAgfQoKICBGbG9hdFBhcnNpbmdTdGF0ZSBfc3RhdGU7CgogIHB1YmxpYyBGbG9hdENoZWNrZXIoKQogIHsKICAgIFJlc2V0KCk7CiAgfQoKICBwdWJsaWMgdm9pZCBSZXNldCgpCiAgewogICAgX3N0YXRlID0gRmxvYXRQYXJzaW5nU3RhdGUuU3RhdGUwMDsKICB9CgogIHZvaWQgVHJhbnNpdGlvbihjaGFyIGNoLCBGbG9hdFBhcnNpbmdTdGF0ZSB3aGVuWCwgRmxvYXRQYXJzaW5nU3RhdGUgd2hlblksIEZsb2F0UGFyc2luZ1N0YXRlIHdoZW5aLCBGbG9hdFBhcnNpbmdTdGF0ZSB3aGVuRG90KQogIHsKICAgIGlmIChjaCA9PSAnLScgfHwgY2ggPT0gJysnKQogICAgewogICAgICBfc3RhdGUgPSB3aGVuWDsKICAgIH0KICAgIGVsc2UgaWYgKGNoYXIuSXNEaWdpdChjaCkpCiAgICB7CiAgICAgIF9zdGF0ZSA9IHdoZW5ZOwogICAgfQogICAgZWxzZSBpZiAoY2ggPT0gJ2UnIHx8IGNoID09ICdFJykKICAgIHsKICAgICAgX3N0YXRlID0gd2hlblo7CiAgICB9CiAgICBlbHNlIGlmIChjaCA9PSAnLicpCiAgICB7CiAgICAgIF9zdGF0ZSA9IHdoZW5Eb3Q7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIF9zdGF0ZSA9IEZsb2F0UGFyc2luZ1N0YXRlLkVycm9yOwogICAgfQogIH0KCiAgcHVibGljIHZvaWQgTmV4dChjaGFyIGNoKQogIHsKICAgIHN3aXRjaCAoX3N0YXRlKQogICAgewogICAgICBjYXNlIEZsb2F0UGFyc2luZ1N0YXRlLlN0YXRlMDA6CiAgICAgICAgVHJhbnNpdGlvbigKICAgICAgICAgIGNoLAogICAgICAgICAgRmxvYXRQYXJzaW5nU3RhdGUuU3RhdGUwMSwKICAgICAgICAgIEZsb2F0UGFyc2luZ1N0YXRlLlN0YXRlMDIsCiAgICAgICAgICBGbG9hdFBhcnNpbmdTdGF0ZS5FcnJvciwKICAgICAgICAgIEZsb2F0UGFyc2luZ1N0YXRlLlN0YXRlMDMpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEZsb2F0UGFyc2luZ1N0YXRlLlN0YXRlMDE6CiAgICAgICAgVHJhbnNpdGlvbigKICAgICAgICAgIGNoLAogICAgICAgICAgRmxvYXRQYXJzaW5nU3RhdGUuRXJyb3IsCiAgICAgICAgICBGbG9hdFBhcnNpbmdTdGF0ZS5TdGF0ZTAyLAogICAgICAgICAgRmxvYXRQYXJzaW5nU3RhdGUuRXJyb3IsCiAgICAgICAgICBGbG9hdFBhcnNpbmdTdGF0ZS5TdGF0ZTAzKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBGbG9hdFBhcnNpbmdTdGF0ZS5TdGF0ZTAyOgogICAgICAgIFRyYW5zaXRpb24oCiAgICAgICAgICBjaCwKICAgICAgICAgIEZsb2F0UGFyc2luZ1N0YXRlLkVycm9yLAogICAgICAgICAgRmxvYXRQYXJzaW5nU3RhdGUuU3RhdGUwMiwKICAgICAgICAgIEZsb2F0UGFyc2luZ1N0YXRlLlN0YXRlMDQsCiAgICAgICAgICBGbG9hdFBhcnNpbmdTdGF0ZS5TdGF0ZTA1KTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBGbG9hdFBhcnNpbmdTdGF0ZS5TdGF0ZTAzOgogICAgICAgIFRyYW5zaXRpb24oCiAgICAgICAgICBjaCwKICAgICAgICAgIEZsb2F0UGFyc2luZ1N0YXRlLkVycm9yLAogICAgICAgICAgRmxvYXRQYXJzaW5nU3RhdGUuU3RhdGUwNiwKICAgICAgICAgIEZsb2F0UGFyc2luZ1N0YXRlLkVycm9yLAogICAgICAgICAgRmxvYXRQYXJzaW5nU3RhdGUuRXJyb3IpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEZsb2F0UGFyc2luZ1N0YXRlLlN0YXRlMDQ6CiAgICAgICAgVHJhbnNpdGlvbigKICAgICAgICAgIGNoLAogICAgICAgICAgRmxvYXRQYXJzaW5nU3RhdGUuU3RhdGUwNywKICAgICAgICAgIEZsb2F0UGFyc2luZ1N0YXRlLlN0YXRlMDgsCiAgICAgICAgICBGbG9hdFBhcnNpbmdTdGF0ZS5TdGF0ZTA4LAogICAgICAgICAgRmxvYXRQYXJzaW5nU3RhdGUuRXJyb3IpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEZsb2F0UGFyc2luZ1N0YXRlLlN0YXRlMDU6CiAgICAgICAgVHJhbnNpdGlvbigKICAgICAgICAgIGNoLAogICAgICAgICAgRmxvYXRQYXJzaW5nU3RhdGUuRXJyb3IsCiAgICAgICAgICBGbG9hdFBhcnNpbmdTdGF0ZS5TdGF0ZTA5LAogICAgICAgICAgRmxvYXRQYXJzaW5nU3RhdGUuU3RhdGUwNCwKICAgICAgICAgIEZsb2F0UGFyc2luZ1N0YXRlLkVycm9yKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBGbG9hdFBhcnNpbmdTdGF0ZS5TdGF0ZTA2OgogICAgICAgIFRyYW5zaXRpb24oCiAgICAgICAgICBjaCwKICAgICAgICAgIEZsb2F0UGFyc2luZ1N0YXRlLkVycm9yLAogICAgICAgICAgRmxvYXRQYXJzaW5nU3RhdGUuU3RhdGUxMCwKICAgICAgICAgIEZsb2F0UGFyc2luZ1N0YXRlLlN0YXRlMDQsCiAgICAgICAgICBGbG9hdFBhcnNpbmdTdGF0ZS5FcnJvcik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgRmxvYXRQYXJzaW5nU3RhdGUuU3RhdGUwNzoKICAgICAgICBUcmFuc2l0aW9uKAogICAgICAgICAgY2gsCiAgICAgICAgICBGbG9hdFBhcnNpbmdTdGF0ZS5FcnJvciwKICAgICAgICAgIEZsb2F0UGFyc2luZ1N0YXRlLlN0YXRlMDgsCiAgICAgICAgICBGbG9hdFBhcnNpbmdTdGF0ZS5FcnJvciwKICAgICAgICAgIEZsb2F0UGFyc2luZ1N0YXRlLkVycm9yKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBGbG9hdFBhcnNpbmdTdGF0ZS5TdGF0ZTA4OgogICAgICAgIFRyYW5zaXRpb24oCiAgICAgICAgICBjaCwKICAgICAgICAgIEZsb2F0UGFyc2luZ1N0YXRlLkVycm9yLAogICAgICAgICAgRmxvYXRQYXJzaW5nU3RhdGUuU3RhdGUxMSwKICAgICAgICAgIEZsb2F0UGFyc2luZ1N0YXRlLkVycm9yLAogICAgICAgICAgRmxvYXRQYXJzaW5nU3RhdGUuRXJyb3IpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEZsb2F0UGFyc2luZ1N0YXRlLlN0YXRlMDk6CiAgICAgICAgVHJhbnNpdGlvbigKICAgICAgICAgIGNoLAogICAgICAgICAgRmxvYXRQYXJzaW5nU3RhdGUuRXJyb3IsCiAgICAgICAgICBGbG9hdFBhcnNpbmdTdGF0ZS5TdGF0ZTA5LAogICAgICAgICAgRmxvYXRQYXJzaW5nU3RhdGUuU3RhdGUwNCwKICAgICAgICAgIEZsb2F0UGFyc2luZ1N0YXRlLkVycm9yKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBGbG9hdFBhcnNpbmdTdGF0ZS5TdGF0ZTEwOgogICAgICAgIFRyYW5zaXRpb24oCiAgICAgICAgICBjaCwKICAgICAgICAgIEZsb2F0UGFyc2luZ1N0YXRlLkVycm9yLAogICAgICAgICAgRmxvYXRQYXJzaW5nU3RhdGUuU3RhdGUxMCwKICAgICAgICAgIEZsb2F0UGFyc2luZ1N0YXRlLlN0YXRlMDQsCiAgICAgICAgICBGbG9hdFBhcnNpbmdTdGF0ZS5FcnJvcik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgRmxvYXRQYXJzaW5nU3RhdGUuU3RhdGUxMToKICAgICAgICBUcmFuc2l0aW9uKAogICAgICAgICAgY2gsCiAgICAgICAgICBGbG9hdFBhcnNpbmdTdGF0ZS5FcnJvciwKICAgICAgICAgIEZsb2F0UGFyc2luZ1N0YXRlLlN0YXRlMTEsCiAgICAgICAgICBGbG9hdFBhcnNpbmdTdGF0ZS5FcnJvciwKICAgICAgICAgIEZsb2F0UGFyc2luZ1N0YXRlLkVycm9yKTsKICAgICAgICBicmVhazsKICAgIH0KICB9CgogIHB1YmxpYyBib29sIElzQWNjZXB0YWJsZSgpCiAgewogICAgcmV0dXJuCiAgICAgIF9zdGF0ZSA9PSBGbG9hdFBhcnNpbmdTdGF0ZS5TdGF0ZTAyIHx8CiAgICAgIF9zdGF0ZSA9PSBGbG9hdFBhcnNpbmdTdGF0ZS5TdGF0ZTA1IHx8CiAgICAgIF9zdGF0ZSA9PSBGbG9hdFBhcnNpbmdTdGF0ZS5TdGF0ZTA2IHx8CiAgICAgIF9zdGF0ZSA9PSBGbG9hdFBhcnNpbmdTdGF0ZS5TdGF0ZTA4IHx8CiAgICAgIF9zdGF0ZSA9PSBGbG9hdFBhcnNpbmdTdGF0ZS5TdGF0ZTA5IHx8CiAgICAgIF9zdGF0ZSA9PSBGbG9hdFBhcnNpbmdTdGF0ZS5TdGF0ZTEwIHx8CiAgICAgIF9zdGF0ZSA9PSBGbG9hdFBhcnNpbmdTdGF0ZS5TdGF0ZTExOwogIH0KCiAgcHVibGljIGJvb2wgSXNFcnJvcigpCiAgewogICAgcmV0dXJuIF9zdGF0ZSA9PSBGbG9hdFBhcnNpbmdTdGF0ZS5FcnJvcjsKICB9Cn0K