#include <iostream>
struct block
{
public:
unsigned long long SED(unsigned long long input, unsigned long long key)
{
bool A[64];
bool Key[64];
std::cout << "SED: " << input << "\t" << key << std::endl;
for (int i = 0; i<64; ++i)
{
A[i] = input & 1;
Key[i] = key & 1;
input >>= 1;
key >>= 1;
std::cout << A[i];
}
std::cout << std::endl;
C0(Key);
D0(Key);
IP_1(A);
bool L[32];
bool R[32];
for (int i = 0; i<32; ++i)
{
L[i] = data[i + 32];
R[i] = data[i];
}
for (int j = 0; j< 16; ++j)
{
bool k_[56];
for (int i = 0; i<28; ++i)
{
k_[i] = c[i];
k_[i + 28] = d[i];
}
K(j, k_);
CiDi(j + 1);
}
for (int j = 16; j>0; --j)
{
f(j, L);
for (int i = 0; i<32; ++i)
{
R[i] = L[i];
L[i] = R[i] xor p[i];
}
}
bool T[64];
for (int i = 0; i<32; ++i)
{
T[i + 32] = L[i];
T[i] = R[i];
}
IP_1(T);
unsigned long long res = 0;
for (int i = 0; i<64; ++i)
{
std::cout << data[i];
res = res + data[i];
res *= 2;
}
std::cout << std::endl;
return res;
}
unsigned long long DES(unsigned long long input, unsigned long long key)
{
bool A[64];
bool Key[64];
std::cout << "DES: " << input << "\t" << key << std::endl;
for (int i = 0; i<64; ++i)
{
A[i] = input & 1;
Key[i] = key & 1;
input >>= 1;
key >>= 1;
std::cout << A[i];
}
std::cout << std::endl;
IP(A);
C0(Key);
D0(Key);
bool L[32];
bool R[32];
for (int i = 0; i<32; ++i)
{
L[i] = data[i + 32];
R[i] = data[i];
}
for (int j = 0; j<16; ++j)
{
bool k_[56];
for (int i = 0; i<28; ++i)
{
k_[i] = c[i];
k_[i + 28] = d[i];
}
K(j, k_);
f(j, L);
for (int i = 0; i<32; ++i)
{
L[i] = R[i];
R[i] = L[i] xor p[i];
}
CiDi(j + 1);
}
for (int i = 0; i<32; ++i)
{
A[i + 32] = L[i];
A[i] = R[i];
}
IP_1(A);
unsigned long long res = 0;
for (int i = 63; i >= 0; --i)
{
res = res + data[i];
res *= 2;
}
for (int i = 0; i<64 ; ++i) std::cout << data[i];
std::cout << std::endl;
return res;
}
private:
bool data[64];
bool p[32];
bool e[48];
bool c[28];
bool d[28];
bool k[16][48];
int s[8];
void f(int i, bool L[32])
{
E(L);
bool step1[48];
for (int j = 0; j<48; ++j) step1[j] = e[j] xor k[i][j];
setS(step1);
bool b[32];
for (int j = 0; j<8; ++j)
{
int st = s[j];
for (int i = j * 4; i<(j + 1) * 4; ++i)
{
b[i] = st & 1;
st >>= 1;
}
}
P(b);
}
void setS(bool mas[48])
{
int res = 0, j = 0;
for (int i = 0; i<48; ++i)
{
res <<= 1;
res += mas[i];
if (i % 6 == 5)
{
s[j] = S[j][res];
res = 0;
++j;
}
}
}
void K(int i, bool R[56])
{
k[i][0] = R[14];
k[i][1] = R[17];
k[i][2] = R[11];
k[i][3] = R[24];
k[i][4] = R[1];
k[i][5] = R[5];
k[i][6] = R[3];
k[i][7] = R[28];
k[i][8] = R[15];
k[i][9] = R[6];
k[i][10] = R[21];
k[i][11] = R[10];
k[i][12] = R[23];
k[i][13] = R[19];
k[i][14] = R[12];
k[i][15] = R[4];
k[i][16] = R[26];
k[i][17] = R[8];
k[i][18] = R[16];
k[i][19] = R[7];
k[i][20] = R[27];
k[i][21] = R[20];
k[i][22] = R[13];
k[i][23] = R[2];
k[i][24] = R[41];
k[i][25] = R[52];
k[i][26] = R[31];
k[i][27] = R[37];
k[i][28] = R[47];
k[i][29] = R[55];
k[i][30] = R[30];
k[i][31] = R[40];
k[i][32] = R[51];
k[i][33] = R[45];
k[i][34] = R[33];
k[i][35] = R[48];
k[i][36] = R[44];
k[i][37] = R[49];
k[i][38] = R[39];
k[i][39] = R[56];
k[i][40] = R[34];
k[i][41] = R[53];
k[i][42] = R[46];
k[i][43] = R[42];
k[i][44] = R[50];
k[i][45] = R[36];
k[i][46] = R[29];
k[i][47] = R[32];
}
void CiDi(int i)
{
int n = 0;
switch (i)
{
case 1: n = 1; break;
case 2: n = 1; break;
case 3: n = 2; break;
case 4: n = 2; break;
case 5: n = 2; break;
case 6: n = 2; break;
case 7: n = 2; break;
case 8: n = 2; break;
case 9: n = 1; break;
case 10: n = 2; break;
case 11: n = 2; break;
case 12: n = 2; break;
case 13: n = 2; break;
case 14: n = 2; break;
case 15: n = 2; break;
case 16: n = 1; break;
default: std::cout << "error, i=" << i;
}
bool tc0 = c[0];
bool tc1 = c[1];
bool td0 = d[0];
bool td1 = d[1];
for (int i = 0; i<28 - n; ++i)
{
c[i] = c[i + n];
d[i] = d[i + n];
}
c[27] = tc0;
d[27] = td0;
if (n == 2) { c[26] = tc1; d[26] = td1; }
}
void D0(const bool R[64])
{
d[0] = R[63];
d[1] = R[55];
d[2] = R[47];
d[3] = R[39];
d[4] = R[31];
d[5] = R[23];
d[6] = R[15];
d[7] = R[7];
d[8] = R[62];
d[9] = R[54];
d[10] = R[46];
d[11] = R[38];
d[12] = R[30];
d[13] = R[22];
d[14] = R[14];
d[15] = R[6];
d[16] = R[61];
d[17] = R[53];
d[18] = R[45];
d[19] = R[37];
d[20] = R[29];
d[21] = R[21];
d[22] = R[13];
d[23] = R[5];
d[24] = R[28];
d[25] = R[20];
d[26] = R[12];
d[27] = R[4];
}
void C0(const bool R[64])
{
c[0] = R[57];
c[1] = R[49];
c[2] = R[41];
c[3] = R[33];
c[4] = R[25];
c[5] = R[17];
c[6] = R[9];
c[7] = R[1];
c[8] = R[58];
c[9] = R[50];
c[10] = R[42];
c[11] = R[34];
c[12] = R[26];
c[13] = R[18];
c[14] = R[10];
c[15] = R[2];
c[16] = R[59];
c[17] = R[51];
c[18] = R[43];
c[19] = R[35];
c[20] = R[27];
c[21] = R[19];
c[22] = R[11];
c[23] = R[3];
c[24] = R[60];
c[25] = R[52];
c[26] = R[44];
c[27] = R[36];
}
const int S[8][64] = {
{ 14, 0, 4, 15, 13, 7, 1, 4, 2, 14, 15, 2, 11, 13, 8, 1, 3, 10, 10, 6, 6, 12, 12, 11, 5, 9, 9, 5, 0, 3, 7, 8,
4, 15, 1, 12, 14, 8, 8, 2, 13, 4, 6, 9, 2, 1, 11, 7, 15, 5, 12, 11, 9, 3, 7, 14, 3, 10, 10, 0, 5, 6, 0, 13 },
{ 15, 3, 1, 13, 8, 4, 14, 7, 6, 15, 11, 2, 3, 8, 4, 14, 9, 12, 7, 0, 2, 1, 13, 10, 12, 6, 0, 9, 5, 11, 10, 5,
0, 13, 14, 8, 7, 10, 11, 1, 10, 3, 4, 15, 13, 4, 1, 2, 5, 11, 8, 6, 12, 7, 6, 12, 9, 0, 3, 5, 2, 14, 15, 9 },
{ 10, 13, 0, 7, 9, 0, 14, 9, 6, 3, 3, 4, 15, 6, 5, 10, 1, 2, 13, 8, 12, 5, 7, 14, 11, 12, 4, 11, 2, 15, 8, 1,
13, 1, 6, 10, 4, 13, 9, 0, 8, 6, 15, 9, 3, 8, 0, 7, 11, 4, 1, 15, 2, 14, 12, 3, 5, 11, 10, 5, 14, 2, 7, 12 },
{ 7, 13, 13, 8, 14, 11, 3, 5, 0, 6, 6, 15, 9, 0, 10, 3, 1, 4, 2, 7, 8, 2, 5, 12, 11, 1, 12, 10, 4, 14, 15, 9,
10, 3, 6, 15, 9, 0, 0, 6, 12, 10, 11, 1, 7, 13, 13, 8, 15, 9, 1, 4, 3, 5, 14, 11, 5, 12, 2, 7, 8, 2, 4, 14 },
{ 2, 14, 12, 11, 4, 2, 1, 12, 7, 4, 10, 7, 11, 13, 6, 1, 8, 5, 5, 0, 3, 15, 15, 10, 13, 3, 0, 9, 14, 8, 9, 6,
4, 11, 2, 8, 1, 12, 11, 7, 10, 1, 13, 14, 7, 2, 8, 13, 15, 6, 9, 15, 12, 0, 5, 9, 6, 10, 3, 4, 0, 5, 14, 3 },
{ 12, 10, 1, 15, 10, 4, 15, 2, 9, 7, 2, 12, 6, 9, 8, 5, 0, 6, 13, 1, 3, 13, 4, 14, 14, 0, 7, 11, 5, 3, 11, 8,
9, 4, 14, 3, 15, 2, 5, 12, 2, 9, 8, 5, 12, 15, 3, 10, 7, 11, 0, 14, 4, 1, 10, 7, 1, 6, 13, 0, 11, 8, 6, 13 },
{ 4, 13, 11, 0, 2, 11, 14, 7, 15, 4, 0, 9, 8, 1, 13, 10, 3, 14, 12, 3, 9, 5, 7, 12, 5, 2, 10, 15, 6, 8, 1, 6,
1, 6, 4, 11, 11, 13, 13, 8, 12, 1, 3, 4, 7, 10, 14, 7, 10, 9, 15, 5, 6, 0, 8, 15, 0, 14, 5, 2, 9, 3, 2, 12 },
{ 13, 1, 2, 15, 8, 13, 4, 8, 6, 10, 15, 3, 11, 7, 1, 4, 10, 12, 9, 5, 3, 6, 14, 11, 5, 0, 0, 14, 12, 9, 7, 2,
7, 2, 11, 1, 4, 14, 1, 7, 9, 4, 12, 10, 14, 8, 2, 13, 0, 15, 6, 12, 10, 9, 13, 0, 15, 3, 3, 5, 5, 6, 8, 11 }
};
void P(bool R[32])
{
p[0] = R[16];
p[1] = R[7];
p[2] = R[20];
p[3] = R[21];
p[4] = R[29];
p[5] = R[12];
p[6] = R[28];
p[7] = R[17];
p[8] = R[1];
p[9] = R[15];
p[10] = R[23];
p[11] = R[26];
p[12] = R[5];
p[13] = R[18];
p[14] = R[31];
p[15] = R[10];
p[16] = R[2];
p[17] = R[8];
p[18] = R[24];
p[19] = R[14];
p[20] = R[0];
p[21] = R[27];
p[22] = R[3];
p[23] = R[9];
p[24] = R[19];
p[25] = R[13];
p[26] = R[30];
p[27] = R[6];
p[28] = R[22];
p[29] = R[11];
p[30] = R[4];
p[31] = R[25];
}
void E(bool R[32])
{
e[0] = R[0];
e[1] = R[1];
e[2] = R[2];
e[3] = R[3];
e[4] = R[4];
e[5] = R[5];
e[6] = R[4];
e[7] = R[5];
e[8] = R[6];
e[9] = R[7];
e[10] = R[8];
e[11] = R[9];
e[12] = R[8];
e[13] = R[9];
e[14] = R[10];
e[15] = R[11];
e[16] = R[12];
e[17] = R[13];
e[18] = R[12];
e[19] = R[13];
e[20] = R[14];
e[21] = R[15];
e[22] = R[16];
e[23] = R[17];
e[24] = R[16];
e[25] = R[17];
e[26] = R[18];
e[27] = R[19];
e[28] = R[20];
e[29] = R[21];
e[30] = R[20];
e[31] = R[21];
e[32] = R[22];
e[33] = R[23];
e[34] = R[24];
e[35] = R[25];
e[36] = R[24];
e[37] = R[25];
e[38] = R[26];
e[39] = R[27];
e[40] = R[28];
e[41] = R[29];
e[42] = R[28];
e[43] = R[29];
e[44] = R[30];
e[45] = R[31];
e[46] = R[0];
e[47] = R[1];
}
void IP(const bool A[64])
{
data[0] = A[58];
data[1] = A[50];
data[2] = A[42];
data[3] = A[34];
data[4] = A[26];
data[5] = A[18];
data[6] = A[10];
data[7] = A[2];
data[8] = A[60];
data[9] = A[52];
data[10] = A[44];
data[11] = A[36];
data[12] = A[28];
data[13] = A[20];
data[14] = A[12];
data[15] = A[4];
//
data[16] = A[62];
data[17] = A[54];
data[18] = A[46];
data[19] = A[38];
data[20] = A[30];
data[21] = A[22];
data[22] = A[14];
data[23] = A[6];
data[24] = A[64];
data[25] = A[56];
data[26] = A[48];
data[27] = A[40];
data[28] = A[32];
data[29] = A[24];
data[30] = A[16];
data[31] = A[8];
//
data[32] = A[57];
data[33] = A[49];
data[34] = A[41];
data[35] = A[33];
data[36] = A[25];
data[37] = A[17];
data[38] = A[9];
data[39] = A[1];
data[40] = A[59];
data[41] = A[51];
data[42] = A[43];
data[43] = A[35];
data[44] = A[27];
data[45] = A[19];
data[46] = A[11];
data[47] = A[3];
//
data[48] = A[61];
data[49] = A[53];
data[50] = A[45];
data[51] = A[37];
data[52] = A[29];
data[53] = A[21];
data[54] = A[13];
data[55] = A[5];
data[56] = A[63];
data[57] = A[55];
data[58] = A[47];
data[59] = A[39];
data[60] = A[31];
data[61] = A[23];
data[62] = A[15];
data[63] = A[7];
}
void IP_1(const bool A[64])
{
data[0] = A[40];
data[1] = A[8];
data[2] = A[48];
data[3] = A[16];
data[4] = A[56];
data[5] = A[24];
data[6] = A[0];
data[7] = A[32];
data[8] = A[39];
data[9] = A[7];
data[10] = A[47];
data[11] = A[15];
data[12] = A[55];
data[13] = A[23];
data[14] = A[63];
data[15] = A[31];
//
data[16] = A[38];
data[17] = A[6];
data[18] = A[46];
data[19] = A[14];
data[20] = A[54];
data[21] = A[22];
data[22] = A[62];
data[23] = A[30];
data[24] = A[37];
data[25] = A[5];
data[26] = A[45];
data[27] = A[13];
data[28] = A[53];
data[29] = A[21];
data[30] = A[61];
data[31] = A[29];
//
data[32] = A[36];
data[33] = A[4];
data[34] = A[44];
data[35] = A[12];
data[36] = A[52];
data[37] = A[20];
data[38] = A[60];
data[39] = A[28];
data[40] = A[35];
data[41] = A[3];
data[42] = A[43];
data[43] = A[11];
data[44] = A[51];
data[45] = A[19];
data[46] = A[59];
data[47] = A[27];
//
data[48] = A[34];
data[49] = A[2];
data[50] = A[42];
data[51] = A[10];
data[52] = A[50];
data[53] = A[18];
data[54] = A[58];
data[55] = A[26];
data[56] = A[33];
data[57] = A[1];
data[58] = A[41];
data[59] = A[9];
data[60] = A[49];
data[61] = A[17];
data[62] = A[57];
data[63] = A[25];
}
};
int main()
{
block p;
unsigned long long int a = p.DES(123456789, 123);
unsigned long long int b = p.SED(a, 123);
std::cout << "Hello World! a=" << a << "; b=" << b << std::endl;
return 0;
}
CiNpbmNsdWRlIDxpb3N0cmVhbT4KCgpzdHJ1Y3QgYmxvY2sKewpwdWJsaWM6Cgl1bnNpZ25lZCBsb25nIGxvbmcgU0VEKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnB1dCwgdW5zaWduZWQgbG9uZyBsb25nIGtleSkKCXsKCQlib29sIEFbNjRdOwoJCWJvb2wgS2V5WzY0XTsKCQlzdGQ6OmNvdXQgPDwgIlNFRDogIiA8PCBpbnB1dCA8PCAiXHQiIDw8IGtleSA8PCBzdGQ6OmVuZGw7CgkJZm9yIChpbnQgaSA9IDA7IGk8NjQ7ICsraSkKCQl7CgkJCUFbaV0gPSBpbnB1dCAmIDE7CgkJCUtleVtpXSA9IGtleSAmIDE7CgkJCWlucHV0ID4+PSAxOwoJCQlrZXkgPj49IDE7CgkJCXN0ZDo6Y291dCA8PCBBW2ldOwoJCX0KCQlzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwoJCUMwKEtleSk7CgkJRDAoS2V5KTsKCQlJUF8xKEEpOwoJCWJvb2wgTFszMl07CgkJYm9vbCBSWzMyXTsKCQlmb3IgKGludCBpID0gMDsgaTwzMjsgKytpKQoJCXsKCQkJTFtpXSA9IGRhdGFbaSArIDMyXTsKCQkJUltpXSA9IGRhdGFbaV07CgkJfQoJCWZvciAoaW50IGogPSAwOyBqPCAxNjsgKytqKQoJCXsKCQkJYm9vbCBrX1s1Nl07CgkJCWZvciAoaW50IGkgPSAwOyBpPDI4OyArK2kpCgkJCXsKCQkJCWtfW2ldID0gY1tpXTsKCQkJCWtfW2kgKyAyOF0gPSBkW2ldOwoJCQl9CgkJCUsoaiwga18pOwoJCQlDaURpKGogKyAxKTsKCQl9CgkJZm9yIChpbnQgaiA9IDE2OyBqPjA7IC0taikKCQl7CgkJCWYoaiwgTCk7CgkJCWZvciAoaW50IGkgPSAwOyBpPDMyOyArK2kpCgkJCXsKCQkJCVJbaV0gPSBMW2ldOwoJCQkJTFtpXSA9IFJbaV0geG9yIHBbaV07CgkJCX0KCQl9CgkJYm9vbCBUWzY0XTsKCQlmb3IgKGludCBpID0gMDsgaTwzMjsgKytpKQoJCXsKCQkJVFtpICsgMzJdID0gTFtpXTsKCQkJVFtpXSA9IFJbaV07CgkJfQoJCUlQXzEoVCk7CgkJdW5zaWduZWQgbG9uZyBsb25nIHJlcyA9IDA7CgkJZm9yIChpbnQgaSA9IDA7IGk8NjQ7ICsraSkKCQl7CgkJCXN0ZDo6Y291dCA8PCBkYXRhW2ldOwoJCQlyZXMgPSByZXMgKyBkYXRhW2ldOwoJCQlyZXMgKj0gMjsKCQl9CgkJc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKCQlyZXR1cm4gcmVzOwoJfQoJdW5zaWduZWQgbG9uZyBsb25nIERFUyh1bnNpZ25lZCBsb25nIGxvbmcgaW5wdXQsIHVuc2lnbmVkIGxvbmcgbG9uZyBrZXkpCgl7CgkJYm9vbCBBWzY0XTsKCQlib29sIEtleVs2NF07CgkJc3RkOjpjb3V0IDw8ICJERVM6ICIgPDwgaW5wdXQgPDwgIlx0IiA8PCBrZXkgPDwgc3RkOjplbmRsOwoJCWZvciAoaW50IGkgPSAwOyBpPDY0OyArK2kpCgkJewoJCQlBW2ldID0gaW5wdXQgJiAxOwoJCQlLZXlbaV0gPSBrZXkgJiAxOwoJCQlpbnB1dCA+Pj0gMTsKCQkJa2V5ID4+PSAxOwoJCQlzdGQ6OmNvdXQgPDwgQVtpXTsKCQl9CgkJc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKCQlJUChBKTsKCQlDMChLZXkpOwoJCUQwKEtleSk7CgkJYm9vbCBMWzMyXTsKCQlib29sIFJbMzJdOwoJCWZvciAoaW50IGkgPSAwOyBpPDMyOyArK2kpCgkJewoJCQlMW2ldID0gZGF0YVtpICsgMzJdOwoJCQlSW2ldID0gZGF0YVtpXTsKCQl9CgkJZm9yIChpbnQgaiA9IDA7IGo8MTY7ICsraikKCQl7CgkJCWJvb2wga19bNTZdOwoJCQlmb3IgKGludCBpID0gMDsgaTwyODsgKytpKQoJCQl7CgkJCQlrX1tpXSA9IGNbaV07CgkJCQlrX1tpICsgMjhdID0gZFtpXTsKCQkJfQoJCQlLKGosIGtfKTsKCQkJZihqLCBMKTsKCQkJZm9yIChpbnQgaSA9IDA7IGk8MzI7ICsraSkKCQkJewoJCQkJTFtpXSA9IFJbaV07CgkJCQlSW2ldID0gTFtpXSB4b3IgcFtpXTsKCQkJfQoJCQlDaURpKGogKyAxKTsKCQl9CgkJZm9yIChpbnQgaSA9IDA7IGk8MzI7ICsraSkKCQl7CgkJCUFbaSArIDMyXSA9IExbaV07CgkJCUFbaV0gPSBSW2ldOwoJCX0KCQlJUF8xKEEpOwoJCXVuc2lnbmVkIGxvbmcgbG9uZyByZXMgPSAwOwoJCWZvciAoaW50IGkgPSA2MzsgaSA+PSAwOyAtLWkpCgkJewoJCQlyZXMgPSByZXMgKyBkYXRhW2ldOwoJCQlyZXMgKj0gMjsKCQl9CgkJZm9yIChpbnQgaSA9IDA7IGk8NjQgOyArK2kpIHN0ZDo6Y291dCA8PCBkYXRhW2ldOwoJCXN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CgkJcmV0dXJuIHJlczsKCX0KCnByaXZhdGU6Cglib29sIGRhdGFbNjRdOwoJYm9vbCBwWzMyXTsKCWJvb2wgZVs0OF07Cglib29sIGNbMjhdOwoJYm9vbCBkWzI4XTsKCWJvb2wga1sxNl1bNDhdOwoJaW50IHNbOF07Cgl2b2lkIGYoaW50IGksIGJvb2wgTFszMl0pCgl7CgkJRShMKTsKCQlib29sIHN0ZXAxWzQ4XTsKCQlmb3IgKGludCBqID0gMDsgajw0ODsgKytqKSBzdGVwMVtqXSA9IGVbal0geG9yIGtbaV1bal07CgkJc2V0UyhzdGVwMSk7CgkJYm9vbCBiWzMyXTsKCQlmb3IgKGludCBqID0gMDsgajw4OyArK2opCgkJewoJCQlpbnQgc3QgPSBzW2pdOwoJCQlmb3IgKGludCBpID0gaiAqIDQ7IGk8KGogKyAxKSAqIDQ7ICsraSkKCQkJewoJCQkJYltpXSA9IHN0ICYgMTsKCQkJCXN0ID4+PSAxOwoJCQl9CgkJfQoJCVAoYik7Cgl9Cgl2b2lkIHNldFMoYm9vbCBtYXNbNDhdKQoJewoJCWludCByZXMgPSAwLCBqID0gMDsKCQlmb3IgKGludCBpID0gMDsgaTw0ODsgKytpKQoJCXsKCQkJcmVzIDw8PSAxOwoJCQlyZXMgKz0gbWFzW2ldOwoJCQlpZiAoaSAlIDYgPT0gNSkKCQkJewoJCQkJc1tqXSA9IFNbal1bcmVzXTsKCQkJCXJlcyA9IDA7CgkJCQkrK2o7CgkJCX0KCQl9Cgl9Cgl2b2lkIEsoaW50IGksIGJvb2wgUls1Nl0pCgl7CgkJa1tpXVswXSA9IFJbMTRdOwoJCWtbaV1bMV0gPSBSWzE3XTsKCQlrW2ldWzJdID0gUlsxMV07CgkJa1tpXVszXSA9IFJbMjRdOwoJCWtbaV1bNF0gPSBSWzFdOwoJCWtbaV1bNV0gPSBSWzVdOwoJCWtbaV1bNl0gPSBSWzNdOwoJCWtbaV1bN10gPSBSWzI4XTsKCQlrW2ldWzhdID0gUlsxNV07CgkJa1tpXVs5XSA9IFJbNl07CgkJa1tpXVsxMF0gPSBSWzIxXTsKCQlrW2ldWzExXSA9IFJbMTBdOwoJCWtbaV1bMTJdID0gUlsyM107CgkJa1tpXVsxM10gPSBSWzE5XTsKCQlrW2ldWzE0XSA9IFJbMTJdOwoJCWtbaV1bMTVdID0gUls0XTsKCQlrW2ldWzE2XSA9IFJbMjZdOwoJCWtbaV1bMTddID0gUls4XTsKCQlrW2ldWzE4XSA9IFJbMTZdOwoJCWtbaV1bMTldID0gUls3XTsKCQlrW2ldWzIwXSA9IFJbMjddOwoJCWtbaV1bMjFdID0gUlsyMF07CgkJa1tpXVsyMl0gPSBSWzEzXTsKCQlrW2ldWzIzXSA9IFJbMl07CgkJa1tpXVsyNF0gPSBSWzQxXTsKCQlrW2ldWzI1XSA9IFJbNTJdOwoJCWtbaV1bMjZdID0gUlszMV07CgkJa1tpXVsyN10gPSBSWzM3XTsKCQlrW2ldWzI4XSA9IFJbNDddOwoJCWtbaV1bMjldID0gUls1NV07CgkJa1tpXVszMF0gPSBSWzMwXTsKCQlrW2ldWzMxXSA9IFJbNDBdOwoJCWtbaV1bMzJdID0gUls1MV07CgkJa1tpXVszM10gPSBSWzQ1XTsKCQlrW2ldWzM0XSA9IFJbMzNdOwoJCWtbaV1bMzVdID0gUls0OF07CgkJa1tpXVszNl0gPSBSWzQ0XTsKCQlrW2ldWzM3XSA9IFJbNDldOwoJCWtbaV1bMzhdID0gUlszOV07CgkJa1tpXVszOV0gPSBSWzU2XTsKCQlrW2ldWzQwXSA9IFJbMzRdOwoJCWtbaV1bNDFdID0gUls1M107CgkJa1tpXVs0Ml0gPSBSWzQ2XTsKCQlrW2ldWzQzXSA9IFJbNDJdOwoJCWtbaV1bNDRdID0gUls1MF07CgkJa1tpXVs0NV0gPSBSWzM2XTsKCQlrW2ldWzQ2XSA9IFJbMjldOwoJCWtbaV1bNDddID0gUlszMl07Cgl9Cgl2b2lkIENpRGkoaW50IGkpCgl7CgkJaW50IG4gPSAwOwoJCXN3aXRjaCAoaSkKCQl7CgkJY2FzZSAxOgluID0gMTsgYnJlYWs7CgkJY2FzZSAyOgluID0gMTsgYnJlYWs7CgkJY2FzZSAzOgluID0gMjsgYnJlYWs7CgkJY2FzZSA0OgluID0gMjsgYnJlYWs7CgkJY2FzZSA1OgluID0gMjsgYnJlYWs7CgkJY2FzZSA2OgluID0gMjsgYnJlYWs7CgkJY2FzZSA3OgluID0gMjsgYnJlYWs7CgkJY2FzZSA4OgluID0gMjsgYnJlYWs7CgkJY2FzZSA5OgluID0gMTsgYnJlYWs7CgkJY2FzZSAxMDoJbiA9IDI7IGJyZWFrOwoJCWNhc2UgMTE6CW4gPSAyOyBicmVhazsKCQljYXNlIDEyOgluID0gMjsgYnJlYWs7CgkJY2FzZSAxMzoJbiA9IDI7IGJyZWFrOwoJCWNhc2UgMTQ6CW4gPSAyOyBicmVhazsKCQljYXNlIDE1OgluID0gMjsgYnJlYWs7CgkJY2FzZSAxNjoJbiA9IDE7IGJyZWFrOwoJCWRlZmF1bHQ6IHN0ZDo6Y291dCA8PCAiZXJyb3IsIGk9IiA8PCBpOwoJCX0KCQlib29sIHRjMCA9IGNbMF07CgkJYm9vbCB0YzEgPSBjWzFdOwoJCWJvb2wgdGQwID0gZFswXTsKCQlib29sIHRkMSA9IGRbMV07CgkJZm9yIChpbnQgaSA9IDA7IGk8MjggLSBuOyArK2kpCgkJewoJCQljW2ldID0gY1tpICsgbl07CgkJCWRbaV0gPSBkW2kgKyBuXTsKCQl9CgkJY1syN10gPSB0YzA7CgkJZFsyN10gPSB0ZDA7CgkJaWYgKG4gPT0gMikgeyBjWzI2XSA9IHRjMTsgZFsyNl0gPSB0ZDE7IH0KCX0KCXZvaWQgRDAoY29uc3QgYm9vbCBSWzY0XSkKCXsKCQlkWzBdID0gUls2M107CgkJZFsxXSA9IFJbNTVdOwoJCWRbMl0gPSBSWzQ3XTsKCQlkWzNdID0gUlszOV07CgkJZFs0XSA9IFJbMzFdOwoJCWRbNV0gPSBSWzIzXTsKCQlkWzZdID0gUlsxNV07CgkJZFs3XSA9IFJbN107CgkJZFs4XSA9IFJbNjJdOwoJCWRbOV0gPSBSWzU0XTsKCQlkWzEwXSA9IFJbNDZdOwoJCWRbMTFdID0gUlszOF07CgkJZFsxMl0gPSBSWzMwXTsKCQlkWzEzXSA9IFJbMjJdOwoJCWRbMTRdID0gUlsxNF07CgkJZFsxNV0gPSBSWzZdOwoJCWRbMTZdID0gUls2MV07CgkJZFsxN10gPSBSWzUzXTsKCQlkWzE4XSA9IFJbNDVdOwoJCWRbMTldID0gUlszN107CgkJZFsyMF0gPSBSWzI5XTsKCQlkWzIxXSA9IFJbMjFdOwoJCWRbMjJdID0gUlsxM107CgkJZFsyM10gPSBSWzVdOwoJCWRbMjRdID0gUlsyOF07CgkJZFsyNV0gPSBSWzIwXTsKCQlkWzI2XSA9IFJbMTJdOwoJCWRbMjddID0gUls0XTsKCX0KCXZvaWQgQzAoY29uc3QgYm9vbCBSWzY0XSkKCXsKCQljWzBdID0gUls1N107CgkJY1sxXSA9IFJbNDldOwoJCWNbMl0gPSBSWzQxXTsKCQljWzNdID0gUlszM107CgkJY1s0XSA9IFJbMjVdOwoJCWNbNV0gPSBSWzE3XTsKCQljWzZdID0gUls5XTsKCQljWzddID0gUlsxXTsKCQljWzhdID0gUls1OF07CgkJY1s5XSA9IFJbNTBdOwoJCWNbMTBdID0gUls0Ml07CgkJY1sxMV0gPSBSWzM0XTsKCQljWzEyXSA9IFJbMjZdOwoJCWNbMTNdID0gUlsxOF07CgkJY1sxNF0gPSBSWzEwXTsKCQljWzE1XSA9IFJbMl07CgkJY1sxNl0gPSBSWzU5XTsKCQljWzE3XSA9IFJbNTFdOwoJCWNbMThdID0gUls0M107CgkJY1sxOV0gPSBSWzM1XTsKCQljWzIwXSA9IFJbMjddOwoJCWNbMjFdID0gUlsxOV07CgkJY1syMl0gPSBSWzExXTsKCQljWzIzXSA9IFJbM107CgkJY1syNF0gPSBSWzYwXTsKCQljWzI1XSA9IFJbNTJdOwoJCWNbMjZdID0gUls0NF07CgkJY1syN10gPSBSWzM2XTsKCX0KCgljb25zdCBpbnQgU1s4XVs2NF0gPSB7CgkJeyAxNCwgMCwgNCwgMTUsIDEzLCA3LCAxLCA0LCAyLCAxNCwgMTUsIDIsIDExLCAxMywgOCwgMSwgMywgMTAsIDEwLCA2LCA2LCAxMiwgMTIsIDExLCA1LCA5LCA5LCA1LCAwLCAzLCA3LCA4LAoJCTQsIDE1LCAxLCAxMiwgMTQsIDgsIDgsIDIsIDEzLCA0LCA2LCA5LCAyLCAxLCAxMSwgNywgMTUsIDUsIDEyLCAxMSwgOSwgMywgNywgMTQsIDMsIDEwLCAxMCwgMCwgNSwgNiwgMCwgMTMgfSwKCQl7IDE1LCAzLCAxLCAxMywgOCwgNCwgMTQsIDcsIDYsIDE1LCAxMSwgMiwgMywgOCwgNCwgMTQsIDksIDEyLCA3LCAwLCAyLCAxLCAxMywgMTAsIDEyLCA2LCAwLCA5LCA1LCAxMSwgMTAsIDUsCgkJMCwgMTMsIDE0LCA4LCA3LCAxMCwgMTEsIDEsIDEwLCAzLCA0LCAxNSwgMTMsIDQsIDEsIDIsIDUsIDExLCA4LCA2LCAxMiwgNywgNiwgMTIsIDksIDAsIDMsIDUsIDIsIDE0LCAxNSwgOSB9LAoJCXsgMTAsIDEzLCAwLCA3LCA5LCAwLCAxNCwgOSwgNiwgMywgMywgNCwgMTUsIDYsIDUsIDEwLCAxLCAyLCAxMywgOCwgMTIsIDUsIDcsIDE0LCAxMSwgMTIsIDQsIDExLCAyLCAxNSwgOCwgMSwKCQkxMywgMSwgNiwgMTAsIDQsIDEzLCA5LCAwLCA4LCA2LCAxNSwgOSwgMywgOCwgMCwgNywgMTEsIDQsIDEsIDE1LCAyLCAxNCwgMTIsIDMsIDUsIDExLCAxMCwgNSwgMTQsIDIsIDcsIDEyIH0sCgkJeyA3LCAxMywgMTMsIDgsIDE0LCAxMSwgMywgNSwgMCwgNiwgNiwgMTUsIDksIDAsIDEwLCAzLCAxLCA0LCAyLCA3LCA4LCAyLCA1LCAxMiwgMTEsIDEsIDEyLCAxMCwgNCwgMTQsIDE1LCA5LAoJCTEwLCAzLCA2LCAxNSwgOSwgMCwgMCwgNiwgMTIsIDEwLCAxMSwgMSwgNywgMTMsIDEzLCA4LCAxNSwgOSwgMSwgNCwgMywgNSwgMTQsIDExLCA1LCAxMiwgMiwgNywgOCwgMiwgNCwgMTQgfSwKCQl7IDIsIDE0LCAxMiwgMTEsIDQsIDIsIDEsIDEyLCA3LCA0LCAxMCwgNywgMTEsIDEzLCA2LCAxLCA4LCA1LCA1LCAwLCAzLCAxNSwgMTUsIDEwLCAxMywgMywgMCwgOSwgMTQsIDgsIDksIDYsCgkJNCwgMTEsIDIsIDgsIDEsIDEyLCAxMSwgNywgMTAsIDEsIDEzLCAxNCwgNywgMiwgOCwgMTMsIDE1LCA2LCA5LCAxNSwgMTIsIDAsIDUsIDksIDYsIDEwLCAzLCA0LCAwLCA1LCAxNCwgMyB9LAoJCXsgMTIsIDEwLCAxLCAxNSwgMTAsIDQsIDE1LCAyLCA5LCA3LCAyLCAxMiwgNiwgOSwgOCwgNSwgMCwgNiwgMTMsIDEsIDMsIDEzLCA0LCAxNCwgMTQsIDAsIDcsIDExLCA1LCAzLCAxMSwgOCwKCQk5LCA0LCAxNCwgMywgMTUsIDIsIDUsIDEyLCAyLCA5LCA4LCA1LCAxMiwgMTUsIDMsIDEwLCA3LCAxMSwgMCwgMTQsIDQsIDEsIDEwLCA3LCAxLCA2LCAxMywgMCwgMTEsIDgsIDYsIDEzIH0sCgkJeyA0LCAxMywgMTEsIDAsIDIsIDExLCAxNCwgNywgMTUsIDQsIDAsIDksIDgsIDEsIDEzLCAxMCwgMywgMTQsIDEyLCAzLCA5LCA1LCA3LCAxMiwgNSwgMiwgMTAsIDE1LCA2LCA4LCAxLCA2LAoJCTEsIDYsIDQsIDExLCAxMSwgMTMsIDEzLCA4LCAxMiwgMSwgMywgNCwgNywgMTAsIDE0LCA3LCAxMCwgOSwgMTUsIDUsIDYsIDAsIDgsIDE1LCAwLCAxNCwgNSwgMiwgOSwgMywgMiwgMTIgfSwKCQl7IDEzLCAxLCAyLCAxNSwgOCwgMTMsIDQsIDgsIDYsIDEwLCAxNSwgMywgMTEsIDcsIDEsIDQsIDEwLCAxMiwgOSwgNSwgMywgNiwgMTQsIDExLCA1LCAwLCAwLCAxNCwgMTIsIDksIDcsIDIsCgkJNywgMiwgMTEsIDEsIDQsIDE0LCAxLCA3LCA5LCA0LCAxMiwgMTAsIDE0LCA4LCAyLCAxMywgMCwgMTUsIDYsIDEyLCAxMCwgOSwgMTMsIDAsIDE1LCAzLCAzLCA1LCA1LCA2LCA4LCAxMSB9Cgl9OwoJdm9pZCBQKGJvb2wgUlszMl0pCgl7CgkJcFswXSA9IFJbMTZdOwoJCXBbMV0gPSBSWzddOwoJCXBbMl0gPSBSWzIwXTsKCQlwWzNdID0gUlsyMV07CgkJcFs0XSA9IFJbMjldOwoJCXBbNV0gPSBSWzEyXTsKCQlwWzZdID0gUlsyOF07CgkJcFs3XSA9IFJbMTddOwoJCXBbOF0gPSBSWzFdOwoJCXBbOV0gPSBSWzE1XTsKCQlwWzEwXSA9IFJbMjNdOwoJCXBbMTFdID0gUlsyNl07CgkJcFsxMl0gPSBSWzVdOwoJCXBbMTNdID0gUlsxOF07CgkJcFsxNF0gPSBSWzMxXTsKCQlwWzE1XSA9IFJbMTBdOwoJCXBbMTZdID0gUlsyXTsKCQlwWzE3XSA9IFJbOF07CgkJcFsxOF0gPSBSWzI0XTsKCQlwWzE5XSA9IFJbMTRdOwoJCXBbMjBdID0gUlswXTsKCQlwWzIxXSA9IFJbMjddOwoJCXBbMjJdID0gUlszXTsKCQlwWzIzXSA9IFJbOV07CgkJcFsyNF0gPSBSWzE5XTsKCQlwWzI1XSA9IFJbMTNdOwoJCXBbMjZdID0gUlszMF07CgkJcFsyN10gPSBSWzZdOwoJCXBbMjhdID0gUlsyMl07CgkJcFsyOV0gPSBSWzExXTsKCQlwWzMwXSA9IFJbNF07CgkJcFszMV0gPSBSWzI1XTsKCX0KCXZvaWQgRShib29sIFJbMzJdKQoJewoJCWVbMF0gPSBSWzBdOwoJCWVbMV0gPSBSWzFdOwoJCWVbMl0gPSBSWzJdOwoJCWVbM10gPSBSWzNdOwoJCWVbNF0gPSBSWzRdOwoJCWVbNV0gPSBSWzVdOwoJCWVbNl0gPSBSWzRdOwoJCWVbN10gPSBSWzVdOwoJCWVbOF0gPSBSWzZdOwoJCWVbOV0gPSBSWzddOwoJCWVbMTBdID0gUls4XTsKCQllWzExXSA9IFJbOV07CgkJZVsxMl0gPSBSWzhdOwoJCWVbMTNdID0gUls5XTsKCQllWzE0XSA9IFJbMTBdOwoJCWVbMTVdID0gUlsxMV07CgkJZVsxNl0gPSBSWzEyXTsKCQllWzE3XSA9IFJbMTNdOwoJCWVbMThdID0gUlsxMl07CgkJZVsxOV0gPSBSWzEzXTsKCQllWzIwXSA9IFJbMTRdOwoJCWVbMjFdID0gUlsxNV07CgkJZVsyMl0gPSBSWzE2XTsKCQllWzIzXSA9IFJbMTddOwoJCWVbMjRdID0gUlsxNl07CgkJZVsyNV0gPSBSWzE3XTsKCQllWzI2XSA9IFJbMThdOwoJCWVbMjddID0gUlsxOV07CgkJZVsyOF0gPSBSWzIwXTsKCQllWzI5XSA9IFJbMjFdOwoJCWVbMzBdID0gUlsyMF07CgkJZVszMV0gPSBSWzIxXTsKCQllWzMyXSA9IFJbMjJdOwoJCWVbMzNdID0gUlsyM107CgkJZVszNF0gPSBSWzI0XTsKCQllWzM1XSA9IFJbMjVdOwoJCWVbMzZdID0gUlsyNF07CgkJZVszN10gPSBSWzI1XTsKCQllWzM4XSA9IFJbMjZdOwoJCWVbMzldID0gUlsyN107CgkJZVs0MF0gPSBSWzI4XTsKCQllWzQxXSA9IFJbMjldOwoJCWVbNDJdID0gUlsyOF07CgkJZVs0M10gPSBSWzI5XTsKCQllWzQ0XSA9IFJbMzBdOwoJCWVbNDVdID0gUlszMV07CgkJZVs0Nl0gPSBSWzBdOwoJCWVbNDddID0gUlsxXTsKCX0KCgl2b2lkIElQKGNvbnN0IGJvb2wgQVs2NF0pCgl7CgkJZGF0YVswXSA9IEFbNThdOwoJCWRhdGFbMV0gPSBBWzUwXTsKCQlkYXRhWzJdID0gQVs0Ml07CgkJZGF0YVszXSA9IEFbMzRdOwoJCWRhdGFbNF0gPSBBWzI2XTsKCQlkYXRhWzVdID0gQVsxOF07CgkJZGF0YVs2XSA9IEFbMTBdOwoJCWRhdGFbN10gPSBBWzJdOwoJCWRhdGFbOF0gPSBBWzYwXTsKCQlkYXRhWzldID0gQVs1Ml07CgkJZGF0YVsxMF0gPSBBWzQ0XTsKCQlkYXRhWzExXSA9IEFbMzZdOwoJCWRhdGFbMTJdID0gQVsyOF07CgkJZGF0YVsxM10gPSBBWzIwXTsKCQlkYXRhWzE0XSA9IEFbMTJdOwoJCWRhdGFbMTVdID0gQVs0XTsKCQkvLwoJCWRhdGFbMTZdID0gQVs2Ml07CgkJZGF0YVsxN10gPSBBWzU0XTsKCQlkYXRhWzE4XSA9IEFbNDZdOwoJCWRhdGFbMTldID0gQVszOF07CgkJZGF0YVsyMF0gPSBBWzMwXTsKCQlkYXRhWzIxXSA9IEFbMjJdOwoJCWRhdGFbMjJdID0gQVsxNF07CgkJZGF0YVsyM10gPSBBWzZdOwoJCWRhdGFbMjRdID0gQVs2NF07CgkJZGF0YVsyNV0gPSBBWzU2XTsKCQlkYXRhWzI2XSA9IEFbNDhdOwoJCWRhdGFbMjddID0gQVs0MF07CgkJZGF0YVsyOF0gPSBBWzMyXTsKCQlkYXRhWzI5XSA9IEFbMjRdOwoJCWRhdGFbMzBdID0gQVsxNl07CgkJZGF0YVszMV0gPSBBWzhdOwoJCS8vCgkJZGF0YVszMl0gPSBBWzU3XTsKCQlkYXRhWzMzXSA9IEFbNDldOwoJCWRhdGFbMzRdID0gQVs0MV07CgkJZGF0YVszNV0gPSBBWzMzXTsKCQlkYXRhWzM2XSA9IEFbMjVdOwoJCWRhdGFbMzddID0gQVsxN107CgkJZGF0YVszOF0gPSBBWzldOwoJCWRhdGFbMzldID0gQVsxXTsKCQlkYXRhWzQwXSA9IEFbNTldOwoJCWRhdGFbNDFdID0gQVs1MV07CgkJZGF0YVs0Ml0gPSBBWzQzXTsKCQlkYXRhWzQzXSA9IEFbMzVdOwoJCWRhdGFbNDRdID0gQVsyN107CgkJZGF0YVs0NV0gPSBBWzE5XTsKCQlkYXRhWzQ2XSA9IEFbMTFdOwoJCWRhdGFbNDddID0gQVszXTsKCQkvLwoJCWRhdGFbNDhdID0gQVs2MV07CgkJZGF0YVs0OV0gPSBBWzUzXTsKCQlkYXRhWzUwXSA9IEFbNDVdOwoJCWRhdGFbNTFdID0gQVszN107CgkJZGF0YVs1Ml0gPSBBWzI5XTsKCQlkYXRhWzUzXSA9IEFbMjFdOwoJCWRhdGFbNTRdID0gQVsxM107CgkJZGF0YVs1NV0gPSBBWzVdOwoJCWRhdGFbNTZdID0gQVs2M107CgkJZGF0YVs1N10gPSBBWzU1XTsKCQlkYXRhWzU4XSA9IEFbNDddOwoJCWRhdGFbNTldID0gQVszOV07CgkJZGF0YVs2MF0gPSBBWzMxXTsKCQlkYXRhWzYxXSA9IEFbMjNdOwoJCWRhdGFbNjJdID0gQVsxNV07CgkJZGF0YVs2M10gPSBBWzddOwoJfQoJdm9pZCBJUF8xKGNvbnN0IGJvb2wgQVs2NF0pCgl7CgkJZGF0YVswXSA9IEFbNDBdOwoJCWRhdGFbMV0gPSBBWzhdOwoJCWRhdGFbMl0gPSBBWzQ4XTsKCQlkYXRhWzNdID0gQVsxNl07CgkJZGF0YVs0XSA9IEFbNTZdOwoJCWRhdGFbNV0gPSBBWzI0XTsKCQlkYXRhWzZdID0gQVswXTsKCQlkYXRhWzddID0gQVszMl07CgkJZGF0YVs4XSA9IEFbMzldOwoJCWRhdGFbOV0gPSBBWzddOwoJCWRhdGFbMTBdID0gQVs0N107CgkJZGF0YVsxMV0gPSBBWzE1XTsKCQlkYXRhWzEyXSA9IEFbNTVdOwoJCWRhdGFbMTNdID0gQVsyM107CgkJZGF0YVsxNF0gPSBBWzYzXTsKCQlkYXRhWzE1XSA9IEFbMzFdOwoJCS8vCgkJZGF0YVsxNl0gPSBBWzM4XTsKCQlkYXRhWzE3XSA9IEFbNl07CgkJZGF0YVsxOF0gPSBBWzQ2XTsKCQlkYXRhWzE5XSA9IEFbMTRdOwoJCWRhdGFbMjBdID0gQVs1NF07CgkJZGF0YVsyMV0gPSBBWzIyXTsKCQlkYXRhWzIyXSA9IEFbNjJdOwoJCWRhdGFbMjNdID0gQVszMF07CgkJZGF0YVsyNF0gPSBBWzM3XTsKCQlkYXRhWzI1XSA9IEFbNV07CgkJZGF0YVsyNl0gPSBBWzQ1XTsKCQlkYXRhWzI3XSA9IEFbMTNdOwoJCWRhdGFbMjhdID0gQVs1M107CgkJZGF0YVsyOV0gPSBBWzIxXTsKCQlkYXRhWzMwXSA9IEFbNjFdOwoJCWRhdGFbMzFdID0gQVsyOV07CgkJLy8KCQlkYXRhWzMyXSA9IEFbMzZdOwoJCWRhdGFbMzNdID0gQVs0XTsKCQlkYXRhWzM0XSA9IEFbNDRdOwoJCWRhdGFbMzVdID0gQVsxMl07CgkJZGF0YVszNl0gPSBBWzUyXTsKCQlkYXRhWzM3XSA9IEFbMjBdOwoJCWRhdGFbMzhdID0gQVs2MF07CgkJZGF0YVszOV0gPSBBWzI4XTsKCQlkYXRhWzQwXSA9IEFbMzVdOwoJCWRhdGFbNDFdID0gQVszXTsKCQlkYXRhWzQyXSA9IEFbNDNdOwoJCWRhdGFbNDNdID0gQVsxMV07CgkJZGF0YVs0NF0gPSBBWzUxXTsKCQlkYXRhWzQ1XSA9IEFbMTldOwoJCWRhdGFbNDZdID0gQVs1OV07CgkJZGF0YVs0N10gPSBBWzI3XTsKCQkvLwoJCWRhdGFbNDhdID0gQVszNF07CgkJZGF0YVs0OV0gPSBBWzJdOwoJCWRhdGFbNTBdID0gQVs0Ml07CgkJZGF0YVs1MV0gPSBBWzEwXTsKCQlkYXRhWzUyXSA9IEFbNTBdOwoJCWRhdGFbNTNdID0gQVsxOF07CgkJZGF0YVs1NF0gPSBBWzU4XTsKCQlkYXRhWzU1XSA9IEFbMjZdOwoJCWRhdGFbNTZdID0gQVszM107CgkJZGF0YVs1N10gPSBBWzFdOwoJCWRhdGFbNThdID0gQVs0MV07CgkJZGF0YVs1OV0gPSBBWzldOwoJCWRhdGFbNjBdID0gQVs0OV07CgkJZGF0YVs2MV0gPSBBWzE3XTsKCQlkYXRhWzYyXSA9IEFbNTddOwoJCWRhdGFbNjNdID0gQVsyNV07Cgl9Cn07CgppbnQgbWFpbigpCnsKCWJsb2NrIHA7Cgl1bnNpZ25lZCBsb25nIGxvbmcgaW50IGEgPSBwLkRFUygxMjM0NTY3ODksIDEyMyk7Cgl1bnNpZ25lZCBsb25nIGxvbmcgaW50IGIgPSBwLlNFRChhLCAxMjMpOwoJc3RkOjpjb3V0IDw8ICJIZWxsbyBXb3JsZCEgYT0iIDw8IGEgPDwgIjsgYj0iIDw8IGIgPDwgc3RkOjplbmRsOwoJcmV0dXJuIDA7Cn0KCg==