#include <stdio.h>
#define MAX 20
#define MAX_K 3
typedef struct Peca{
int top[3];
int bot[3];
int left[3];
int right[3];
int pos[2];
int up;
}Peca;
int recurcao(int score, int a, int x, int y);
int check(struct Peca *temp,int z);
struct Peca* rotate(struct Peca *temp);
struct Peca* createPeca( int a,int b,int c,int x,int y);
int npecas=0;
struct Peca *pecas[20];
int input[20][4];
int todas;
int main(void) {
int a, b, c;
int res=0, restemp;
struct Peca * testeR;
int cnt=0;
while(scanf("%d %d %d",&a
, &b
, &c
) != EOF
){ input[cnt][0]=a;
input[cnt][1]=b;
input[cnt][2]=c;
input[cnt][3]=0;
cnt=cnt+1;
}
todas=cnt;
int i,j;
for(i=0;i<todas;i++){
for(j=0;j<3;j++){
}
}
// int temp = recurcao(0,2,1,1);
for(i=0;i<todas;i++){
restemp = recurcao(0,i,0,0);
if (restemp>res){
res=restemp;
}
}
return 0;
}
int recurcao(int score, int a, int x, int y){
int i, k;
int scoreTemp,aux,aux1,aux2;
input[a][4]=1;
struct Peca *nova = createPeca(input[a][0],input[a][1],input[a][2],x,y);
printf("PECA NUMERO %d\n", a
); //printf("top %d %d %d\n", nova->top[0], nova->top[1], nova->top[2]);
/*printf("right %d %d %d\n", nova->right[0], nova->right[1], nova->right[2]);
printf("left %d %d %d\n", nova->left[0], nova->left[1], nova->left[2]);
printf("bot %d %d %\n", nova->bot[0], nova->bot[1], nova->bot[2]);
printf("pos %d %d\n", nova->pos[0], nova->pos[1], nova->pos[2]);
printf("up %d\n", nova->up);*/
aux=check(nova,0);
if(aux==-1){
return -1;
}
/*
pecas[npecas] = temp;
npecas++;
if(npecas == todas){
return score;
}
for(i=0;i<npecas;i++){
if (pecas[i]->up){
if (pecas[i]->bot[2]==0){
aux2 = pecas[i]->bot[0];
aux1 = pecas[i]->bot[1];
for (k=0;k<todas;k++){
if(input[k][2]==0){
if(((input[k][0]==aux1) && (input[k][1]==aux2))
|| ((input[k][1]==aux1) && (input[k][2]==aux2))
|| ((input[k][2]==aux1) && (input[k][0]==aux2)) ){
scoretemp = recurcao(k,pecas[i]->pos[0]-1,pecas[i]->pos[1]);
if(scoreTemp>score){
score=scoreTemp;
}
}
}
}
}
if (pecas[i]->left[2]==0){
aux2 = pecas[i]->left[0];
aux1 = pecas[i]->left[1];
for(k=0;k<todas;k++){
if(input[k][2]==0){
if(((input[k][0]==aux1) && (input[k][1]==aux2)) ||
((input[k][1]==aux1) && (input[k][2]==aux2)) ||
((input[k][2]==aux1) && (input[k][0]==aux2))){
score = recurcao(k,pecas[i]->pos[0], pecas[i]->pos[1]-1);
}
}
}
}
if(pecas[i]->right[2]==0){
aux1 = pecas[i]->right[0];
aux2 = pecas[i]->right[1];
for(k=0;k<todas;k++){
if(input[k][2]==0){
if(((input[k][0]==aux1) && (input[k][1]==aux2)) ||
((input[k][1]==aux1) && (input[k][2]==aux2)) ||
((input[k][2]==aux1) && (input[k][0]==aux2)) ){
score = recurcao(k,pecas[i]->pos[0], pecas[i]->pos[1]+1);
}
}
}
}
if (pecas[i]->top[2]==0){
aux1 = pecas[i]->top[0];
for(k=0;k<todas;k++){
if(input[k][2]==0){
if(input[k][0]==aux1){
score = recurcao(k,pecas[i]->pos[0]+1, pecas[i]->pos[1]);
}
}
}
}
}
else{
if (pecas[i]->bot[2]==0){
aux1 = pecas[i]->bot[0];
for(k=0;k<todas;k++){
if(input[k][2]==0){
if(input[k][0]==aux1){
score = recurcao(k,pecas[i]->pos[0]-1, pecas[i]->pos[1]);
}
}
}
}
if (pecas[i]->left[2]==0){
aux2 = pecas[i]->left[0];
aux1 = pecas[i]->left[1];
for(k=0;k<todas;k++){
if(input[k][2]==0){
if(((input[k][0]==aux1) && (input[k][1]==aux2)) ||
((input[k][1]==aux1) && (input[k][2]==aux2)) ||
((input[k][2]==aux1) && (input[k][0]==aux2))){
score = recurcao(k,pecas[i]->pos[0], pecas[i]->pos[1]-1);
}
}
}
}
if(pecas[i]->right[2]==0){
aux1 = pecas[i]->right[0];
aux2 = pecas[i]->right[1];
for(k=0;k<todas;k++){
if(input[k][2]==0){
if(((input[k][0]==aux1) && (input[k][1]==aux2)) ||
((input[k][1]==aux1) && (input[k][2]==aux2)) ||
((input[k][2]==aux1) && (input[k][0]==aux2)) ){
score = recurcao(k,pecas[i]->pos[0], pecas[i]->pos[1]+1);
}
}
}
}
if (pecas[i]->top[2]==0){
aux2 = pecas[i]->top[0];
aux1 = pecas[i]->top[1];
for (k=0;k<todas;k++){
if(input[k][2]==0){
if(((input[k][0]==aux1) && (input[k][1]==aux2)) || ((input[k][1]==aux1) && (input[k][2]==aux2)) || ((input[k][2]==aux1) && (input[k][0]==aux2)) ){
score = recurcao(k,pecas[i]->pos[0]+1,pecas[i]->pos[1]);
}
}
}
}
}
}
input[a][4]=0;
*/
//pecas[npecas].free; dar free a estutura da ultima peca
return score;
}
int check(struct Peca *temp,int z){
int i;
if(z==3)
return 0;
if (temp->up){
for(i=0;i<npecas;i++){
if(((pecas[i]->pos[0])==(temp->pos[0]+1)) && ((pecas[i]->pos[1])==(temp->pos[1]))){
if((temp->top[0])!=(pecas[i]->bot[0])){
rotate(temp);
return check(temp,z+1);
}
}/*
if(((pecas[i]->pos[0]==temp->pos[0]-1) && (pecas[i]->pos[1]==temp->pos[1]))){
if(((temp->bot[0])!=(pecas[i]->top[1])) || ((temp->bot[1])!=(pecas[i]->top[0]))){
rotate(temp);
return check(temp,z+1);
}
}
if((pecas[i]->pos[0]==temp->pos[0]) && (pecas[i]->pos[1]==temp->pos[1]-1)){
if(((temp->left[0])!=(pecas[i]->right[1])) || ((temp->left[1])!=(pecas[i]->right[0]))){
rotate(temp);
return check(temp,z+1);
}
}
if((pecas[i]->pos[0]==temp->pos[0]) && (pecas[i]->pos[1]==temp->pos[1]+1)){
if(((temp->right[0])!=(pecas[i]->left[1])) || ((temp->right[1])!=(pecas[i]->left[0]))){
rotate(temp);
return check(temp,z+1);
}
}
*/}
}/*else{
for(i=0;i<npecas;i++){
if(((pecas[i]->pos[0])==(temp->pos[0]+1)) && ((pecas[i]->pos[1])==(temp->pos[1]))){
if((temp->top[0])!=(pecas[i]->bot[0])){
//rotate(temp);
return check(temp,z+1);
}
}
if((pecas[i]->pos[0]==temp->pos[0]-1) && (pecas[i]->pos[1]==temp->pos[1])){
if(((temp->bot[0])!=(pecas[i]->top[1])) || ((temp->bot[1])!=(pecas[i]->top[0]))){
//rotate(temp);
return check(temp,z+1);
}
}
if((pecas[i]->pos[0]==temp->pos[0]) && (pecas[i]->pos[1]==temp->pos[1])-1){
if(((temp->left[0])!=(pecas[i]->right[1])) || ((temp->left[1])!=(pecas[i]->right[0]))){
//rotate(temp);
return check(temp,z+1);
}
}
if((pecas[i]->pos[0]==temp->pos[0]) && (pecas[i]->pos[1]==temp->pos[1])+1){
if(((temp->right[0])!=(pecas[i]->left[1])) || ((temp->right[1])!=(pecas[i]->left[0]))){
//rotate(temp);
return check(temp,z+1);
}
}
}
}*/
return 0;
}
struct Peca * rotate(struct Peca *temp){
int aux[3];
struct Peca *nova;
if(temp->up){
aux[0] = temp->left[0];
aux[1] = temp->right[0];
aux[2] = temp->bot[0];
//nova = createPeca(aux[0],aux[1],aux[2],temp->pos[0],temp->pos[1]);
}else{
aux[0] = temp->top[0];
aux[1] = temp->right[0];
aux[2] = temp->left[0];
//nova = createPeca(aux[0],aux[1],aux[2],temp->pos[0],temp->pos[1]);
}
return nova;
}
struct Peca* createPeca( int a,int b,int c,int x,int y){
printf("a: %d b: %d c:%d d: %d %d\n",a
,b
,c
,x
,y
); struct Peca* temp;
if((x+y)%2==0){
temp->up = 1;
temp->bot[0] = a;
temp->bot[1] = b;
temp->bot[2] = 0;
temp->left[0] = b;
temp->left[1] = c;
temp->left[2] = 0;
printf("%d\n" ,temp
->left
[2]); temp->right[0] = c;
temp->right[1] = a;
temp->right[2] = 0;
printf("%d\n" ,temp
->right
[2]); temp->top[0] = c;
}else{
temp->up = 0;
//("%d\n",temp->up);
temp->left[0] = a;
temp->left[1] = b;
temp->left[2] = 0;
temp->top[0] = b;
temp->top[1] = c;
temp->top[2] = 0;
temp->right[0] = c;
temp->right[1] = a;
temp->right[2] = 0;
temp->bot[0] = c;
}
temp->pos[0] = x;
temp->pos[1] = y;
return temp;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNkZWZpbmUgTUFYIDIwCiNkZWZpbmUgTUFYX0sgMwogCnR5cGVkZWYgc3RydWN0IFBlY2F7CiAJaW50IHRvcFszXTsKIAlpbnQgYm90WzNdOwogCWludCBsZWZ0WzNdOwogCWludCByaWdodFszXTsKIAlpbnQgcG9zWzJdOyAJCglpbnQgdXA7CQkKfVBlY2E7CiAKaW50IHJlY3VyY2FvKGludCBzY29yZSwgaW50IGEsIGludCB4LCBpbnQgeSk7CmludCBjaGVjayhzdHJ1Y3QgUGVjYSAqdGVtcCxpbnQgeik7CnN0cnVjdCBQZWNhKiByb3RhdGUoc3RydWN0IFBlY2EgKnRlbXApOwpzdHJ1Y3QgUGVjYSogY3JlYXRlUGVjYSggaW50IGEsaW50IGIsaW50IGMsaW50IHgsaW50IHkpOwogCiAKaW50IG5wZWNhcz0wOyAKc3RydWN0IFBlY2EgKnBlY2FzWzIwXTsKaW50IGlucHV0WzIwXVs0XTsKaW50IHRvZGFzOwogCiAKaW50IG1haW4odm9pZCkgewoJaW50IGEsIGIsIGM7CglpbnQgcmVzPTAsIHJlc3RlbXA7CglzdHJ1Y3QgUGVjYSAqIHRlc3RlUjsKCWludCBjbnQ9MDsKCXdoaWxlKHNjYW5mKCIlZCAlZCAlZCIsJmEsICZiLCAmYyApICE9IEVPRil7CgkJaW5wdXRbY250XVswXT1hOwoJCWlucHV0W2NudF1bMV09YjsKCQlpbnB1dFtjbnRdWzJdPWM7CgkJaW5wdXRbY250XVszXT0wOwoKCQljbnQ9Y250KzE7Cgl9CiAKCXByaW50ZigiRkRTIik7CiAKIAoJdG9kYXM9Y250OwoJaW50IGksajsKIAogCglmb3IoaT0wO2k8dG9kYXM7aSsrKXsKCQlmb3Ioaj0wO2o8MztqKyspewoJCQlwcmludGYoIiVkIixpbnB1dFtpXVtqXSk7CgkJfQoJCXByaW50ZigiXG4iKTsKCX0KIAovLwlpbnQgdGVtcCA9IHJlY3VyY2FvKDAsMiwxLDEpOwogCiAKCWZvcihpPTA7aTx0b2RhcztpKyspewoJCXJlc3RlbXAgPSByZWN1cmNhbygwLGksMCwwKTsKCQlpZiAocmVzdGVtcD5yZXMpewoJCQlyZXM9cmVzdGVtcDsKCQl9Cgl9CglwcmludGYoIiVkXG4iLCByZXN0ZW1wKTsKCXJldHVybiAwOwogCn0KIAppbnQgcmVjdXJjYW8oaW50IHNjb3JlLCBpbnQgYSwgaW50IHgsIGludCB5KXsKCWludCBpLCBrOwoJaW50IHNjb3JlVGVtcCxhdXgsYXV4MSxhdXgyOwoJaW5wdXRbYV1bNF09MTsKCXN0cnVjdCBQZWNhICpub3ZhID0gY3JlYXRlUGVjYShpbnB1dFthXVswXSxpbnB1dFthXVsxXSxpbnB1dFthXVsyXSx4LHkpOwogCglwcmludGYoIlBFQ0EgTlVNRVJPICVkXG4iLCBhKTsKCS8vcHJpbnRmKCJ0b3AgJWQgJWQgJWRcbiIsIG5vdmEtPnRvcFswXSwgbm92YS0+dG9wWzFdLCBub3ZhLT50b3BbMl0pOwoJLypwcmludGYoInJpZ2h0ICVkICVkICVkXG4iLCBub3ZhLT5yaWdodFswXSwgbm92YS0+cmlnaHRbMV0sIG5vdmEtPnJpZ2h0WzJdKTsKCXByaW50ZigibGVmdCAlZCAlZCAlZFxuIiwgbm92YS0+bGVmdFswXSwgbm92YS0+bGVmdFsxXSwgbm92YS0+bGVmdFsyXSk7CglwcmludGYoImJvdCAlZCAlZCAlXG4iLCBub3ZhLT5ib3RbMF0sIG5vdmEtPmJvdFsxXSwgbm92YS0+Ym90WzJdKTsKCXByaW50ZigicG9zICVkICVkXG4iLCBub3ZhLT5wb3NbMF0sIG5vdmEtPnBvc1sxXSwgbm92YS0+cG9zWzJdKTsKCXByaW50ZigidXAgJWRcbiIsIG5vdmEtPnVwKTsqLwogCiAKCWF1eD1jaGVjayhub3ZhLDApOwoJaWYoYXV4PT0tMSl7CgkJcmV0dXJuIC0xOwoJfQoJLyoKCXBlY2FzW25wZWNhc10gPSB0ZW1wOwoJbnBlY2FzKys7CglpZihucGVjYXMgPT0gdG9kYXMpewoJCXJldHVybiBzY29yZTsKCX0KIAoJZm9yKGk9MDtpPG5wZWNhcztpKyspewoJCWlmIChwZWNhc1tpXS0+dXApewoJCQlpZiAocGVjYXNbaV0tPmJvdFsyXT09MCl7IAoJCQkJYXV4MiA9IHBlY2FzW2ldLT5ib3RbMF07CgkJCQlhdXgxID0gcGVjYXNbaV0tPmJvdFsxXTsKCQkJCWZvciAoaz0wO2s8dG9kYXM7aysrKXsKCQkJCQlpZihpbnB1dFtrXVsyXT09MCl7IAoJCQkJCQlpZigoKGlucHV0W2tdWzBdPT1hdXgxKSAmJiAoaW5wdXRba11bMV09PWF1eDIpKSAKCQkJCQkJfHwgKChpbnB1dFtrXVsxXT09YXV4MSkgJiYgKGlucHV0W2tdWzJdPT1hdXgyKSkgCgkJCQkJCXx8ICgoaW5wdXRba11bMl09PWF1eDEpICYmIChpbnB1dFtrXVswXT09YXV4MikpICl7CgkJCQkJCQlzY29yZXRlbXAgPSByZWN1cmNhbyhrLHBlY2FzW2ldLT5wb3NbMF0tMSxwZWNhc1tpXS0+cG9zWzFdKTsKCQkJCQkJCWlmKHNjb3JlVGVtcD5zY29yZSl7CgkJCQkJCQkJc2NvcmU9c2NvcmVUZW1wOwogCgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQkJaWYgKHBlY2FzW2ldLT5sZWZ0WzJdPT0wKXsKCQkJCWF1eDIgPSBwZWNhc1tpXS0+bGVmdFswXTsKCQkJCWF1eDEgPSBwZWNhc1tpXS0+bGVmdFsxXTsgCiAKCQkJCWZvcihrPTA7azx0b2RhcztrKyspewoJCQkJCWlmKGlucHV0W2tdWzJdPT0wKXsKCQkJCQkJaWYoKChpbnB1dFtrXVswXT09YXV4MSkgJiYgKGlucHV0W2tdWzFdPT1hdXgyKSkgfHwKCQkJCQkJCSgoaW5wdXRba11bMV09PWF1eDEpICYmIChpbnB1dFtrXVsyXT09YXV4MikpIHx8CgkJCQkJCQkoKGlucHV0W2tdWzJdPT1hdXgxKSAmJiAoaW5wdXRba11bMF09PWF1eDIpKSl7CgkJCQkJCQlzY29yZSA9IHJlY3VyY2FvKGsscGVjYXNbaV0tPnBvc1swXSwgcGVjYXNbaV0tPnBvc1sxXS0xKTsKIAoJCQkJCQl9CgkJCQkJfQoJCQkJfQogCgkJCX0KIAoJCQlpZihwZWNhc1tpXS0+cmlnaHRbMl09PTApewoJCQkJYXV4MSA9IHBlY2FzW2ldLT5yaWdodFswXTsgCgkJCQlhdXgyID0gcGVjYXNbaV0tPnJpZ2h0WzFdOwogCgkJCQlmb3Ioaz0wO2s8dG9kYXM7aysrKXsKCQkJCQlpZihpbnB1dFtrXVsyXT09MCl7CgkJCQkJCWlmKCgoaW5wdXRba11bMF09PWF1eDEpICYmIChpbnB1dFtrXVsxXT09YXV4MikpIHx8CgkJCQkJCQkoKGlucHV0W2tdWzFdPT1hdXgxKSAmJiAoaW5wdXRba11bMl09PWF1eDIpKSB8fAoJCQkJCQkJKChpbnB1dFtrXVsyXT09YXV4MSkgJiYgKGlucHV0W2tdWzBdPT1hdXgyKSkJKXsKCQkJCQkJCXNjb3JlID0gcmVjdXJjYW8oayxwZWNhc1tpXS0+cG9zWzBdLCBwZWNhc1tpXS0+cG9zWzFdKzEpOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQogCiAKCQkJfQoJCQlpZiAocGVjYXNbaV0tPnRvcFsyXT09MCl7CiAKCQkJCWF1eDEgPSBwZWNhc1tpXS0+dG9wWzBdOyAKIAoJCQkJZm9yKGs9MDtrPHRvZGFzO2srKyl7CgkJCQkJCWlmKGlucHV0W2tdWzJdPT0wKXsKCQkJCQkJCWlmKGlucHV0W2tdWzBdPT1hdXgxKXsKCQkJCQkJCQlzY29yZSA9IHJlY3VyY2FvKGsscGVjYXNbaV0tPnBvc1swXSsxLCBwZWNhc1tpXS0+cG9zWzFdKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJfQoJCQl9CiAKCQl9CgkJZWxzZXsKCQkJaWYgKHBlY2FzW2ldLT5ib3RbMl09PTApewoJCQkJYXV4MSA9IHBlY2FzW2ldLT5ib3RbMF07IAoJCQkJZm9yKGs9MDtrPHRvZGFzO2srKyl7CgkJCQkJCWlmKGlucHV0W2tdWzJdPT0wKXsKCQkJCQkJCWlmKGlucHV0W2tdWzBdPT1hdXgxKXsKCQkJCQkJCQlzY29yZSA9IHJlY3VyY2FvKGsscGVjYXNbaV0tPnBvc1swXS0xLCBwZWNhc1tpXS0+cG9zWzFdKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJfQogCgkJCX0KCQkJaWYgKHBlY2FzW2ldLT5sZWZ0WzJdPT0wKXsKCQkJCWF1eDIgPSBwZWNhc1tpXS0+bGVmdFswXTsKCQkJCWF1eDEgPSBwZWNhc1tpXS0+bGVmdFsxXTsgCiAKCQkJCWZvcihrPTA7azx0b2RhcztrKyspewoJCQkJCWlmKGlucHV0W2tdWzJdPT0wKXsKCQkJCQkJaWYoKChpbnB1dFtrXVswXT09YXV4MSkgJiYgKGlucHV0W2tdWzFdPT1hdXgyKSkgfHwKCQkJCQkJCSgoaW5wdXRba11bMV09PWF1eDEpICYmIChpbnB1dFtrXVsyXT09YXV4MikpIHx8CgkJCQkJCQkoKGlucHV0W2tdWzJdPT1hdXgxKSAmJiAoaW5wdXRba11bMF09PWF1eDIpKSl7CgkJCQkJCQlzY29yZSA9IHJlY3VyY2FvKGsscGVjYXNbaV0tPnBvc1swXSwgcGVjYXNbaV0tPnBvc1sxXS0xKTsKIAoJCQkJCQl9CgkJCQkJfQoJCQkJfQogCgkJCX0KIAoJCQlpZihwZWNhc1tpXS0+cmlnaHRbMl09PTApewoJCQkJYXV4MSA9IHBlY2FzW2ldLT5yaWdodFswXTsgCgkJCQlhdXgyID0gcGVjYXNbaV0tPnJpZ2h0WzFdOwogCgkJCQlmb3Ioaz0wO2s8dG9kYXM7aysrKXsKCQkJCQlpZihpbnB1dFtrXVsyXT09MCl7CgkJCQkJCWlmKCgoaW5wdXRba11bMF09PWF1eDEpICYmIChpbnB1dFtrXVsxXT09YXV4MikpIHx8CgkJCQkJCQkoKGlucHV0W2tdWzFdPT1hdXgxKSAmJiAoaW5wdXRba11bMl09PWF1eDIpKSB8fAoJCQkJCQkJKChpbnB1dFtrXVsyXT09YXV4MSkgJiYgKGlucHV0W2tdWzBdPT1hdXgyKSkJKXsKCQkJCQkJCXNjb3JlID0gcmVjdXJjYW8oayxwZWNhc1tpXS0+cG9zWzBdLCBwZWNhc1tpXS0+cG9zWzFdKzEpOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQogCiAKCQkJfQoJCQlpZiAocGVjYXNbaV0tPnRvcFsyXT09MCl7CiAKIAoJCQkJYXV4MiA9IHBlY2FzW2ldLT50b3BbMF07CgkJCQlhdXgxID0gcGVjYXNbaV0tPnRvcFsxXTsKIAoJCQkJZm9yIChrPTA7azx0b2RhcztrKyspewoJCQkJCWlmKGlucHV0W2tdWzJdPT0wKXsKCQkJCQkJaWYoKChpbnB1dFtrXVswXT09YXV4MSkgJiYgKGlucHV0W2tdWzFdPT1hdXgyKSkgfHwgKChpbnB1dFtrXVsxXT09YXV4MSkgJiYgKGlucHV0W2tdWzJdPT1hdXgyKSkgfHwgKChpbnB1dFtrXVsyXT09YXV4MSkgJiYgKGlucHV0W2tdWzBdPT1hdXgyKSkgKXsKCQkJCQkJCXNjb3JlID0gcmVjdXJjYW8oayxwZWNhc1tpXS0+cG9zWzBdKzEscGVjYXNbaV0tPnBvc1sxXSk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9CglpbnB1dFthXVs0XT0wOwoJKi8KCS8vcGVjYXNbbnBlY2FzXS5mcmVlOyBkYXIgZnJlZSBhIGVzdHV0dXJhIGRhIHVsdGltYSBwZWNhCiAKCXJldHVybiBzY29yZTsKfQogCmludCBjaGVjayhzdHJ1Y3QgUGVjYSAqdGVtcCxpbnQgeil7CiAKCWludCBpOwoJaWYoej09MykKCQlyZXR1cm4gMDsKIAoJaWYgKHRlbXAtPnVwKXsgCgkJZm9yKGk9MDtpPG5wZWNhcztpKyspewoJCQlpZigoKHBlY2FzW2ldLT5wb3NbMF0pPT0odGVtcC0+cG9zWzBdKzEpKSAmJiAoKHBlY2FzW2ldLT5wb3NbMV0pPT0odGVtcC0+cG9zWzFdKSkpeyAKCQkJCWlmKCh0ZW1wLT50b3BbMF0pIT0ocGVjYXNbaV0tPmJvdFswXSkpewoJCQkJCXJvdGF0ZSh0ZW1wKTsKCQkJCQlyZXR1cm4gY2hlY2sodGVtcCx6KzEpOwoJCQkJfQoJCQl9LyoKCQkJaWYoKChwZWNhc1tpXS0+cG9zWzBdPT10ZW1wLT5wb3NbMF0tMSkgJiYgKHBlY2FzW2ldLT5wb3NbMV09PXRlbXAtPnBvc1sxXSkpKXsgCgkJCQlpZigoKHRlbXAtPmJvdFswXSkhPShwZWNhc1tpXS0+dG9wWzFdKSkgfHwgKCh0ZW1wLT5ib3RbMV0pIT0ocGVjYXNbaV0tPnRvcFswXSkpKXsKCQkJCQlyb3RhdGUodGVtcCk7CgkJCQkJcmV0dXJuIGNoZWNrKHRlbXAseisxKTsKCQkJCX0KCQkJfQoJCQlpZigocGVjYXNbaV0tPnBvc1swXT09dGVtcC0+cG9zWzBdKSAmJiAocGVjYXNbaV0tPnBvc1sxXT09dGVtcC0+cG9zWzFdLTEpKXsgCgkJCQlpZigoKHRlbXAtPmxlZnRbMF0pIT0ocGVjYXNbaV0tPnJpZ2h0WzFdKSkgfHwgKCh0ZW1wLT5sZWZ0WzFdKSE9KHBlY2FzW2ldLT5yaWdodFswXSkpKXsKCQkJCQlyb3RhdGUodGVtcCk7CgkJCQkJcmV0dXJuIGNoZWNrKHRlbXAseisxKTsKCQkJCX0KCQkJfQoJCQlpZigocGVjYXNbaV0tPnBvc1swXT09dGVtcC0+cG9zWzBdKSAmJiAocGVjYXNbaV0tPnBvc1sxXT09dGVtcC0+cG9zWzFdKzEpKXsgCgkJCQlpZigoKHRlbXAtPnJpZ2h0WzBdKSE9KHBlY2FzW2ldLT5sZWZ0WzFdKSkgfHwgKCh0ZW1wLT5yaWdodFsxXSkhPShwZWNhc1tpXS0+bGVmdFswXSkpKXsKCQkJCQlyb3RhdGUodGVtcCk7CgkJCQkJcmV0dXJuIGNoZWNrKHRlbXAseisxKTsKCQkJCX0KCQkJfQogCgkJKi99Cgl9LyplbHNlewoJCWZvcihpPTA7aTxucGVjYXM7aSsrKXsKCQkJaWYoKChwZWNhc1tpXS0+cG9zWzBdKT09KHRlbXAtPnBvc1swXSsxKSkgJiYgKChwZWNhc1tpXS0+cG9zWzFdKT09KHRlbXAtPnBvc1sxXSkpKXsgCgkJCQlpZigodGVtcC0+dG9wWzBdKSE9KHBlY2FzW2ldLT5ib3RbMF0pKXsKCQkJCQkvL3JvdGF0ZSh0ZW1wKTsKCQkJCQlyZXR1cm4gY2hlY2sodGVtcCx6KzEpOwoJCQkJfQoJCQl9CgkJCWlmKChwZWNhc1tpXS0+cG9zWzBdPT10ZW1wLT5wb3NbMF0tMSkgJiYgKHBlY2FzW2ldLT5wb3NbMV09PXRlbXAtPnBvc1sxXSkpeyAKCQkJCWlmKCgodGVtcC0+Ym90WzBdKSE9KHBlY2FzW2ldLT50b3BbMV0pKSB8fCAoKHRlbXAtPmJvdFsxXSkhPShwZWNhc1tpXS0+dG9wWzBdKSkpewoJCQkJCS8vcm90YXRlKHRlbXApOwoJCQkJCXJldHVybiBjaGVjayh0ZW1wLHorMSk7CgkJCQl9CgkJCX0KCQkJaWYoKHBlY2FzW2ldLT5wb3NbMF09PXRlbXAtPnBvc1swXSkgJiYgKHBlY2FzW2ldLT5wb3NbMV09PXRlbXAtPnBvc1sxXSktMSl7CgkJCQlpZigoKHRlbXAtPmxlZnRbMF0pIT0ocGVjYXNbaV0tPnJpZ2h0WzFdKSkgfHwgKCh0ZW1wLT5sZWZ0WzFdKSE9KHBlY2FzW2ldLT5yaWdodFswXSkpKXsKCQkJCQkvL3JvdGF0ZSh0ZW1wKTsKCQkJCQlyZXR1cm4gY2hlY2sodGVtcCx6KzEpOwoJCQkJfQoJCQl9CgkJCWlmKChwZWNhc1tpXS0+cG9zWzBdPT10ZW1wLT5wb3NbMF0pICYmIChwZWNhc1tpXS0+cG9zWzFdPT10ZW1wLT5wb3NbMV0pKzEpewoJCQkJaWYoKCh0ZW1wLT5yaWdodFswXSkhPShwZWNhc1tpXS0+bGVmdFsxXSkpIHx8ICgodGVtcC0+cmlnaHRbMV0pIT0ocGVjYXNbaV0tPmxlZnRbMF0pKSl7CgkJCQkJLy9yb3RhdGUodGVtcCk7CgkJCQkJcmV0dXJuIGNoZWNrKHRlbXAseisxKTsKCQkJCX0KCQkJfQoJCX0KIAoJfSovCglyZXR1cm4gMDsKfQogCnN0cnVjdCBQZWNhICogcm90YXRlKHN0cnVjdCBQZWNhICp0ZW1wKXsKIAoJaW50IGF1eFszXTsKCXN0cnVjdCBQZWNhICpub3ZhOwoJaWYodGVtcC0+dXApewoJCWF1eFswXSA9IHRlbXAtPmxlZnRbMF07CgkJYXV4WzFdID0gdGVtcC0+cmlnaHRbMF07CgkJYXV4WzJdID0gdGVtcC0+Ym90WzBdOwoJCS8vbm92YSA9IGNyZWF0ZVBlY2EoYXV4WzBdLGF1eFsxXSxhdXhbMl0sdGVtcC0+cG9zWzBdLHRlbXAtPnBvc1sxXSk7Cgl9ZWxzZXsKCQlhdXhbMF0gPSB0ZW1wLT50b3BbMF07CgkJYXV4WzFdID0gdGVtcC0+cmlnaHRbMF07CgkJYXV4WzJdID0gdGVtcC0+bGVmdFswXTsKCQkvL25vdmEgPSBjcmVhdGVQZWNhKGF1eFswXSxhdXhbMV0sYXV4WzJdLHRlbXAtPnBvc1swXSx0ZW1wLT5wb3NbMV0pOwoJfQoJcmV0dXJuIG5vdmE7CiAKfQogCiAKc3RydWN0IFBlY2EqIGNyZWF0ZVBlY2EoIGludCBhLGludCBiLGludCBjLGludCB4LGludCB5KXsKCXByaW50ZigiYTogJWQgYjogJWQgYzolZCBkOiAlZCAlZFxuIixhLGIsYyx4LHkpOwoJc3RydWN0IFBlY2EqIHRlbXA7CglpZigoeCt5KSUyPT0wKXsKCQl0ZW1wLT51cCA9IDE7IAoJCQoJCXRlbXAtPmJvdFswXSA9IGE7CgkJcHJpbnRmKCIlZCAiICx0ZW1wLT5ib3RbMF0pOwoJCXRlbXAtPmJvdFsxXSA9IGI7CgkJcHJpbnRmKCIlZCAiICx0ZW1wLT5ib3RbMV0pOwoJCXRlbXAtPmJvdFsyXSA9IDA7CgkJcHJpbnRmKCIlZFxuIiAsdGVtcC0+Ym90WzJdKTsKCQl0ZW1wLT5sZWZ0WzBdID0gYjsgCgkJcHJpbnRmKCIlZCIgLHRlbXAtPmxlZnRbMF0pOwoJCXRlbXAtPmxlZnRbMV0gPSBjOwoJCXByaW50ZigiJWQiICx0ZW1wLT5sZWZ0WzFdKTsKCQl0ZW1wLT5sZWZ0WzJdID0gMDsKCQlwcmludGYoIiVkXG4iICx0ZW1wLT5sZWZ0WzJdKTsKCQl0ZW1wLT5yaWdodFswXSA9IGM7CgkJcHJpbnRmKCIlZCIgLHRlbXAtPnJpZ2h0WzBdKTsKCQl0ZW1wLT5yaWdodFsxXSA9IGE7CgkJcHJpbnRmKCIlZCIgLHRlbXAtPnJpZ2h0WzFdKTsKCQl0ZW1wLT5yaWdodFsyXSA9ICAwOwoJCXByaW50ZigiJWRcbiIgLHRlbXAtPnJpZ2h0WzJdKTsKCQl0ZW1wLT50b3BbMF0gPSBjOyAKCQlwcmludGYoIiVkXG4iLAl0ZW1wLT50b3BbMF0pOwoJfWVsc2V7CgkJdGVtcC0+dXAgPSAwOyAKCQkvLygiJWRcbiIsdGVtcC0+dXApOyAKCQl0ZW1wLT5sZWZ0WzBdID0gYTsJCgkJdGVtcC0+bGVmdFsxXSA9IGI7CQoJCXRlbXAtPmxlZnRbMl0gPSAwOwoJCXRlbXAtPnRvcFswXSA9ICBiOyAKCQl0ZW1wLT50b3BbMV0gPSAgYzsgCgkJdGVtcC0+dG9wWzJdID0gIDA7IAoJCXRlbXAtPnJpZ2h0WzBdID0gYzsKCQl0ZW1wLT5yaWdodFsxXSA9IGE7CgkJdGVtcC0+cmlnaHRbMl0gPSAgMDsgCgkJdGVtcC0+Ym90WzBdID0gYzsKCX0KCXRlbXAtPnBvc1swXSA9IHg7CglwcmludGYoIiVkXG4iICx0ZW1wLT5wb3NbMF0pOwoJdGVtcC0+cG9zWzFdID0geTsKCXByaW50ZigiJWRcbiIgLHRlbXAtPnBvc1sxXSk7CgkKCXJldHVybiB0ZW1wOwoKfQoKIA==