00C51002 in al,dx
00C51003 and esp,0FFFFFFC0h
00C51006 sub esp,0C0h
00C5100C mov eax,dword ptr [___security_cookie (0C53000h)]
00C51011 xor eax,esp
00C51013 mov dword ptr [esp+0BCh],eax
int count = 16;
__int64 inputs_hex[16] = {
0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x1fedb1530240aa54,
00C5101A xor eax,eax
00C5101C mov dword ptr [esp+38h],eax
00C51020 mov dword ptr [esp+3Ch],eax
00C51024 mov dword ptr [esp+40h],eax
00C51028 mov dword ptr [esp+44h],eax
00C5102C mov dword ptr [esp+48h],eax
00C51030 mov dword ptr [esp+4Ch],eax
0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x1ff0af0d95025bc3,
00C51034 mov dword ptr [esp+58h],eax
00C51038 mov dword ptr [esp+5Ch],eax
00C5103C mov dword ptr [esp+60h],eax
00C51040 mov dword ptr [esp+64h],eax
00C51044 mov dword ptr [esp+68h],eax
00C51048 mov dword ptr [esp+6Ch],eax
0x1fc9353df6af376b, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,
00C5104C mov dword ptr [esp+80h],eax
00C51053 mov dword ptr [esp+84h],eax
00C5105A mov dword ptr [esp+88h],eax
00C51061 mov dword ptr [esp+8Ch],eax
00C51068 mov dword ptr [esp+90h],eax
00C5106F mov dword ptr [esp+94h],eax
0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000
00C51076 mov dword ptr [esp+98h],eax
00C5107D mov dword ptr [esp+9Ch],eax
00C51084 mov dword ptr [esp+0A0h],eax
00C5108B mov dword ptr [esp+0A4h],eax
00C51092 mov dword ptr [esp+0A8h],eax
00C51099 mov dword ptr [esp+0ACh],eax
};
00C510A0 mov dword ptr [esp+0B0h],eax
00C510A7 mov dword ptr [esp+0B4h],eax
double* inputs = (double*)inputs_hex;
double norm = calc_norm_and_regulate(count, inputs, false);
00C510AE lea eax,[esp+38h]
00C510B2 mov dword ptr [esp+50h],240AA54h
00C510BA mov dword ptr [esp+54h],1FEDB153h
00C510C2 mov dword ptr [esp+70h],95025BC3h
00C510CA mov dword ptr [esp+74h],1FF0AF0Dh
00C510D2 mov dword ptr [esp+78h],0F6AF376Bh
00C510DA mov dword ptr [esp+7Ch],1FC9353Dh
00C510E2 call calc_norm_and_regulate<double> (0C51130h)
00C510E7 fst qword ptr [esp+30h]
fprintf(stdout, "[2]0x%016llX:%.19lg\n", *(uint64_t*)&norm, norm);
00C510EB mov eax,dword ptr [esp+34h]
00C510EF mov ecx,dword ptr [esp+30h]
00C510F3 sub esp,8
00C510F6 fstp qword ptr [esp]
00C510F9 push eax
00C510FA push ecx
00C510FB push offset string "[2]0x%016llX:%.19lg\n" (0C520F4h)
00C51100 call dword ptr [__imp____iob_func (0C5209Ch)]
00C51106 add eax,20h
00C51109 push eax
00C5110A call dword ptr [__imp__fprintf (0C520A4h)]
return 0;
}
00C51110 mov ecx,dword ptr [esp+0D4h]
00C51117 add esp,18h
00C5111A xor ecx,esp
00C5111C xor eax,eax
00C5111E call __security_check_cookie (0C511D5h)
00C51123 mov esp,ebp
00C51125 pop ebp
00C51126 ret
--- ソース ファイルがありません -------------------------------------------------------------
00C51127 int 3
00C51128 int 3
00C51129 int 3
00C5112A int 3
00C5112B int 3
00C5112C int 3
00C5112D int 3
00C5112E int 3
00C5112F int 3
--- c:\mingw\msys\1.0\home\root\double2\double2\double2.cpp --------------------
#include "stdafx.h"
#include <stdio.h>
#include <stdint.h>
#include <math.h>
template<typename T> static double calc_norm_and_regulate(int num, T* r, bool regulate){ // <float> for debug.
00C51130 push ebp
00C51131 mov ebp,esp
00C51133 sub esp,10h
double norm = 0;
00C51136 fldz
00C51138 add eax,10h
00C5113B fstp qword ptr [norm]
00C5113E mov ecx,2
00C51143 jmp calc_norm_and_regulate<double>+17h (0C51147h)
00C51145 fstp st(0)
for (int i = 0; i < num; i++) {
norm += (double)r[i] * (double)r[i];
00C51147 fld qword ptr [eax-10h]
00C5114A add eax,40h
00C5114D dec ecx
00C5114E fld qword ptr [eax-48h]
00C51151 fld qword ptr [eax-40h]
00C51154 fld qword ptr [eax-38h]
00C51157 fld qword ptr [eax-30h]
00C5115A fld qword ptr [eax-28h]
00C5115D fld qword ptr [eax-20h]
00C51160 fld qword ptr [eax-18h]
00C51163 fstp qword ptr [ebp-10h]
00C51166 fld st(6)
00C51168 fmulp st(7),st
00C5116A fxch st(6)
00C5116C fadd qword ptr [norm]
00C5116F fld st(5)
00C51171 fmulp st(6),st
00C51173 faddp st(5),st
00C51175 fld st(3)
00C51177 fmulp st(4),st
00C51179 fxch st(4)
00C5117B faddp st(3),st
00C5117D fld st(1)
00C5117F fmulp st(2),st
00C51181 fxch st(2)
00C51183 faddp st(1),st
00C51185 fld st(1)
00C51187 fmulp st(2),st
00C51189 faddp st(1),st
00C5118B fld st(1)
00C5118D fmulp st(2),st
00C5118F faddp st(1),st
00C51191 fld st(1)
00C51193 fmulp st(2),st
00C51195 faddp st(1),st
00C51197 fld qword ptr [ebp-10h]
00C5119A fmul st(0),st
00C5119C faddp st(1),st
00C5119E fst qword ptr [norm]
00C511A1 jne calc_norm_and_regulate<double>+15h (0C51145h)
// fprintf(stdout, "[0]0x%016llX:%.19lg\n", *(uint64_t*)&norm, norm);
}
fprintf(stdout, "[1]0x%016llX:%.19lg\n", *(uint64_t*)&norm, norm);
00C511A3 mov eax,dword ptr [ebp-4]
00C511A6 mov ecx,dword ptr [norm]
00C511A9 sub esp,8
00C511AC fstp qword ptr [esp]
00C511AF push eax
00C511B0 push ecx
00C511B1 push offset string "[1]0x%016llX:%.19lg\n" (0C5210Ch)
00C511B6 call dword ptr [__imp____iob_func (0C5209Ch)]
00C511BC add eax,20h
00C511BF push eax
00C511C0 call dword ptr [__imp__fprintf (0C520A4h)]
norm = sqrt(norm);
00C511C6 fld qword ptr [norm]
00C511C9 add esp,18h
00C511CC call _CIsqrt (0C519D0h)
if (regulate)
for (int i=0;i<num;i++)
r[i] = (T)(r[i]/norm);
return norm;
}
00C511D1 mov esp,ebp
00C511D3 pop ebp
00C511D4 ret
MDBDNTEwMDIgIGluICAgICAgICAgIGFsLGR4ICAKMDBDNTEwMDMgIGFuZCAgICAgICAgIGVzcCwwRkZGRkZGQzBoICAKMDBDNTEwMDYgIHN1YiAgICAgICAgIGVzcCwwQzBoICAKMDBDNTEwMEMgIG1vdiAgICAgICAgIGVheCxkd29yZCBwdHIgW19fX3NlY3VyaXR5X2Nvb2tpZSAoMEM1MzAwMGgpXSAgCjAwQzUxMDExICB4b3IgICAgICAgICBlYXgsZXNwICAKMDBDNTEwMTMgIG1vdiAgICAgICAgIGR3b3JkIHB0ciBbZXNwKzBCQ2hdLGVheCAgCglpbnQgY291bnQgPSAxNjsKCV9faW50NjQgaW5wdXRzX2hleFsxNl0gPSB7CgkJMHgwMDAwMDAwMDAwMDAwMDAwLCAweDAwMDAwMDAwMDAwMDAwMDAsIDB4MDAwMDAwMDAwMDAwMDAwMCwgMHgxZmVkYjE1MzAyNDBhYTU0LAowMEM1MTAxQSAgeG9yICAgICAgICAgZWF4LGVheCAgCjAwQzUxMDFDICBtb3YgICAgICAgICBkd29yZCBwdHIgW2VzcCszOGhdLGVheCAgCjAwQzUxMDIwICBtb3YgICAgICAgICBkd29yZCBwdHIgW2VzcCszQ2hdLGVheCAgCjAwQzUxMDI0ICBtb3YgICAgICAgICBkd29yZCBwdHIgW2VzcCs0MGhdLGVheCAgCjAwQzUxMDI4ICBtb3YgICAgICAgICBkd29yZCBwdHIgW2VzcCs0NGhdLGVheCAgCjAwQzUxMDJDICBtb3YgICAgICAgICBkd29yZCBwdHIgW2VzcCs0OGhdLGVheCAgCjAwQzUxMDMwICBtb3YgICAgICAgICBkd29yZCBwdHIgW2VzcCs0Q2hdLGVheCAgCgkJMHgwMDAwMDAwMDAwMDAwMDAwLCAweDAwMDAwMDAwMDAwMDAwMDAsIDB4MDAwMDAwMDAwMDAwMDAwMCwgMHgxZmYwYWYwZDk1MDI1YmMzLAowMEM1MTAzNCAgbW92ICAgICAgICAgZHdvcmQgcHRyIFtlc3ArNThoXSxlYXggIAowMEM1MTAzOCAgbW92ICAgICAgICAgZHdvcmQgcHRyIFtlc3ArNUNoXSxlYXggIAowMEM1MTAzQyAgbW92ICAgICAgICAgZHdvcmQgcHRyIFtlc3ArNjBoXSxlYXggIAowMEM1MTA0MCAgbW92ICAgICAgICAgZHdvcmQgcHRyIFtlc3ArNjRoXSxlYXggIAowMEM1MTA0NCAgbW92ICAgICAgICAgZHdvcmQgcHRyIFtlc3ArNjhoXSxlYXggIAowMEM1MTA0OCAgbW92ICAgICAgICAgZHdvcmQgcHRyIFtlc3ArNkNoXSxlYXggIAoJCTB4MWZjOTM1M2RmNmFmMzc2YiwgMHgwMDAwMDAwMDAwMDAwMDAwLCAweDAwMDAwMDAwMDAwMDAwMDAsIDB4MDAwMDAwMDAwMDAwMDAwMCwKMDBDNTEwNEMgIG1vdiAgICAgICAgIGR3b3JkIHB0ciBbZXNwKzgwaF0sZWF4ICAKMDBDNTEwNTMgIG1vdiAgICAgICAgIGR3b3JkIHB0ciBbZXNwKzg0aF0sZWF4ICAKMDBDNTEwNUEgIG1vdiAgICAgICAgIGR3b3JkIHB0ciBbZXNwKzg4aF0sZWF4ICAKMDBDNTEwNjEgIG1vdiAgICAgICAgIGR3b3JkIHB0ciBbZXNwKzhDaF0sZWF4ICAKMDBDNTEwNjggIG1vdiAgICAgICAgIGR3b3JkIHB0ciBbZXNwKzkwaF0sZWF4ICAKMDBDNTEwNkYgIG1vdiAgICAgICAgIGR3b3JkIHB0ciBbZXNwKzk0aF0sZWF4ICAKCQkweDAwMDAwMDAwMDAwMDAwMDAsIDB4MDAwMDAwMDAwMDAwMDAwMCwgMHgwMDAwMDAwMDAwMDAwMDAwLCAweDAwMDAwMDAwMDAwMDAwMDAKMDBDNTEwNzYgIG1vdiAgICAgICAgIGR3b3JkIHB0ciBbZXNwKzk4aF0sZWF4ICAKMDBDNTEwN0QgIG1vdiAgICAgICAgIGR3b3JkIHB0ciBbZXNwKzlDaF0sZWF4ICAKMDBDNTEwODQgIG1vdiAgICAgICAgIGR3b3JkIHB0ciBbZXNwKzBBMGhdLGVheCAgCjAwQzUxMDhCICBtb3YgICAgICAgICBkd29yZCBwdHIgW2VzcCswQTRoXSxlYXggIAowMEM1MTA5MiAgbW92ICAgICAgICAgZHdvcmQgcHRyIFtlc3ArMEE4aF0sZWF4ICAKMDBDNTEwOTkgIG1vdiAgICAgICAgIGR3b3JkIHB0ciBbZXNwKzBBQ2hdLGVheCAgCgl9OwowMEM1MTBBMCAgbW92ICAgICAgICAgZHdvcmQgcHRyIFtlc3ArMEIwaF0sZWF4ICAKMDBDNTEwQTcgIG1vdiAgICAgICAgIGR3b3JkIHB0ciBbZXNwKzBCNGhdLGVheCAgCglkb3VibGUqIGlucHV0cyA9IChkb3VibGUqKWlucHV0c19oZXg7Cglkb3VibGUgbm9ybSA9IGNhbGNfbm9ybV9hbmRfcmVndWxhdGUoY291bnQsIGlucHV0cywgZmFsc2UpOwowMEM1MTBBRSAgbGVhICAgICAgICAgZWF4LFtlc3ArMzhoXSAgCjAwQzUxMEIyICBtb3YgICAgICAgICBkd29yZCBwdHIgW2VzcCs1MGhdLDI0MEFBNTRoICAKMDBDNTEwQkEgIG1vdiAgICAgICAgIGR3b3JkIHB0ciBbZXNwKzU0aF0sMUZFREIxNTNoICAKMDBDNTEwQzIgIG1vdiAgICAgICAgIGR3b3JkIHB0ciBbZXNwKzcwaF0sOTUwMjVCQzNoICAKMDBDNTEwQ0EgIG1vdiAgICAgICAgIGR3b3JkIHB0ciBbZXNwKzc0aF0sMUZGMEFGMERoICAKMDBDNTEwRDIgIG1vdiAgICAgICAgIGR3b3JkIHB0ciBbZXNwKzc4aF0sMEY2QUYzNzZCaCAgCjAwQzUxMERBICBtb3YgICAgICAgICBkd29yZCBwdHIgW2VzcCs3Q2hdLDFGQzkzNTNEaCAgCjAwQzUxMEUyICBjYWxsICAgICAgICBjYWxjX25vcm1fYW5kX3JlZ3VsYXRlPGRvdWJsZT4gKDBDNTExMzBoKSAgCjAwQzUxMEU3ICBmc3QgICAgICAgICBxd29yZCBwdHIgW2VzcCszMGhdICAKCWZwcmludGYoc3Rkb3V0LCAiWzJdMHglMDE2bGxYOiUuMTlsZ1xuIiwgKih1aW50NjRfdCopJm5vcm0sIG5vcm0pOwowMEM1MTBFQiAgbW92ICAgICAgICAgZWF4LGR3b3JkIHB0ciBbZXNwKzM0aF0gIAowMEM1MTBFRiAgbW92ICAgICAgICAgZWN4LGR3b3JkIHB0ciBbZXNwKzMwaF0gIAowMEM1MTBGMyAgc3ViICAgICAgICAgZXNwLDggIAowMEM1MTBGNiAgZnN0cCAgICAgICAgcXdvcmQgcHRyIFtlc3BdICAKMDBDNTEwRjkgIHB1c2ggICAgICAgIGVheCAgCjAwQzUxMEZBICBwdXNoICAgICAgICBlY3ggIAowMEM1MTBGQiAgcHVzaCAgICAgICAgb2Zmc2V0IHN0cmluZyAiWzJdMHglMDE2bGxYOiUuMTlsZ1xuIiAoMEM1MjBGNGgpICAKMDBDNTExMDAgIGNhbGwgICAgICAgIGR3b3JkIHB0ciBbX19pbXBfX19faW9iX2Z1bmMgKDBDNTIwOUNoKV0gIAowMEM1MTEwNiAgYWRkICAgICAgICAgZWF4LDIwaCAgCjAwQzUxMTA5ICBwdXNoICAgICAgICBlYXggIAowMEM1MTEwQSAgY2FsbCAgICAgICAgZHdvcmQgcHRyIFtfX2ltcF9fZnByaW50ZiAoMEM1MjBBNGgpXSAgCglyZXR1cm4gMDsKfQowMEM1MTExMCAgbW92ICAgICAgICAgZWN4LGR3b3JkIHB0ciBbZXNwKzBENGhdICAKMDBDNTExMTcgIGFkZCAgICAgICAgIGVzcCwxOGggIAowMEM1MTExQSAgeG9yICAgICAgICAgZWN4LGVzcCAgCjAwQzUxMTFDICB4b3IgICAgICAgICBlYXgsZWF4ICAKMDBDNTExMUUgIGNhbGwgICAgICAgIF9fc2VjdXJpdHlfY2hlY2tfY29va2llICgwQzUxMUQ1aCkgIAowMEM1MTEyMyAgbW92ICAgICAgICAgZXNwLGVicCAgCjAwQzUxMTI1ICBwb3AgICAgICAgICBlYnAgIAowMEM1MTEyNiAgcmV0ICAKLS0tIOOCveODvOOCuSDjg5XjgqHjgqTjg6vjgYzjgYLjgorjgb7jgZvjgpMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQowMEM1MTEyNyAgaW50ICAgICAgICAgMyAgCjAwQzUxMTI4ICBpbnQgICAgICAgICAzICAKMDBDNTExMjkgIGludCAgICAgICAgIDMgIAowMEM1MTEyQSAgaW50ICAgICAgICAgMyAgCjAwQzUxMTJCICBpbnQgICAgICAgICAzICAKMDBDNTExMkMgIGludCAgICAgICAgIDMgIAowMEM1MTEyRCAgaW50ICAgICAgICAgMyAgCjAwQzUxMTJFICBpbnQgICAgICAgICAzICAKMDBDNTExMkYgIGludCAgICAgICAgIDMgIAotLS0gYzpcbWluZ3dcbXN5c1wxLjBcaG9tZVxyb290XGRvdWJsZTJcZG91YmxlMlxkb3VibGUyLmNwcCAtLS0tLS0tLS0tLS0tLS0tLS0tLQojaW5jbHVkZSAic3RkYWZ4LmgiCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkaW50Lmg+CiNpbmNsdWRlIDxtYXRoLmg+Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdGF0aWMgZG91YmxlIGNhbGNfbm9ybV9hbmRfcmVndWxhdGUoaW50IG51bSwgVCogciwgYm9vbCByZWd1bGF0ZSl7IC8vIDxmbG9hdD4gZm9yIGRlYnVnLgowMEM1MTEzMCAgcHVzaCAgICAgICAgZWJwICAKMDBDNTExMzEgIG1vdiAgICAgICAgIGVicCxlc3AgIAowMEM1MTEzMyAgc3ViICAgICAgICAgZXNwLDEwaCAgCglkb3VibGUgbm9ybSA9IDA7CjAwQzUxMTM2ICBmbGR6ICAKMDBDNTExMzggIGFkZCAgICAgICAgIGVheCwxMGggIAowMEM1MTEzQiAgZnN0cCAgICAgICAgcXdvcmQgcHRyIFtub3JtXSAgCjAwQzUxMTNFICBtb3YgICAgICAgICBlY3gsMiAgCjAwQzUxMTQzICBqbXAgICAgICAgICBjYWxjX25vcm1fYW5kX3JlZ3VsYXRlPGRvdWJsZT4rMTdoICgwQzUxMTQ3aCkgIAowMEM1MTE0NSAgZnN0cCAgICAgICAgc3QoMCkgIAoJZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgewoJCW5vcm0gKz0gKGRvdWJsZSlyW2ldICogKGRvdWJsZSlyW2ldOwowMEM1MTE0NyAgZmxkICAgICAgICAgcXdvcmQgcHRyIFtlYXgtMTBoXSAgCjAwQzUxMTRBICBhZGQgICAgICAgICBlYXgsNDBoICAKMDBDNTExNEQgIGRlYyAgICAgICAgIGVjeCAgCjAwQzUxMTRFICBmbGQgICAgICAgICBxd29yZCBwdHIgW2VheC00OGhdICAKMDBDNTExNTEgIGZsZCAgICAgICAgIHF3b3JkIHB0ciBbZWF4LTQwaF0gIAowMEM1MTE1NCAgZmxkICAgICAgICAgcXdvcmQgcHRyIFtlYXgtMzhoXSAgCjAwQzUxMTU3ICBmbGQgICAgICAgICBxd29yZCBwdHIgW2VheC0zMGhdICAKMDBDNTExNUEgIGZsZCAgICAgICAgIHF3b3JkIHB0ciBbZWF4LTI4aF0gIAowMEM1MTE1RCAgZmxkICAgICAgICAgcXdvcmQgcHRyIFtlYXgtMjBoXSAgCjAwQzUxMTYwICBmbGQgICAgICAgICBxd29yZCBwdHIgW2VheC0xOGhdICAKMDBDNTExNjMgIGZzdHAgICAgICAgIHF3b3JkIHB0ciBbZWJwLTEwaF0gIAowMEM1MTE2NiAgZmxkICAgICAgICAgc3QoNikgIAowMEM1MTE2OCAgZm11bHAgICAgICAgc3QoNyksc3QgIAowMEM1MTE2QSAgZnhjaCAgICAgICAgc3QoNikgIAowMEM1MTE2QyAgZmFkZCAgICAgICAgcXdvcmQgcHRyIFtub3JtXSAgCjAwQzUxMTZGICBmbGQgICAgICAgICBzdCg1KSAgCjAwQzUxMTcxICBmbXVscCAgICAgICBzdCg2KSxzdCAgCjAwQzUxMTczICBmYWRkcCAgICAgICBzdCg1KSxzdCAgCjAwQzUxMTc1ICBmbGQgICAgICAgICBzdCgzKSAgCjAwQzUxMTc3ICBmbXVscCAgICAgICBzdCg0KSxzdCAgCjAwQzUxMTc5ICBmeGNoICAgICAgICBzdCg0KSAgCjAwQzUxMTdCICBmYWRkcCAgICAgICBzdCgzKSxzdCAgCjAwQzUxMTdEICBmbGQgICAgICAgICBzdCgxKSAgCjAwQzUxMTdGICBmbXVscCAgICAgICBzdCgyKSxzdCAgCjAwQzUxMTgxICBmeGNoICAgICAgICBzdCgyKSAgCjAwQzUxMTgzICBmYWRkcCAgICAgICBzdCgxKSxzdCAgCjAwQzUxMTg1ICBmbGQgICAgICAgICBzdCgxKSAgCjAwQzUxMTg3ICBmbXVscCAgICAgICBzdCgyKSxzdCAgCjAwQzUxMTg5ICBmYWRkcCAgICAgICBzdCgxKSxzdCAgCjAwQzUxMThCICBmbGQgICAgICAgICBzdCgxKSAgCjAwQzUxMThEICBmbXVscCAgICAgICBzdCgyKSxzdCAgCjAwQzUxMThGICBmYWRkcCAgICAgICBzdCgxKSxzdCAgCjAwQzUxMTkxICBmbGQgICAgICAgICBzdCgxKSAgCjAwQzUxMTkzICBmbXVscCAgICAgICBzdCgyKSxzdCAgCjAwQzUxMTk1ICBmYWRkcCAgICAgICBzdCgxKSxzdCAgCjAwQzUxMTk3ICBmbGQgICAgICAgICBxd29yZCBwdHIgW2VicC0xMGhdICAKMDBDNTExOUEgIGZtdWwgICAgICAgIHN0KDApLHN0ICAKMDBDNTExOUMgIGZhZGRwICAgICAgIHN0KDEpLHN0ICAKMDBDNTExOUUgIGZzdCAgICAgICAgIHF3b3JkIHB0ciBbbm9ybV0gIAowMEM1MTFBMSAgam5lICAgICAgICAgY2FsY19ub3JtX2FuZF9yZWd1bGF0ZTxkb3VibGU+KzE1aCAoMEM1MTE0NWgpICAKLy8JCWZwcmludGYoc3Rkb3V0LCAiWzBdMHglMDE2bGxYOiUuMTlsZ1xuIiwgKih1aW50NjRfdCopJm5vcm0sIG5vcm0pOwoJfQoJZnByaW50ZihzdGRvdXQsICJbMV0weCUwMTZsbFg6JS4xOWxnXG4iLCAqKHVpbnQ2NF90Kikmbm9ybSwgbm9ybSk7CjAwQzUxMUEzICBtb3YgICAgICAgICBlYXgsZHdvcmQgcHRyIFtlYnAtNF0gIAowMEM1MTFBNiAgbW92ICAgICAgICAgZWN4LGR3b3JkIHB0ciBbbm9ybV0gIAowMEM1MTFBOSAgc3ViICAgICAgICAgZXNwLDggIAowMEM1MTFBQyAgZnN0cCAgICAgICAgcXdvcmQgcHRyIFtlc3BdICAKMDBDNTExQUYgIHB1c2ggICAgICAgIGVheCAgCjAwQzUxMUIwICBwdXNoICAgICAgICBlY3ggIAowMEM1MTFCMSAgcHVzaCAgICAgICAgb2Zmc2V0IHN0cmluZyAiWzFdMHglMDE2bGxYOiUuMTlsZ1xuIiAoMEM1MjEwQ2gpICAKMDBDNTExQjYgIGNhbGwgICAgICAgIGR3b3JkIHB0ciBbX19pbXBfX19faW9iX2Z1bmMgKDBDNTIwOUNoKV0gIAowMEM1MTFCQyAgYWRkICAgICAgICAgZWF4LDIwaCAgCjAwQzUxMUJGICBwdXNoICAgICAgICBlYXggIAowMEM1MTFDMCAgY2FsbCAgICAgICAgZHdvcmQgcHRyIFtfX2ltcF9fZnByaW50ZiAoMEM1MjBBNGgpXSAgCglub3JtID0gc3FydChub3JtKTsKMDBDNTExQzYgIGZsZCAgICAgICAgIHF3b3JkIHB0ciBbbm9ybV0gIAowMEM1MTFDOSAgYWRkICAgICAgICAgZXNwLDE4aCAgCjAwQzUxMUNDICBjYWxsICAgICAgICBfQ0lzcXJ0ICgwQzUxOUQwaCkgIAoJaWYgKHJlZ3VsYXRlKQoJCWZvciAoaW50IGk9MDtpPG51bTtpKyspCgkJCXJbaV0gPSAoVCkocltpXS9ub3JtKTsKCXJldHVybiBub3JtOwp9CjAwQzUxMUQxICBtb3YgICAgICAgICBlc3AsZWJwICAKMDBDNTExRDMgIHBvcCAgICAgICAgIGVicCAgCjAwQzUxMUQ0ICByZXQgIAo=