#include <stdlib.h>
#include <stdio.h>
struct node{
int val;
struct node *next;
struct node *prev;
struct tree *prev_tree;
};
struct tree{
int val;
struct tree *l;
struct tree *r;
struct tree *p;
struct node *next;
struct node *prev;
};
int cmp(struct tree* A, struct tree* B)//Function to cmp two arbitrary large numbers
{
struct node *tree1=NULL;
struct node *tree2=NULL;
int i=0;
tree1
=(struct node
*)malloc(sizeof(struct node
)); tree1=A->next;
tree2
=(struct node
*)malloc(sizeof(struct node
)); tree2=B->next;
if(tree1!=NULL&&tree2!=NULL)
{
while(tree1->next!=NULL)
{
tree1=tree1->next;
}
while(tree2->next!=NULL)
{
tree2=tree2->next;
}
while(tree1->prev!=NULL&&tree2->prev!=NULL)
{
tree1=tree1->prev;
tree2=tree2->prev;
}
if(tree1->prev==NULL&&tree2->prev!=NULL)
{
tree2=tree2->prev;
}
if(tree2->prev==NULL&&tree1->prev!=NULL)
{
tree1=tree1->prev;
}
if(tree1->prev==NULL&&tree2->prev!=NULL)
{
return 0;
}
if(tree2->prev==NULL&&tree1->prev!=NULL)
{
return 1;
}
while(tree1!=NULL||tree2!=NULL)
{
if(i==0)
{
if(A->val>B->val)
{
return 1;
}
if(B->val>A->val)
{
return 0;
}
tree1=A->next;
tree2=B->next;
i++;
continue;
}
if(tree1->val>tree2->val)
{
return 1;
}
if(tree2->val>tree1->val)
{
return 0;
}
tree1=tree1->next;
tree2=tree2->next;
}
}
else
{
if(A->val>B->val)
{
return 1;
}
if(B->val>A->val)
{
return 0;
}
}
return 2;
}
struct tree* p(struct tree *A, struct tree *B)//Gives the p of new node to be inserted
{
struct tree* n=NULL;
n
=(struct tree
*)malloc(sizeof(struct tree
)); while(B!=NULL)
{
if(cmp(A,B)==1)
{
n=B;
B=B->r;
continue;
}
if(cmp(A,B)==0)
{
n=B;
B=B->l;
continue;
}
}
return n;
}
struct tree* n_tree(int val)
{
struct tree *n;
n
=(struct tree
*)malloc(sizeof(struct tree
)); n->val=val;
n->l=NULL;
n->r=NULL;
n->prev=NULL;
n->next=NULL;
n->p=NULL;
return n;
}
void preorder(struct tree* node)
{
if(node == NULL)
{
return;
}
preorder(node->l);
preorder(node->r);
}
struct node* n_node(int val, struct node *a)
{
struct node *n;
n
=(struct node
*)malloc(sizeof(struct node
)); n->val=val;
n->prev=a;
if(a!=NULL)
{
a->next=n;
}
n->next=NULL;
n->prev_tree=NULL;
return n;
}
struct node* head(int val)
{
struct node *n;
n
=(struct node
*)malloc(sizeof(struct node
)); n->next=NULL;
n->prev=NULL;
n->prev_tree=NULL;
n->val=val;
return n;
}
void pos(struct tree *t, struct tree *root)
{
while(root!=NULL)
{
if(cmp(t,root)==2)
{
break;
}
if(cmp(t,root)==1)
{
root=root->r;
continue;
}
root=root->l;
}
return;
}
int main()
{
int c_1,c_2,c_3,f1=0,f2=0,f3=0,f4=0,i=0,j=0,k=0,m=1;
struct tree *root=NULL;
struct node *tree1=NULL;
struct tree *tree2=NULL;
struct node *temp_1=NULL;
struct tree *temp_2=NULL;
struct tree *p_node=NULL;
p_node
=(struct tree
*)malloc(sizeof(struct tree
)); temp_2
=(struct tree
*)malloc(sizeof(struct tree
)); temp_1
=(struct node
*)malloc(sizeof(struct node
)); tree1
=(struct node
*)malloc(sizeof(struct node
)); tree2
=(struct tree
*)malloc(sizeof(struct tree
)); root
=(struct tree
*)malloc(sizeof(struct tree
)); root->val=-2;
root->p=NULL;
root->l=NULL;
root->r=NULL;
root->prev=NULL;
root->next=NULL;
while((c_1
=fgetc(stdin
))!=EOF
) {
if(c_1=='N')
{
c_2=c_1;
continue;
}
else if(c_1=='S')
{
c_2=c_1;
continue;
}
else if(c_1=='P')
{
c_2=c_1;
continue;
}
else if((c_1==' ')&&(c_2=='N')&&(f1==0))
{
f1=1;
continue;
}
else if((c_1==' ')&&(c_2=='S')&&(f2==0))
{
f2=1;
continue;
}
else if((c_1==' ')&&(c_2=='P')&&(f3==0))
{
f3=1;
continue;
}
else if(f1==1)
{
if(i==0)
{
root->val=c_1-'0';
tree2=root;
i++;
continue;
}
if(c_1!=' '&&c_1!='\n')
{
if(i==1)
{
tree1=n_node(c_1-'0',NULL);
tree1->prev_tree=root;
root->next=tree1;
temp_1=tree1;
i=i+3;
tree2=root;
continue;
}
if(i==2)
{
tree2=n_tree(c_1-'0');
i++;
continue;
}
if(i==3)
{
tree1=n_node(c_1-'0',NULL);
tree1->prev_tree=tree2;
tree2->next=tree1;
temp_1=tree1;
i++;
continue;
}
tree1=n_node(c_1-'0',tree1);
continue;
}
if(c_1==' ')
{
if(k==0)
i=2;
k++;
continue;
}
p_node=p(tree2,root);
tree2->p=p_node;
if(cmp(tree2,p_node)==1)
{
p_node->r=tree2;
}
if(cmp(tree2,p_node)==0)
{
p_node->l=tree2;
}
i=2;
continue;
}
if(c_1=='\n')
{
p_node=p(tree2,root);
tree2->p=p_node;
if(cmp(tree2,p_node)==1)
{
p_node->r=tree2;
}
if(cmp(tree2,p_node)==0)
{
p_node->l=tree2;
}
f1=0;
continue;
}
}
else if(f2==1)
{
if(j==0)
{
temp_2=n_tree(c_1-'0');
j++;
continue;
}
if(c_1=='\n')
{
pos(temp_2, root);
break;
}
if(m==1)
{
tree1=n_node(c_1-'0',NULL);
tree1->prev_tree=temp_2;
temp_2->next=tree1;
m++;
continue;
}
tree1=n_node(c_1-'0',tree1);
}
}
return 0;
}
I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4Kc3RydWN0IG5vZGV7CiAgICBpbnQgdmFsOwogICAgc3RydWN0IG5vZGUgKm5leHQ7CiAgICBzdHJ1Y3Qgbm9kZSAqcHJldjsKICAgIHN0cnVjdCB0cmVlICpwcmV2X3RyZWU7Cn07CnN0cnVjdCB0cmVlewogICAgaW50IHZhbDsKICAgIHN0cnVjdCB0cmVlICpsOwogICAgc3RydWN0IHRyZWUgKnI7CiAgICBzdHJ1Y3QgdHJlZSAqcDsKICAgIHN0cnVjdCBub2RlICpuZXh0OwogICAgc3RydWN0IG5vZGUgKnByZXY7Cn07CmludCBjbXAoc3RydWN0IHRyZWUqIEEsIHN0cnVjdCB0cmVlKiBCKS8vRnVuY3Rpb24gdG8gY21wIHR3byBhcmJpdHJhcnkgbGFyZ2UgbnVtYmVycwp7ICAgCiAgICBzdHJ1Y3Qgbm9kZSAqdHJlZTE9TlVMTDsKICAgIHN0cnVjdCBub2RlICp0cmVlMj1OVUxMOwogICAgaW50IGk9MDsKICAgIHRyZWUxPShzdHJ1Y3Qgbm9kZSAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IG5vZGUpKTsgCiAgICB0cmVlMT1BLT5uZXh0OwogICAgdHJlZTI9KHN0cnVjdCBub2RlICopbWFsbG9jKHNpemVvZihzdHJ1Y3Qgbm9kZSkpOwogICAgdHJlZTI9Qi0+bmV4dDsKICAgIGlmKHRyZWUxIT1OVUxMJiZ0cmVlMiE9TlVMTCkKICAgIHsKICAgICAgICB3aGlsZSh0cmVlMS0+bmV4dCE9TlVMTCkKICAgICAgICB7CiAgICAgICAgICAgIHRyZWUxPXRyZWUxLT5uZXh0OwogICAgICAgIH0KICAgICAgICB3aGlsZSh0cmVlMi0+bmV4dCE9TlVMTCkKICAgICAgICB7CiAgICAgICAgICAgIHRyZWUyPXRyZWUyLT5uZXh0OwogICAgICAgIH0KICAgICAgICB3aGlsZSh0cmVlMS0+cHJldiE9TlVMTCYmdHJlZTItPnByZXYhPU5VTEwpCiAgICAgICAgewogICAgICAgICAgICB0cmVlMT10cmVlMS0+cHJldjsKICAgICAgICAgICAgdHJlZTI9dHJlZTItPnByZXY7CiAgICAgICAgfQogICAgICAgIGlmKHRyZWUxLT5wcmV2PT1OVUxMJiZ0cmVlMi0+cHJldiE9TlVMTCkKICAgICAgICB7CiAgICAgICAgICAgIHRyZWUyPXRyZWUyLT5wcmV2OwogICAgICAgIH0KICAgICAgICBpZih0cmVlMi0+cHJldj09TlVMTCYmdHJlZTEtPnByZXYhPU5VTEwpCiAgICAgICAgeyAgIAogICAgICAgICAgICB0cmVlMT10cmVlMS0+cHJldjsKICAgICAgICB9CiAgICAgICAgaWYodHJlZTEtPnByZXY9PU5VTEwmJnRyZWUyLT5wcmV2IT1OVUxMKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmKHRyZWUyLT5wcmV2PT1OVUxMJiZ0cmVlMS0+cHJldiE9TlVMTCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICAgICB3aGlsZSh0cmVlMSE9TlVMTHx8dHJlZTIhPU5VTEwpCiAgICAgICAgeyAgIAogICAgICAgICAgICBpZihpPT0wKQogICAgICAgICAgICB7ICAgCiAgICAgICAgICAgICAgICBpZihBLT52YWw+Qi0+dmFsKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYoQi0+dmFsPkEtPnZhbCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRyZWUxPUEtPm5leHQ7CiAgICAgICAgICAgICAgICB0cmVlMj1CLT5uZXh0OwogICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYodHJlZTEtPnZhbD50cmVlMi0+dmFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZih0cmVlMi0+dmFsPnRyZWUxLT52YWwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyZWUxPXRyZWUxLT5uZXh0OwogICAgICAgICAgICB0cmVlMj10cmVlMi0+bmV4dDsKICAgICAgICB9CiAgICAgICAgCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYoQS0+dmFsPkItPnZhbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICAgICBpZihCLT52YWw+QS0+dmFsKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDI7Cn0Kc3RydWN0IHRyZWUqIHAoc3RydWN0IHRyZWUgKkEsIHN0cnVjdCB0cmVlICpCKS8vR2l2ZXMgdGhlIHAgb2YgbmV3IG5vZGUgdG8gYmUgaW5zZXJ0ZWQKeyAgIAogICAgc3RydWN0IHRyZWUqIG49TlVMTDsKICAgIG49KHN0cnVjdCB0cmVlICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHJlZSkpOwogICAgd2hpbGUoQiE9TlVMTCkKICAgIHsKICAgICAgICBpZihjbXAoQSxCKT09MSkKICAgICAgICB7ICAgCiAgICAgICAgICAgIG49QjsKICAgICAgICAgICAgQj1CLT5yOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYoY21wKEEsQik9PTApCiAgICAgICAgewogICAgICAgICAgICBuPUI7CiAgICAgICAgICAgIEI9Qi0+bDsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgfSAgIAogICAgcmV0dXJuIG47Cn0Kc3RydWN0IHRyZWUqIG5fdHJlZShpbnQgdmFsKQp7CiAgICBzdHJ1Y3QgdHJlZSAqbjsKICAgIG49KHN0cnVjdCB0cmVlICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHJlZSkpOwogICAgbi0+dmFsPXZhbDsKICAgIG4tPmw9TlVMTDsKICAgIG4tPnI9TlVMTDsKICAgIG4tPnByZXY9TlVMTDsKICAgIG4tPm5leHQ9TlVMTDsKICAgIG4tPnA9TlVMTDsKICAgIHJldHVybiBuOwp9CnZvaWQgcHJlb3JkZXIoc3RydWN0IHRyZWUqIG5vZGUpIAp7IAogICAgaWYobm9kZSA9PSBOVUxMKSAKICAgIHsKICAgICAgICByZXR1cm47IAogICAgfQogICAgcHJpbnRmKCIlZCIsIG5vZGUtPnZhbCk7ICAgCiAgICBwcmVvcmRlcihub2RlLT5sKTsgCiAgICBwcmVvcmRlcihub2RlLT5yKTsgCn0gCnN0cnVjdCBub2RlKiBuX25vZGUoaW50IHZhbCwgc3RydWN0IG5vZGUgKmEpCnsKICAgIHN0cnVjdCBub2RlICpuOwogICAgbj0oc3RydWN0IG5vZGUgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBub2RlKSk7CiAgICBuLT52YWw9dmFsOwogICAgbi0+cHJldj1hOwogICAgaWYoYSE9TlVMTCkKICAgIHsKICAgICAgICBhLT5uZXh0PW47CiAgICB9CiAgICBuLT5uZXh0PU5VTEw7CiAgICBuLT5wcmV2X3RyZWU9TlVMTDsKICAgIHJldHVybiBuOwp9CnN0cnVjdCBub2RlKiBoZWFkKGludCB2YWwpCnsKICAgIHN0cnVjdCBub2RlICpuOwogICAgbj0oc3RydWN0IG5vZGUgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBub2RlKSk7CiAgICBuLT5uZXh0PU5VTEw7CiAgICBuLT5wcmV2PU5VTEw7CiAgICBuLT5wcmV2X3RyZWU9TlVMTDsKICAgIG4tPnZhbD12YWw7CiAgICByZXR1cm4gbjsKfQp2b2lkIHBvcyhzdHJ1Y3QgdHJlZSAqdCwgc3RydWN0IHRyZWUgKnJvb3QpCnsKICAgIHdoaWxlKHJvb3QhPU5VTEwpCiAgICB7CiAgICAgICAgaWYoY21wKHQscm9vdCk9PTIpCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZihjbXAodCxyb290KT09MSkKICAgICAgICB7CiAgICAgICAgICAgIHJvb3Q9cm9vdC0+cjsKICAgICAgICAgICAgcHJpbnRmKCIxIik7CiAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAKICAgICAgICB9CiAgICAgICAgcm9vdD1yb290LT5sOwogICAgICAgIHByaW50ZigiMCIpOwogICAgfQogICAgcmV0dXJuOwp9CmludCBtYWluKCkKewogICAgaW50IGNfMSxjXzIsY18zLGYxPTAsZjI9MCxmMz0wLGY0PTAsaT0wLGo9MCxrPTAsbT0xOwogICAgc3RydWN0IHRyZWUgKnJvb3Q9TlVMTDsKICAgIHN0cnVjdCBub2RlICp0cmVlMT1OVUxMOwogICAgc3RydWN0IHRyZWUgKnRyZWUyPU5VTEw7CiAgICBzdHJ1Y3Qgbm9kZSAqdGVtcF8xPU5VTEw7CiAgICBzdHJ1Y3QgdHJlZSAqdGVtcF8yPU5VTEw7CiAgICBzdHJ1Y3QgdHJlZSAqcF9ub2RlPU5VTEw7CiAgICBwX25vZGU9KHN0cnVjdCB0cmVlICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHJlZSkpOwogICAgdGVtcF8yPShzdHJ1Y3QgdHJlZSAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHRyZWUpKTsKICAgIHRlbXBfMT0oc3RydWN0IG5vZGUgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBub2RlKSk7CiAgICB0cmVlMT0oc3RydWN0IG5vZGUgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBub2RlKSk7CiAgICB0cmVlMj0oc3RydWN0IHRyZWUgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCB0cmVlKSk7ICAgCiAgICByb290PShzdHJ1Y3QgdHJlZSAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHRyZWUpKTsKICAgIHJvb3QtPnZhbD0tMjsKICAgIHJvb3QtPnA9TlVMTDsKICAgIHJvb3QtPmw9TlVMTDsKICAgIHJvb3QtPnI9TlVMTDsKICAgIHJvb3QtPnByZXY9TlVMTDsKICAgIHJvb3QtPm5leHQ9TlVMTDsKICAgIHdoaWxlKChjXzE9ZmdldGMoc3RkaW4pKSE9RU9GKQogICAgewogICAgICAgIGlmKGNfMT09J04nKQogICAgICAgIHsKICAgICAgICAgICAgY18yPWNfMTsKICAgICAgICAgICAgY29udGludWU7ICAgCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoY18xPT0nUycpCiAgICAgICAgeyAgICAgICAKICAgICAgICAgICAgY18yPWNfMTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoY18xPT0nUCcpCiAgICAgICAgewogICAgICAgICAgICBjXzI9Y18xOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZigoY18xPT0nICcpJiYoY18yPT0nTicpJiYoZjE9PTApKQogICAgICAgIHsgICAKICAgICAgICAgICAgZjE9MTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoKGNfMT09JyAnKSYmKGNfMj09J1MnKSYmKGYyPT0wKSkKICAgICAgICB7ICAgCiAgICAgICAgICAgIGYyPTE7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmKChjXzE9PScgJykmJihjXzI9PSdQJykmJihmMz09MCkpCiAgICAgICAgewogICAgICAgICAgICBmMz0xOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihmMT09MSkKICAgICAgICB7CiAgICAgICAgICAgIGlmKGk9PTApCiAgICAgICAgICAgIHsgICAKICAgICAgICAgICAgICAgIHJvb3QtPnZhbD1jXzEtJzAnOwogICAgICAgICAgICAgICAgdHJlZTI9cm9vdDsgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgIHByaW50ZigiJWQiLHJvb3QtPnZhbCk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZihjXzEhPScgJyYmY18xIT0nXG4nKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZihpPT0xKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRyZWUxPW5fbm9kZShjXzEtJzAnLE5VTEwpOwogICAgICAgICAgICAgICAgICAgIHRyZWUxLT5wcmV2X3RyZWU9cm9vdDsKICAgICAgICAgICAgICAgICAgICByb290LT5uZXh0PXRyZWUxOwogICAgICAgICAgICAgICAgICAgIHRlbXBfMT10cmVlMTsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVkIix0cmVlMS0+dmFsKTsKICAgICAgICAgICAgICAgICAgICBpPWkrMzsKICAgICAgICAgICAgICAgICAgICB0cmVlMj1yb290OwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYoaT09MikKICAgICAgICAgICAgICAgIHsgICAKICAgICAgICAgICAgICAgICAgICB0cmVlMj1uX3RyZWUoY18xLScwJyk7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlZCIsdHJlZTItPnZhbCk7CiAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYoaT09MykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0cmVlMT1uX25vZGUoY18xLScwJyxOVUxMKTsKICAgICAgICAgICAgICAgICAgICB0cmVlMS0+cHJldl90cmVlPXRyZWUyOwogICAgICAgICAgICAgICAgICAgIHRyZWUyLT5uZXh0PXRyZWUxOwogICAgICAgICAgICAgICAgICAgIHRlbXBfMT10cmVlMTsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVkIix0cmVlMS0+dmFsKTsKICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0cmVlMT1uX25vZGUoY18xLScwJyx0cmVlMSk7CiAgICAgICAgICAgICAgICBwcmludGYoIiVkIix0cmVlMS0+dmFsKTsgCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZihjXzE9PScgJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYoaz09MCkKICAgICAgICAgICAgICAgIHsgICBwcmludGYoIiAiKTsKICAgICAgICAgICAgICAgICAgICBpPTI7CiAgICAgICAgICAgICAgICAgICAgaysrOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcF9ub2RlPXAodHJlZTIscm9vdCk7CiAgICAgICAgICAgICAgICBwcmludGYoIiAlZCAiLHBfbm9kZS0+dmFsKTsKICAgICAgICAgICAgICAgIHRyZWUyLT5wPXBfbm9kZTsKICAgICAgICAgICAgICAgIGlmKGNtcCh0cmVlMixwX25vZGUpPT0xKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHBfbm9kZS0+cj10cmVlMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmKGNtcCh0cmVlMixwX25vZGUpPT0wKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHBfbm9kZS0+bD10cmVlMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGk9MjsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKGNfMT09J1xuJykKICAgICAgICAgICAgeyAgIAogICAgICAgICAgICAgICAgcF9ub2RlPXAodHJlZTIscm9vdCk7CiAgICAgICAgICAgICAgICBwcmludGYoIiAlZCAiLHBfbm9kZS0+dmFsKTsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB0cmVlMi0+cD1wX25vZGU7CiAgICAgICAgICAgICAgICBpZihjbXAodHJlZTIscF9ub2RlKT09MSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwX25vZGUtPnI9dHJlZTI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZihjbXAodHJlZTIscF9ub2RlKT09MCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwX25vZGUtPmw9dHJlZTI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmMT0wOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0gICAgICAgCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoZjI9PTEpCiAgICAgICAgeyAgIAogICAgICAgICAgICBpZihqPT0wKQogICAgICAgICAgICB7ICAgCiAgICAgICAgICAgICAgICB0ZW1wXzI9bl90cmVlKGNfMS0nMCcpOwogICAgICAgICAgICAgICAgcHJpbnRmKCIlZCIsdGVtcF8yLT52YWwpOwogICAgICAgICAgICAgICAgaisrOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoY18xPT0nXG4nKQogICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHBvcyh0ZW1wXzIsIHJvb3QpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYobT09MSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHJlZTE9bl9ub2RlKGNfMS0nMCcsTlVMTCk7CiAgICAgICAgICAgICAgICB0cmVlMS0+cHJldl90cmVlPXRlbXBfMjsKICAgICAgICAgICAgICAgIHRlbXBfMi0+bmV4dD10cmVlMTsKICAgICAgICAgICAgICAgIHByaW50ZigiJWQiLHRyZWUxLT52YWwpOwogICAgICAgICAgICAgICAgbSsrOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJlZTE9bl9ub2RlKGNfMS0nMCcsdHJlZTEpOwogICAgICAgICAgICBwcmludGYoIiVkIix0cmVlMS0+dmFsKTsgICAgICAgICAgICAKICAgICAgICB9ICAgICAgICAgICAgICAgCiAgICB9CiAgICByZXR1cm4gMDsKfQ==