#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <iostream.h>
#include <fstream.h>
#include <string.h>
void main(void)
{
int gdriver = DETECT, gmode, errorcode;
void
*body,*food,*tail1,*tail2,*tail3,*tail4,*head1,*head2,*head3,*head4;
int x, y,X[5000],Y[5000],i=3,
maxx,maxy,speed=100,bo=10,t[10],score=0,hscore=20;
unsigned int size;
char a='6',b,scor[4],hs[4];
int k=2,l,r1,r2,f=0,z=100,first=0,second=1;;
r1=300;
r2=350;
ifstream infile("c:\tc\bin\rattle.txt");
infile.getline(hs,4);
infile.close();
/* initialize graphics and local variables */
initgraph(&gdriver, &gmode, "c:\tc\bgi");
/* read result of initialization */
errorcode = graphresult();
if (errorcode != grOk) /* an error occurred */
{
", grapherrormsg(errorcode));
printf("Press any key to halt:"); exit(1); /* terminate with an error code */ }
maxx = getmaxx();
maxy = getmaxy();
y = 160;
x = 80;
for(int j=0; j<=3; j++)
{
X[i-j]=x-bo*(j+1);
Y[i-j]=y;
}
//body
setfillstyle(1,2);
bar(10,10,20,20);
setcolor(0);
setlinestyle(0,1,3);
line(9,9,21,21);
line(9,21,21,9);
size = imagesize(10,10,20,20);
getimage(10,10,20,20,body);
cleardevice();
setcolor(0);
//tail1-right
t[0]=20; t[1]=10;
t[2]=10; t[3]=10;
t[4]=20; t[5]=15;
t[6]=10; t[7]=20;
t[8]=20; t[9]=21;
fillpoly(5, t);
size = imagesize(10,10,20,21);
getimage(10,10,20,21,tail1);
cleardevice();
//tail2-left
t[0]=10; t[1]=10;
t[2]=20; t[3]=10;
t[4]=10; t[5]=15;
t[6]=20; t[7]=20;
t[8]=10; t[9]=21;
fillpoly(5, t);
size = imagesize(10,10,20,21);
getimage(10,10,20,21,tail2);
cleardevice();
//tail3-up
t[0]=10; t[1]=20;
t[2]=10; t[3]=10;
t[4]=15; t[5]=20;
t[6]=20; t[7]=10;
t[8]=20; t[9]=21;
fillpoly(5, t);
size = imagesize(10,10,20,21);
getimage(10,10,20,21,tail3);
cleardevice();
//tail4-down
t[0]=10; t[1]=10;
t[2]=10; t[3]=21;
t[4]=15; t[5]=10;
t[6]=20; t[7]=21;
t[8]=20; t[9]=10;
fillpoly(5, t);
size = imagesize(10,10,20,21);
getimage(10,10,20,21,tail4);
cleardevice();
//head1-right
setlinestyle(1,1,1);
setcolor(2);
fillellipse(10,10,10,5);
setcolor(4);
//eyes
fillellipse(15,7,1,1);
fillellipse(15,13,1,1);
size = imagesize(10,5,20,15);
getimage(10,5,20,15,head1);
//head2-left
//eyes
fillellipse(5,7,1,1);
fillellipse(5,13,1,1);
size = imagesize(0,5,10,15);
getimage(0,5,10,15,head2);
cleardevice();
//head3-up
//eyes
setcolor(2);
fillellipse(12,12,5,10);
setcolor(4);
fillellipse(9,6,1,1);
fillellipse(15,6,1,1);
size = imagesize(7,2,18,12);
getimage(7,2,18,12,head3);
//head4-down
//eyes
fillellipse(9,17,1,1);
fillellipse(15,17,1,1);
size = imagesize(7,12,18,22);
getimage(7,12,18,22,head4);
cleardevice();
//food
setcolor(15);
setfillstyle(1,15);
fillellipse(10,10,3,5);
size = imagesize(5,3,15,17);
getimage(5,3,15,17,food);
cleardevice();
/* repeat until a key is pressed */
maxx=getmaxx();
maxy=getmaxy();
setlinestyle(0,1,3);
setcolor(9);
rectangle(0,0,maxx,maxy);
setlinestyle(0,1,2);
line(maxx-150,0,maxx-150,maxy);
setcolor(8);
setfillstyle(1,8);
bar(maxx-147,3,maxx-3,63);
setcolor(12);
int maze=1;
if(maze==1)
{
setfillstyle(1,6);
bar(4,4,maxx-154,14);
bar(4,4,14,maxy-4);
bar(4,maxy-4,maxx-154,maxy-14);
bar(maxx-154-10,4,maxx-154,maxy-4);
}
settextstyle(0,0,1);
delay(300);
outtextxy(maxx-125,30,"RATTLE SNAKE");
delay(300);
setcolor(11);
setlinestyle(0,1,2);
rectangle(maxx-145,65,maxx-5,205);
outtextxy(maxx-128,70,"INSTRUCTIONS");
delay(200);
setcolor(6);
outtextxy(maxx-140,90,"Commands Key");
delay(300);
setcolor(8);
outtextxy(maxx-140,110," Move Up 8");
delay(50);
outtextxy(maxx-140,130," Move Down 5");
delay(50);
outtextxy(maxx-140,150," Move Right 6");
delay(50);
outtextxy(maxx-140,170," Move Left 4");
delay(50);
outtextxy(maxx-140,190," Exit 0");
delay(200);
setcolor(12);
setlinestyle(0,1,2);
rectangle(maxx-145,210,maxx-5,350);
setcolor(1);
outtextxy(maxx-130,220,"Player's Name");
setcolor(15);
outtextxy(maxx-100,230,"hiral");
setcolor(4);
delay(200);
outtextxy(maxx-140,250,"Score");
outtextxy(maxx-50,250,scor);
delay(200);
setcolor(10);
outtextxy(maxx-140,280,"Level");
delay(200);
setcolor(13);
outtextxy(maxx-140,310,"Maze 1");
delay(200);
setcolor(14);
outtextxy(maxx-140,340,"High Score ");
outtextxy(maxx-50,340,hs);
for(j=0; j<=1000; j++)
{
putpixel(random(maxx-150),random(maxy),6);
delay(1);
}
while (a!='0')
{
// plot new image
if(a=='6')
putimage(x, y, head1, XOR_PUT);
if(a=='4')
putimage(x, y, head2, XOR_PUT);
if(a=='8')
putimage(x, y, head3, XOR_PUT);
if(a=='5')
putimage(x, y, head4, XOR_PUT);
for(j=0; j<k; j++)
{
putimage(X[i-j], Y[i-j], body, XOR_PUT);
}
if((X[i-j-1]-X[i-j])<0 && (Y[i-j-1]-Y[i-j])==0)
putimage(X[i-j], Y[i-j], tail1, XOR_PUT);
if((X[i-j-1]-X[i-j])>0 && (Y[i-j-1]-Y[i-j])==0)
putimage(X[i-j], Y[i-j], tail2, XOR_PUT);
if((X[i-j-1]-X[i-j])==0 && (Y[i-j-1]-Y[i-j])<0)
putimage(X[i-j], Y[i-j], tail3, XOR_PUT);
if((X[i-j-1]-X[i-j])==0 && (Y[i-j-1]-Y[i-j])>0)
putimage(X[i-j], Y[i-j], tail4, XOR_PUT);
delay(speed);
if(second==1)
{
setcolor(15);
outtextxy(maxx-140,360,"Press Any Key...");
setcolor(0);
outtextxy(maxx-140,360,"Press Any Key...");
a='6';
second=2;
}
if(first==1)
{
setcolor(15);
outtextxy(maxx-140,360,"Congratulations ");
sound(100);
delay(300);
nosound();
setcolor(0);
outtextxy(maxx-140,360,"Congratulations ");
second++;
first=2;
}
// erase old image
if(a=='6')
putimage(x, y, head1, XOR_PUT);
if(a=='4')
putimage(x, y, head2, XOR_PUT);
if(a=='8')
putimage(x, y, head3, XOR_PUT);
if(a=='5')
putimage(x, y, head4, XOR_PUT);
for(j=0; j<k; j++)
{
putimage(X[i-j], Y[i-j], body, XOR_PUT);
}
if((X[i-j-1]-X[i-j])<0 && (Y[i-j-1]-Y[i-j])==0)
putimage(X[i-j], Y[i-j], tail1, XOR_PUT);
if((X[i-j-1]-X[i-j])>0 && (Y[i-j-1]-Y[i-j])==0)
putimage(X[i-j], Y[i-j], tail2, XOR_PUT);
if((X[i-j-1]-X[i-j])==0 && (Y[i-j-1]-Y[i-j])<0)
putimage(X[i-j], Y[i-j], tail3, XOR_PUT);
if((X[i-j-1]-X[i-j])==0 && (Y[i-j-1]-Y[i-j])>0)
putimage(X[i-j], Y[i-j], tail4, XOR_PUT);
if(f==0)
{
putimage(r1,r2,food,XOR_PUT);
f=1;
}
z--;
if((x>=r1 && y>=r2 && x<=r1+10 && y<=r2+10) || (x<=r1 && y<=r2 &&
x>=r1-10 && y>=r2-10) || z==0)
{
if(z!=0)
{
sound(800);
delay(20);
setcolor(0);
score += 10;
outtextxy(maxx-50,250,scor);
if(score>hscore)
{
setfillstyle(1,1);
bar(maxx-140,337,maxx-20,348);
setcolor(14);
outtextxy(maxx-50,340,hs);
outtextxy(maxx-140,340,"High Score ");
if(first==0)
{
first=1;
}
}
setcolor(4);
outtextxy(maxx-50,250,scor);
k++;
nosound();
}
z=100;
putimage(r1,r2,food,XOR_PUT);
repr1:
r1=random(450);
if(r1<50)
goto repr1;
repr2:
r2=random(400);
if(r2<50)
goto repr2;
f=0;
}
i++;
X[i]=x;
Y[i]=y;
b=a;
if(kbhit())
{
rep:
a=getche();
if((b=='6' && a=='4') || (b=='4' && a=='6'))
a=b;
if((b=='8' && a=='5') || (b=='5' && a=='8'))
a=b;
if(a!='6' && a!='4' && a!='8' && a!='0' && a!='5')
a=b;
}
/* if(x>maxx-170)
x=0;
if(y>maxy)
y=0;*/
if(a=='8')
y -= bo;
if(a=='5')
y += bo;
if(a=='4')
x -= bo;
if(a=='6')
x += bo;
for(j=i+1; j<i-k; j--)
{
if((Y[i]>=Y[j] && Y[i]<=Y[j]+10) || (Y[i]<=Y[j] && Y[i]>=X[j]-10))
{
if((X[i]>=X[j] && X[i]<=X[j]+10) || (X[i]<=X[j] && X[i]>=X[j]-10))
{
a='0';
}
outtextxy(maxx-140,360,"C ");
}
if((X[i]>=X[j] && X[i]<=X[j]+10) || (X[i]<=X[j] && X[i]>=X[j]-10))
{
if((Y[i]>=Y[j] && Y[i]<=Y[j]+10) || (Y[i]<=Y[j] && Y[i]>=X[j]-10))
{
a='0';
}
outtextxy(maxx-140,360,"C ");
}
}
/* for(j=i; j<i-k; j--)
{
if((y>=Y[j] && y<=Y[j]+10) || (y<=Y[j] && y>=Y[j]-10))
{
if((x>=X[j] && x<=X[j]+10) || (x<=X[j] && x>=X[j]-10))
{
a='5';
}
}
if((x>=X[j] && x<=X[j]+10) || (x<=X[j] && x>=X[j]-10))
{
if((y>=Y[j] && y<=Y[j]+10) || (y<=Y[j] && y>=Y[j]-10))
{
a='5';
}
}
if(j==0)
break;
} */
/* if(x<=0)
x=maxx-170;
if(y<=0)
y=maxy;*/
if(maze==1)
{
if(x<=14 || x>=maxx-184 || y<=14 || y>=maxy-14)
{
a='0';
}
}
}
if(score>hscore)
{
ofstream onfile("c:\tc\bin\rattle.txt");
onfile<<scor;
onfile.close();
}
setcolor(15);
outtextxy(maxx-140,390," Gameover");
sound(100);
delay(400);
nosound();
/* clean up */
closegraph();
}
I2luY2x1ZGUgPGdyYXBoaWNzLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxjb25pby5oPgojaW5jbHVkZSA8ZG9zLmg+CiNpbmNsdWRlIDxpb3N0cmVhbS5oPgojaW5jbHVkZSA8ZnN0cmVhbS5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgoKdm9pZCBtYWluKHZvaWQpCnsKICAgaW50IGdkcml2ZXIgPSBERVRFQ1QsIGdtb2RlLCBlcnJvcmNvZGU7CiAgIHZvaWQKKmJvZHksKmZvb2QsKnRhaWwxLCp0YWlsMiwqdGFpbDMsKnRhaWw0LCpoZWFkMSwqaGVhZDIsKmhlYWQzLCpoZWFkNDsKICAgaW50IHgsIHksWFs1MDAwXSxZWzUwMDBdLGk9MywKbWF4eCxtYXh5LHNwZWVkPTEwMCxibz0xMCx0WzEwXSxzY29yZT0wLGhzY29yZT0yMDsKICAgdW5zaWduZWQgaW50IHNpemU7CiAgIGNoYXIgYT0nNicsYixzY29yWzRdLGhzWzRdOwogICBpbnQgaz0yLGwscjEscjIsZj0wLHo9MTAwLGZpcnN0PTAsc2Vjb25kPTE7OwogICByMT0zMDA7CiAgIHIyPTM1MDsKCiAgIGlmc3RyZWFtIGluZmlsZSgiYzpcdGNcYmluXHJhdHRsZS50eHQiKTsKICAgaW5maWxlLmdldGxpbmUoaHMsNCk7CiAgIGluZmlsZS5jbG9zZSgpOwogICBoc2NvcmUgPSBhdG9pKGhzKTsKCgoKICAgLyogaW5pdGlhbGl6ZSBncmFwaGljcyBhbmQgbG9jYWwgdmFyaWFibGVzICovCiAgIGluaXRncmFwaCgmZ2RyaXZlciwgJmdtb2RlLCAiYzpcdGNcYmdpIik7CgogICAvKiByZWFkIHJlc3VsdCBvZiBpbml0aWFsaXphdGlvbiAqLwogICBlcnJvcmNvZGUgPSBncmFwaHJlc3VsdCgpOwogICBpZiAoZXJyb3Jjb2RlICE9IGdyT2spICAvKiBhbiBlcnJvciBvY2N1cnJlZCAqLwogICB7CiAgICAgIHByaW50ZigiR3JhcGhpY3MgZXJyb3I6ICVzCiIsIGdyYXBoZXJyb3Jtc2coZXJyb3Jjb2RlKSk7CiAgICAgIHByaW50ZigiUHJlc3MgYW55IGtleSB0byBoYWx0OiIpOwogICAgICBnZXRjaCgpOwogICAgICBleGl0KDEpOyAvKiB0ZXJtaW5hdGUgd2l0aCBhbiBlcnJvciBjb2RlICovCiAgIH0KICAgbWF4eCA9IGdldG1heHgoKTsKICAgbWF4eSA9IGdldG1heHkoKTsKICAgeSA9IDE2MDsKICAgeCA9IDgwOwogICBmb3IoaW50IGo9MDsgajw9MzsgaisrKQogICB7CglYW2ktal09eC1ibyooaisxKTsKCVlbaS1qXT15OwoKICAgfQoKICAgLy9ib2R5CgogICBzZXRmaWxsc3R5bGUoMSwyKTsKICAgYmFyKDEwLDEwLDIwLDIwKTsKICAgc2V0Y29sb3IoMCk7CiAgIHNldGxpbmVzdHlsZSgwLDEsMyk7CiAgIGxpbmUoOSw5LDIxLDIxKTsKICAgbGluZSg5LDIxLDIxLDkpOwogICBzaXplID0gaW1hZ2VzaXplKDEwLDEwLDIwLDIwKTsKICAgYm9keSA9IG1hbGxvYyhzaXplKTsKICAgZ2V0aW1hZ2UoMTAsMTAsMjAsMjAsYm9keSk7CiAgIGNsZWFyZGV2aWNlKCk7CgogICBzZXRjb2xvcigwKTsKICAgLy90YWlsMS1yaWdodAogICB0WzBdPTIwOyB0WzFdPTEwOwogICB0WzJdPTEwOyB0WzNdPTEwOwogICB0WzRdPTIwOyB0WzVdPTE1OwogICB0WzZdPTEwOyB0WzddPTIwOwogICB0WzhdPTIwOyB0WzldPTIxOwogICBmaWxscG9seSg1LCB0KTsKICAgc2l6ZSA9IGltYWdlc2l6ZSgxMCwxMCwyMCwyMSk7CiAgIHRhaWwxID0gbWFsbG9jKHNpemUpOwogICBnZXRpbWFnZSgxMCwxMCwyMCwyMSx0YWlsMSk7CiAgIGNsZWFyZGV2aWNlKCk7CgogICAvL3RhaWwyLWxlZnQKICAgdFswXT0xMDsgdFsxXT0xMDsKICAgdFsyXT0yMDsgdFszXT0xMDsKICAgdFs0XT0xMDsgdFs1XT0xNTsKICAgdFs2XT0yMDsgdFs3XT0yMDsKICAgdFs4XT0xMDsgdFs5XT0yMTsKICAgZmlsbHBvbHkoNSwgdCk7CiAgIHNpemUgPSBpbWFnZXNpemUoMTAsMTAsMjAsMjEpOwogICB0YWlsMiA9IG1hbGxvYyhzaXplKTsKICAgZ2V0aW1hZ2UoMTAsMTAsMjAsMjEsdGFpbDIpOwogICBjbGVhcmRldmljZSgpOwoKICAgLy90YWlsMy11cAogICB0WzBdPTEwOyB0WzFdPTIwOwogICB0WzJdPTEwOyB0WzNdPTEwOwogICB0WzRdPTE1OyB0WzVdPTIwOwogICB0WzZdPTIwOyB0WzddPTEwOwogICB0WzhdPTIwOyB0WzldPTIxOwogICBmaWxscG9seSg1LCB0KTsKICAgc2l6ZSA9IGltYWdlc2l6ZSgxMCwxMCwyMCwyMSk7CiAgIHRhaWwzID0gbWFsbG9jKHNpemUpOwogICBnZXRpbWFnZSgxMCwxMCwyMCwyMSx0YWlsMyk7CiAgIGNsZWFyZGV2aWNlKCk7CgogICAvL3RhaWw0LWRvd24KICAgdFswXT0xMDsgdFsxXT0xMDsKICAgdFsyXT0xMDsgdFszXT0yMTsKICAgdFs0XT0xNTsgdFs1XT0xMDsKICAgdFs2XT0yMDsgdFs3XT0yMTsKICAgdFs4XT0yMDsgdFs5XT0xMDsKICAgZmlsbHBvbHkoNSwgdCk7CiAgIHNpemUgPSBpbWFnZXNpemUoMTAsMTAsMjAsMjEpOwogICB0YWlsNCA9IG1hbGxvYyhzaXplKTsKICAgZ2V0aW1hZ2UoMTAsMTAsMjAsMjEsdGFpbDQpOwogICBjbGVhcmRldmljZSgpOwoKICAgLy9oZWFkMS1yaWdodAogICBzZXRsaW5lc3R5bGUoMSwxLDEpOwogICBzZXRjb2xvcigyKTsKICAgZmlsbGVsbGlwc2UoMTAsMTAsMTAsNSk7CiAgIHNldGNvbG9yKDQpOwogICAvL2V5ZXMKICAgZmlsbGVsbGlwc2UoMTUsNywxLDEpOwogICBmaWxsZWxsaXBzZSgxNSwxMywxLDEpOwogICBzaXplID0gaW1hZ2VzaXplKDEwLDUsMjAsMTUpOwogICBoZWFkMSA9IG1hbGxvYyhzaXplKTsKICAgZ2V0aW1hZ2UoMTAsNSwyMCwxNSxoZWFkMSk7CgogICAvL2hlYWQyLWxlZnQKICAgLy9leWVzCiAgIGZpbGxlbGxpcHNlKDUsNywxLDEpOwogICBmaWxsZWxsaXBzZSg1LDEzLDEsMSk7CiAgIHNpemUgPSBpbWFnZXNpemUoMCw1LDEwLDE1KTsKICAgaGVhZDIgPSBtYWxsb2Moc2l6ZSk7CiAgIGdldGltYWdlKDAsNSwxMCwxNSxoZWFkMik7CiAgIGNsZWFyZGV2aWNlKCk7CgogICAvL2hlYWQzLXVwCiAgIC8vZXllcwogICBzZXRjb2xvcigyKTsKICAgZmlsbGVsbGlwc2UoMTIsMTIsNSwxMCk7CiAgIHNldGNvbG9yKDQpOwogICBmaWxsZWxsaXBzZSg5LDYsMSwxKTsKICAgZmlsbGVsbGlwc2UoMTUsNiwxLDEpOwogICBzaXplID0gaW1hZ2VzaXplKDcsMiwxOCwxMik7CiAgIGhlYWQzID0gbWFsbG9jKHNpemUpOwogICBnZXRpbWFnZSg3LDIsMTgsMTIsaGVhZDMpOwoKCiAgIC8vaGVhZDQtZG93bgogICAvL2V5ZXMKICAgZmlsbGVsbGlwc2UoOSwxNywxLDEpOwogICBmaWxsZWxsaXBzZSgxNSwxNywxLDEpOwogICBzaXplID0gaW1hZ2VzaXplKDcsMTIsMTgsMjIpOwogICBoZWFkNCA9IG1hbGxvYyhzaXplKTsKICAgZ2V0aW1hZ2UoNywxMiwxOCwyMixoZWFkNCk7CiAgIGNsZWFyZGV2aWNlKCk7CgoKICAgLy9mb29kCiAgIHNldGNvbG9yKDE1KTsKICAgc2V0ZmlsbHN0eWxlKDEsMTUpOwogICBmaWxsZWxsaXBzZSgxMCwxMCwzLDUpOwogICBzaXplID0gaW1hZ2VzaXplKDUsMywxNSwxNyk7CiAgIGZvb2QgPSBtYWxsb2Moc2l6ZSk7CiAgIGdldGltYWdlKDUsMywxNSwxNyxmb29kKTsKICAgY2xlYXJkZXZpY2UoKTsKCiAgICAvKiByZXBlYXQgdW50aWwgYSBrZXkgaXMgcHJlc3NlZCAqLwoKICAgbWF4eD1nZXRtYXh4KCk7CiAgIG1heHk9Z2V0bWF4eSgpOwogICBzZXRsaW5lc3R5bGUoMCwxLDMpOwogICBzZXRjb2xvcig5KTsKICAgcmVjdGFuZ2xlKDAsMCxtYXh4LG1heHkpOwogICBzZXRsaW5lc3R5bGUoMCwxLDIpOwogICBsaW5lKG1heHgtMTUwLDAsbWF4eC0xNTAsbWF4eSk7CiAgIHNldGNvbG9yKDgpOwogICBzZXRmaWxsc3R5bGUoMSw4KTsKICAgYmFyKG1heHgtMTQ3LDMsbWF4eC0zLDYzKTsKICAgc2V0Y29sb3IoMTIpOwogICBpbnQgbWF6ZT0xOwogICBpZihtYXplPT0xKQogICB7CiAgIHNldGZpbGxzdHlsZSgxLDYpOwogICBiYXIoNCw0LG1heHgtMTU0LDE0KTsKICAgYmFyKDQsNCwxNCxtYXh5LTQpOwogICBiYXIoNCxtYXh5LTQsbWF4eC0xNTQsbWF4eS0xNCk7CiAgIGJhcihtYXh4LTE1NC0xMCw0LG1heHgtMTU0LG1heHktNCk7CiAgIH0KCgogICBzZXR0ZXh0c3R5bGUoMCwwLDEpOwogICBkZWxheSgzMDApOwogICBvdXR0ZXh0eHkobWF4eC0xMjUsMzAsIlJBVFRMRSBTTkFLRSIpOwogICBkZWxheSgzMDApOwogICBzZXRjb2xvcigxMSk7CiAgIHNldGxpbmVzdHlsZSgwLDEsMik7CiAgIHJlY3RhbmdsZShtYXh4LTE0NSw2NSxtYXh4LTUsMjA1KTsKICAgb3V0dGV4dHh5KG1heHgtMTI4LDcwLCJJTlNUUlVDVElPTlMiKTsKICAgZGVsYXkoMjAwKTsKICAgc2V0Y29sb3IoNik7CiAgIG91dHRleHR4eShtYXh4LTE0MCw5MCwiQ29tbWFuZHMgICAgIEtleSIpOwogICBkZWxheSgzMDApOwogICBzZXRjb2xvcig4KTsKICAgb3V0dGV4dHh5KG1heHgtMTQwLDExMCwiIE1vdmUgVXAgICAgICA4Iik7CiAgIGRlbGF5KDUwKTsKICAgb3V0dGV4dHh5KG1heHgtMTQwLDEzMCwiIE1vdmUgRG93biAgICA1Iik7CiAgICBkZWxheSg1MCk7CiAgIG91dHRleHR4eShtYXh4LTE0MCwxNTAsIiBNb3ZlIFJpZ2h0ICAgNiIpOwogICAgZGVsYXkoNTApOwogICBvdXR0ZXh0eHkobWF4eC0xNDAsMTcwLCIgTW92ZSBMZWZ0ICAgIDQiKTsKICAgIGRlbGF5KDUwKTsKICAgb3V0dGV4dHh5KG1heHgtMTQwLDE5MCwiIEV4aXQgICAgICAgICAwIik7CiAgIGRlbGF5KDIwMCk7CiAgIHNldGNvbG9yKDEyKTsKICAgc2V0bGluZXN0eWxlKDAsMSwyKTsKICAgcmVjdGFuZ2xlKG1heHgtMTQ1LDIxMCxtYXh4LTUsMzUwKTsKICAgc2V0Y29sb3IoMSk7CiAgIG91dHRleHR4eShtYXh4LTEzMCwyMjAsIlBsYXllcidzIE5hbWUiKTsKICAgc2V0Y29sb3IoMTUpOwogICBvdXR0ZXh0eHkobWF4eC0xMDAsMjMwLCJoaXJhbCIpOwogICBzZXRjb2xvcig0KTsKICAgZGVsYXkoMjAwKTsKICAgaXRvYShzY29yZSxzY29yLDEwKTsKICAgb3V0dGV4dHh5KG1heHgtMTQwLDI1MCwiU2NvcmUiKTsKICAgb3V0dGV4dHh5KG1heHgtNTAsMjUwLHNjb3IpOwogICBkZWxheSgyMDApOwogICBzZXRjb2xvcigxMCk7CiAgIG91dHRleHR4eShtYXh4LTE0MCwyODAsIkxldmVsIik7CiAgIGRlbGF5KDIwMCk7CiAgIHNldGNvbG9yKDEzKTsKICAgb3V0dGV4dHh5KG1heHgtMTQwLDMxMCwiTWF6ZSAgICAgICAgMSIpOwogICBkZWxheSgyMDApOwogICBzZXRjb2xvcigxNCk7CiAgIG91dHRleHR4eShtYXh4LTE0MCwzNDAsIkhpZ2ggU2NvcmUgICIpOwogICBvdXR0ZXh0eHkobWF4eC01MCwzNDAsaHMpOwoKICAgZm9yKGo9MDsgajw9MTAwMDsgaisrKQogICB7CglwdXRwaXhlbChyYW5kb20obWF4eC0xNTApLHJhbmRvbShtYXh5KSw2KTsKCWRlbGF5KDEpOwogICB9CgogICB3aGlsZSAoYSE9JzAnKQogICB7CgogICAgICAgLy8gcGxvdCBuZXcgaW1hZ2UKICAgICAgaWYoYT09JzYnKQoJICAgIHB1dGltYWdlKHgsIHksIGhlYWQxLCBYT1JfUFVUKTsKICAgICAgaWYoYT09JzQnKQoJICAgIHB1dGltYWdlKHgsIHksIGhlYWQyLCBYT1JfUFVUKTsKICAgICAgaWYoYT09JzgnKQoJICAgIHB1dGltYWdlKHgsIHksIGhlYWQzLCBYT1JfUFVUKTsKICAgICAgaWYoYT09JzUnKQoJICAgIHB1dGltYWdlKHgsIHksIGhlYWQ0LCBYT1JfUFVUKTsKCiAgICAgIGZvcihqPTA7IGo8azsgaisrKQogICAgICB7CgkgICBwdXRpbWFnZShYW2ktal0sIFlbaS1qXSwgYm9keSwgWE9SX1BVVCk7CiAgICAgIH0KCiAgICAgIGlmKChYW2ktai0xXS1YW2ktal0pPDAgICYmIChZW2ktai0xXS1ZW2ktal0pPT0wKQoJICAgIHB1dGltYWdlKFhbaS1qXSwgWVtpLWpdLCB0YWlsMSwgWE9SX1BVVCk7CgogICAgICBpZigoWFtpLWotMV0tWFtpLWpdKT4wICAmJiAoWVtpLWotMV0tWVtpLWpdKT09MCkKCSAgICBwdXRpbWFnZShYW2ktal0sIFlbaS1qXSwgdGFpbDIsIFhPUl9QVVQpOwoKICAgICAgaWYoKFhbaS1qLTFdLVhbaS1qXSk9PTAgICYmIChZW2ktai0xXS1ZW2ktal0pPDApCgkgICAgcHV0aW1hZ2UoWFtpLWpdLCBZW2ktal0sIHRhaWwzLCBYT1JfUFVUKTsKCiAgICAgIGlmKChYW2ktai0xXS1YW2ktal0pPT0wICAmJiAoWVtpLWotMV0tWVtpLWpdKT4wKQoJICAgIHB1dGltYWdlKFhbaS1qXSwgWVtpLWpdLCB0YWlsNCwgWE9SX1BVVCk7CgogICAgICBkZWxheShzcGVlZCk7CgogICAgICBpZihzZWNvbmQ9PTEpCiAgICAgIHsKCXNldGNvbG9yKDE1KTsKCW91dHRleHR4eShtYXh4LTE0MCwzNjAsIlByZXNzIEFueSBLZXkuLi4iKTsKCWdldGNoKCk7CglzZXRjb2xvcigwKTsKCW91dHRleHR4eShtYXh4LTE0MCwzNjAsIlByZXNzIEFueSBLZXkuLi4iKTsKCWE9JzYnOwoKCXNlY29uZD0yOwogICAgICB9CgoKICAgICAgaWYoZmlyc3Q9PTEpCiAgICAgIHsKCXNldGNvbG9yKDE1KTsKCW91dHRleHR4eShtYXh4LTE0MCwzNjAsIkNvbmdyYXR1bGF0aW9ucyAgIik7Cglzb3VuZCgxMDApOwoJZGVsYXkoMzAwKTsKCW5vc291bmQoKTsKCWdldGNoKCk7CglzZXRjb2xvcigwKTsKCW91dHRleHR4eShtYXh4LTE0MCwzNjAsIkNvbmdyYXR1bGF0aW9ucyAgIik7CglzZWNvbmQrKzsKCWZpcnN0PTI7CgogICAgICB9CgoJLy8gZXJhc2Ugb2xkIGltYWdlCiAgICAgIGlmKGE9PSc2JykKCSAgICBwdXRpbWFnZSh4LCB5LCBoZWFkMSwgWE9SX1BVVCk7CiAgICAgIGlmKGE9PSc0JykKCSAgICBwdXRpbWFnZSh4LCB5LCBoZWFkMiwgWE9SX1BVVCk7CiAgICAgIGlmKGE9PSc4JykKCSAgICBwdXRpbWFnZSh4LCB5LCBoZWFkMywgWE9SX1BVVCk7CiAgICAgIGlmKGE9PSc1JykKCSAgICBwdXRpbWFnZSh4LCB5LCBoZWFkNCwgWE9SX1BVVCk7CgoKICAgICAgZm9yKGo9MDsgajxrOyBqKyspCiAgICAgIHsKCSAgIHB1dGltYWdlKFhbaS1qXSwgWVtpLWpdLCBib2R5LCBYT1JfUFVUKTsKCiAgICAgIH0KCiAgICAgIGlmKChYW2ktai0xXS1YW2ktal0pPDAgICYmIChZW2ktai0xXS1ZW2ktal0pPT0wKQoJICAgIHB1dGltYWdlKFhbaS1qXSwgWVtpLWpdLCB0YWlsMSwgWE9SX1BVVCk7CgogICAgICBpZigoWFtpLWotMV0tWFtpLWpdKT4wICAmJiAoWVtpLWotMV0tWVtpLWpdKT09MCkKCSAgICBwdXRpbWFnZShYW2ktal0sIFlbaS1qXSwgdGFpbDIsIFhPUl9QVVQpOwoKICAgICAgaWYoKFhbaS1qLTFdLVhbaS1qXSk9PTAgICYmIChZW2ktai0xXS1ZW2ktal0pPDApCgkgICAgcHV0aW1hZ2UoWFtpLWpdLCBZW2ktal0sIHRhaWwzLCBYT1JfUFVUKTsKCiAgICAgIGlmKChYW2ktai0xXS1YW2ktal0pPT0wICAmJiAoWVtpLWotMV0tWVtpLWpdKT4wKQoJICAgIHB1dGltYWdlKFhbaS1qXSwgWVtpLWpdLCB0YWlsNCwgWE9SX1BVVCk7CgoKICAgICAgaWYoZj09MCkKICAgICAgewoJcHV0aW1hZ2UocjEscjIsZm9vZCxYT1JfUFVUKTsKCWY9MTsKICAgICAgfQoKICAgICAgei0tOwogICAgICBpZigoeD49cjEgJiYgeT49cjIgJiYgeDw9cjErMTAgJiYgeTw9cjIrMTApIHx8ICh4PD1yMSAmJiB5PD1yMiAmJgp4Pj1yMS0xMCAmJiB5Pj1yMi0xMCkgfHwgej09MCkKICAgICAgewoJaWYoeiE9MCkKCXsKCQlzb3VuZCg4MDApOwoJCWRlbGF5KDIwKTsKCQlzZXRjb2xvcigwKTsKCQlzY29yZSArPSAxMDsKCQlvdXR0ZXh0eHkobWF4eC01MCwyNTAsc2Nvcik7CgkJaXRvYShzY29yZSxzY29yLDEwKTsKCQlpZihzY29yZT5oc2NvcmUpCgkJewoJCQlzdHJjcHkoaHMsc2Nvcik7CgkJCXNldGZpbGxzdHlsZSgxLDEpOwoJCQliYXIobWF4eC0xNDAsMzM3LG1heHgtMjAsMzQ4KTsKCQkJc2V0Y29sb3IoMTQpOwoJCQlvdXR0ZXh0eHkobWF4eC01MCwzNDAsaHMpOwoJCQlvdXR0ZXh0eHkobWF4eC0xNDAsMzQwLCJIaWdoIFNjb3JlICAiKTsKCQkJaWYoZmlyc3Q9PTApCgkJCXsKCQkJZmlyc3Q9MTsKCQkJfQoJCX0KCQlzZXRjb2xvcig0KTsKCQlvdXR0ZXh0eHkobWF4eC01MCwyNTAsc2Nvcik7CgkJaysrOwoJbm9zb3VuZCgpOwoJfQoJej0xMDA7CglwdXRpbWFnZShyMSxyMixmb29kLFhPUl9QVVQpOwoJcmVwcjE6CglyMT1yYW5kb20oNDUwKTsKCSAgICBpZihyMTw1MCkKCSAgICAgICBnb3RvIHJlcHIxOwoJcmVwcjI6CglyMj1yYW5kb20oNDAwKTsKCSAgICBpZihyMjw1MCkKCQlnb3RvIHJlcHIyOwoKCWY9MDsKICAgICAgfQoKCiAgICAgIGkrKzsKICAgICAgWFtpXT14OwogICAgICBZW2ldPXk7CgogICAgICBiPWE7CiAgICAgIGlmKGtiaGl0KCkpCiAgICAgIHsKCQlyZXA6CgkJYT1nZXRjaGUoKTsKCgkJaWYoKGI9PSc2JyAmJiBhPT0nNCcpIHx8IChiPT0nNCcgJiYgYT09JzYnKSkKCQkJYT1iOwoKCQlpZigoYj09JzgnICYmIGE9PSc1JykgfHwgKGI9PSc1JyAmJiBhPT0nOCcpKQoJCQlhPWI7CgoJCWlmKGEhPSc2JyAmJiBhIT0nNCcgJiYgYSE9JzgnICYmIGEhPScwJyAmJiBhIT0nNScpCgkJCWE9YjsKICAgICAgfQoKIC8qICAgICBpZih4Pm1heHgtMTcwKQoJeD0wOwoKICAgICAgaWYoeT5tYXh5KQoJeT0wOyovCgogICAgICBpZihhPT0nOCcpCgl5IC09IGJvOwoKICAgICAgaWYoYT09JzUnKQoJeSArPSBibzsKCiAgICAgIGlmKGE9PSc0JykKCXggLT0gYm87CgogICAgICBpZihhPT0nNicpCgl4ICs9IGJvOwoKICAgICAgZm9yKGo9aSsxOyBqPGktazsgai0tKQogICAgICB7CglpZigoWVtpXT49WVtqXSAmJiBZW2ldPD1ZW2pdKzEwKSB8fCAoWVtpXTw9WVtqXSAmJiBZW2ldPj1YW2pdLTEwKSkKCXsKCQlpZigoWFtpXT49WFtqXSAmJiBYW2ldPD1YW2pdKzEwKSB8fCAoWFtpXTw9WFtqXSAmJiBYW2ldPj1YW2pdLTEwKSkKCQl7CgkJCWE9JzAnOwoJCX0KCgkJIG91dHRleHR4eShtYXh4LTE0MCwzNjAsIkMgIik7CgoKCX0KCglpZigoWFtpXT49WFtqXSAmJiBYW2ldPD1YW2pdKzEwKSB8fCAoWFtpXTw9WFtqXSAmJiBYW2ldPj1YW2pdLTEwKSkKCXsKCQlpZigoWVtpXT49WVtqXSAmJiBZW2ldPD1ZW2pdKzEwKSB8fCAoWVtpXTw9WVtqXSAmJiBZW2ldPj1YW2pdLTEwKSkKCQl7CgkJCWE9JzAnOwoJCX0KCgkJCW91dHRleHR4eShtYXh4LTE0MCwzNjAsIkMgICIpOwoJfQoKICAgICAgIH0KCi8qICAgICAgZm9yKGo9aTsgajxpLWs7IGotLSkKICAgICAgewoJaWYoKHk+PVlbal0gJiYgeTw9WVtqXSsxMCkgfHwgKHk8PVlbal0gJiYgeT49WVtqXS0xMCkpCgl7CgkJaWYoKHg+PVhbal0gJiYgeDw9WFtqXSsxMCkgfHwgKHg8PVhbal0gJiYgeD49WFtqXS0xMCkpCgkJewoJCQlhPSc1JzsKCQl9Cgl9CgoJaWYoKHg+PVhbal0gJiYgeDw9WFtqXSsxMCkgfHwgKHg8PVhbal0gJiYgeD49WFtqXS0xMCkpCgl7CgkJaWYoKHk+PVlbal0gJiYgeTw9WVtqXSsxMCkgfHwgKHk8PVlbal0gJiYgeT49WVtqXS0xMCkpCgkJewoJCQlhPSc1JzsKCQl9Cgl9CglpZihqPT0wKQoJCWJyZWFrOwogICAgICB9ICAgICAgKi8KCgogIC8qCWlmKHg8PTApCgl4PW1heHgtMTcwOwoKCWlmKHk8PTApCgl5PW1heHk7Ki8KCglpZihtYXplPT0xKQoJewoJCWlmKHg8PTE0IHx8IHg+PW1heHgtMTg0IHx8IHk8PTE0IHx8IHk+PW1heHktMTQpCgkJewoJCSAgIGE9JzAnOwoJCX0KCX0KCiAgIH0KCiAgIGlmKHNjb3JlPmhzY29yZSkKICAgewoJb2ZzdHJlYW0gb25maWxlKCJjOlx0Y1xiaW5ccmF0dGxlLnR4dCIpOwoJb25maWxlPDxzY29yOwoJb25maWxlLmNsb3NlKCk7CiAgIH0KCiAgIHNldGNvbG9yKDE1KTsKICAgb3V0dGV4dHh5KG1heHgtMTQwLDM5MCwiICAgIEdhbWVvdmVyIik7CiAgIHNvdW5kKDEwMCk7CiAgIGRlbGF5KDQwMCk7CiAgIG5vc291bmQoKTsKICAgZ2V0Y2goKTsKICAgLyogY2xlYW4gdXAgKi8KICAgZnJlZShib2R5KTsKICAgY2xvc2VncmFwaCgpOwoKfQ==