#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
typedef struct no{
    int pontuacao, id;
    struct no *dir, *esq, *pai;
}No;
 
No *cria_no(int nova_pontuacao, int ID){
    No 
*novo 
= malloc(sizeof(No
));    novo->pontuacao = nova_pontuacao;
    novo->dir = novo->esq = NULL;
    novo->id = ID;
    novo->pai = NULL;
    return novo;
}
 
No *insere_no(No *raiz, int nova_pontuacao, int ID){
    No *pai_aux = raiz;
    No *aux = NULL;
    No *nova = cria_no(nova_pontuacao, ID);
    if (raiz == NULL)
        raiz = nova;
    else
    {
        aux = raiz;
        while (aux != NULL)
        {
            pai_aux = aux;
            if (nova_pontuacao < aux->pontuacao)
                aux = aux->esq;
            else if(nova_pontuacao > aux->pontuacao)
                aux = aux->dir;
            else if(nova_pontuacao == aux->pontuacao){
                aux = aux->esq;
                pai_aux->esq = nova;
                nova->esq = aux;
                nova->pai = pai_aux;
                return raiz;
            }
        }
        nova->pai = pai_aux;
        if (nova_pontuacao < pai_aux->pontuacao)
            pai_aux->esq = nova;
        else if(nova_pontuacao > pai_aux->pontuacao)
            pai_aux->dir = nova;
    }
    return raiz;
}
 
void em_ordem(No *raiz)
{
    if (raiz != NULL)
    {
        em_ordem(raiz->esq);
        printf("%d ", raiz
->pontuacao
);         em_ordem(raiz->dir);
    }
}
 
void pre_ordem(No *raiz)
{
    if (raiz != NULL)
    {
        printf("%d ", raiz
->pontuacao
);         pre_ordem(raiz->esq);
        pre_ordem(raiz->dir);
    }
}
 
No* sucessor(No *no_remover)
{
 
    // por sucessor
    No *suc = no_remover->dir;
 
    while (suc->esq != NULL)
    {
        suc = suc->esq;
    }
 
    return suc;
}
 
No* antecessor(No *no_remover)
{
 
    // por sucessor
    No *ant = no_remover->esq;
 
    while (ant->dir != NULL)
    {
        ant = ant->dir;
    }
 
    return ant;
}
 
No *remove_noavl(No *raiz, int chave)
{
 
    No *no_remover = raiz;
    No *pai_no_remover = NULL;
    No *copia = NULL;
 
    while (no_remover != NULL && no_remover->pontuacao != chave)
    {
        if (no_remover->pontuacao < chave)
            no_remover = no_remover->dir;
        else
            no_remover = no_remover->esq;
    }
 
    while (no_remover != NULL) // encontrou o valor a ser removido
    {
        if (no_remover->esq == NULL && no_remover->dir == NULL)//eh folha
        {
            if (raiz == no_remover)
            {
                no_remover = raiz = NULL;
            }
            else
            {
                if (no_remover->pai->esq != NULL && no_remover->pai->esq->pontuacao == chave)
                    no_remover->pai->esq = NULL;
                else
                    no_remover->pai->dir = NULL;
 
                no_remover = NULL;
            }
        }
        else // tem um filho ou dois filhos
        {
 
            if (no_remover->dir != NULL)
                copia = sucessor(no_remover);
            else
                copia = antecessor(no_remover);
 
                //substitui o valor da ser removido pelo valor
                //do sucessor ou do antecessor
            no_remover->pontuacao = copia->pontuacao;
            no_remover->id = copia->id;
            //muda o no a ser removido para o sucessor ou antecessor
            no_remover = copia;
            chave = copia->pontuacao;
        }
 
    }
    return raiz;
}
 
No* registrar(No *raiz){
    int pontuacao;
    int id;
    return insere_no(raiz, pontuacao, id);
}
 
int verifica_existencia(No*raiz, int id, int *pontuacao_velha, int*flag){
    if(raiz != NULL && (*flag) != 1){
        verifica_existencia(raiz->dir, id, pontuacao_velha, flag);
        if(raiz->id == id){
            (*flag) = 1;
            (*pontuacao_velha) = raiz->pontuacao;
        }
        verifica_existencia(raiz->esq, id, pontuacao_velha, flag);
    }
}
 
No* UPDATE(No *raiz){
    int pontuacao_nova, pontuacao_velha, id, flag = 0;
 
    scanf("%d", &pontuacao_nova
);  
    if(raiz != NULL){
        verifica_existencia(raiz, id, &pontuacao_velha, &flag);
 
        if(flag == 1){
            raiz = remove_noavl(raiz, pontuacao_velha);
            raiz = insere_no(raiz, pontuacao_nova, id);
        }
    }
    return raiz;
}
 
int ID_MAX(No *raiz){
    No* aux = raiz;
    while(aux->esq != NULL)
        aux = aux->esq;
    return aux->id;
}
 
void posicao_calc(No *raiz, int id, int *CAT, int *flag){
    if(raiz != NULL && (*flag) != 1){
        posicao_calc(raiz->dir, id, CAT, flag);
        if(raiz->id == id){
            (*flag) = 1;
            (*CAT)++;
        }
        else if((*flag) != 1){
            (*CAT)++;
        }
        posicao_calc(raiz->esq, id, CAT, flag);
    }
}
 
void posicao(No *raiz){
    int id = 0;
 
    if(raiz != NULL){
        int rez_01, rez_02, aux_id, pos;
        rez_01 = rez_02 = aux_id = pos = 0;
 
        aux_id = ID_MAX(raiz);
 
        posicao_calc(raiz, id, &rez_01, &pos);
 
        pos = 0;
 
        posicao_calc(raiz, aux_id, &rez_02, &pos);
 
        if(rez_01>rez_02)
        else
    }
    else{
    }
 
}
 
void top(No *raiz){
    if(raiz != NULL){
        No* aux = raiz, *pai_aux = NULL;
        while(aux != NULL){
            pai_aux = aux;
            aux = aux->dir;
        }
    }
    else{
    }
}
 
void BOTTOM(No *raiz){
    if(raiz != NULL){
        No* aux = raiz, *pai_aux = NULL;
        while(aux != NULL){
            pai_aux = aux;
            aux = aux->esq;
        }
    }
    else{
    }
}
 
void RANGE_CALC(No *raiz, int pont_min, int pont_max){
    if(raiz != NULL){
        RANGE_CALC(raiz->dir, pont_min, pont_max);
        if(pont_min <= raiz->pontuacao && raiz->pontuacao <= pont_max){
        }
        RANGE_CALC(raiz->esq, pont_min, pont_max);
    }
}
 
void RANGE(No *raiz){
    int min;
    int max;
    min = max = 0;
 
    scanf("%d %d", &min
, &max
);     if(raiz != NULL){
        RANGE_CALC(raiz, min, max);
    }
    else
}
 
void COUNT_ABOVE(No *raiz, int ac, int* cont_0x){
    if (raiz != NULL)
    {
        COUNT_ABOVE(raiz->dir, ac, cont_0x);
        if(raiz->pontuacao > ac)
            (*cont_0x)++;
        COUNT_ABOVE(raiz->esq, ac, cont_0x);
    }
}
 
void COUNT_BELOW(No *raiz, int ac, int* cont_0x){
    if (raiz != NULL)
    {
        COUNT_BELOW(raiz->dir, ac, cont_0x);
        if(raiz->pontuacao < ac)
            (*cont_0x)++;
        COUNT_BELOW(raiz->esq, ac, cont_0x);
    }
}
 
int main(){
 
No *ABB = NULL;
int n, cont = 0;
int ac = 0;
int cont_02 = 0;
char rep[20];
 
 
while(cont < n){
 
    if(strcmp(rep
, "REGISTER") == 0)         ABB = registrar(ABB); 
    else if(strcmp(rep
, "UPDATE") == 0)         ABB = UPDATE(ABB);    
    else if(strcmp(rep
, "POSITION") == 0)         posicao(ABB);
    else if(strcmp(rep
, "RANGE") == 0)         RANGE(ABB);
    else if(strcmp(rep
, "TOP") == 0)         top(ABB);
    else if(strcmp(rep
, "BOTTOM") == 0)         BOTTOM(ABB);
    else if(strcmp(rep
, "COUNT_ABOVE") == 0){         ac = cont_02 = 0;
        COUNT_ABOVE(ABB, ac, &cont_02);
    }
    else if(strcmp(rep
, "COUNT_BELOW") == 0){         ac = cont_02 = 0;
        COUNT_BELOW(ABB, ac, &cont_02);
    }
    cont++;
}
 
return 0;}
				I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKdHlwZWRlZiBzdHJ1Y3Qgbm97CiAgICBpbnQgcG9udHVhY2FvLCBpZDsKICAgIHN0cnVjdCBubyAqZGlyLCAqZXNxLCAqcGFpOwp9Tm87CgpObyAqY3JpYV9ubyhpbnQgbm92YV9wb250dWFjYW8sIGludCBJRCl7CiAgICBObyAqbm92byA9IG1hbGxvYyhzaXplb2YoTm8pKTsKICAgIG5vdm8tPnBvbnR1YWNhbyA9IG5vdmFfcG9udHVhY2FvOwogICAgbm92by0+ZGlyID0gbm92by0+ZXNxID0gTlVMTDsKICAgIG5vdm8tPmlkID0gSUQ7CiAgICBub3ZvLT5wYWkgPSBOVUxMOwogICAgcmV0dXJuIG5vdm87Cn0KCk5vICppbnNlcmVfbm8oTm8gKnJhaXosIGludCBub3ZhX3BvbnR1YWNhbywgaW50IElEKXsKICAgIE5vICpwYWlfYXV4ID0gcmFpejsKICAgIE5vICphdXggPSBOVUxMOwogICAgTm8gKm5vdmEgPSBjcmlhX25vKG5vdmFfcG9udHVhY2FvLCBJRCk7CiAgICBpZiAocmFpeiA9PSBOVUxMKQogICAgICAgIHJhaXogPSBub3ZhOwogICAgZWxzZQogICAgewogICAgICAgIGF1eCA9IHJhaXo7CiAgICAgICAgd2hpbGUgKGF1eCAhPSBOVUxMKQogICAgICAgIHsKICAgICAgICAgICAgcGFpX2F1eCA9IGF1eDsKICAgICAgICAgICAgaWYgKG5vdmFfcG9udHVhY2FvIDwgYXV4LT5wb250dWFjYW8pCiAgICAgICAgICAgICAgICBhdXggPSBhdXgtPmVzcTsKICAgICAgICAgICAgZWxzZSBpZihub3ZhX3BvbnR1YWNhbyA+IGF1eC0+cG9udHVhY2FvKQogICAgICAgICAgICAgICAgYXV4ID0gYXV4LT5kaXI7CiAgICAgICAgICAgIGVsc2UgaWYobm92YV9wb250dWFjYW8gPT0gYXV4LT5wb250dWFjYW8pewogICAgICAgICAgICAgICAgYXV4ID0gYXV4LT5lc3E7CiAgICAgICAgICAgICAgICBwYWlfYXV4LT5lc3EgPSBub3ZhOwogICAgICAgICAgICAgICAgbm92YS0+ZXNxID0gYXV4OwogICAgICAgICAgICAgICAgbm92YS0+cGFpID0gcGFpX2F1eDsKICAgICAgICAgICAgICAgIHJldHVybiByYWl6OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG5vdmEtPnBhaSA9IHBhaV9hdXg7CiAgICAgICAgaWYgKG5vdmFfcG9udHVhY2FvIDwgcGFpX2F1eC0+cG9udHVhY2FvKQogICAgICAgICAgICBwYWlfYXV4LT5lc3EgPSBub3ZhOwogICAgICAgIGVsc2UgaWYobm92YV9wb250dWFjYW8gPiBwYWlfYXV4LT5wb250dWFjYW8pCiAgICAgICAgICAgIHBhaV9hdXgtPmRpciA9IG5vdmE7CiAgICB9CiAgICByZXR1cm4gcmFpejsKfQoKdm9pZCBlbV9vcmRlbShObyAqcmFpeikKewogICAgaWYgKHJhaXogIT0gTlVMTCkKICAgIHsKICAgICAgICBlbV9vcmRlbShyYWl6LT5lc3EpOwogICAgICAgIHByaW50ZigiJWQgIiwgcmFpei0+cG9udHVhY2FvKTsKICAgICAgICBlbV9vcmRlbShyYWl6LT5kaXIpOwogICAgfQp9Cgp2b2lkIHByZV9vcmRlbShObyAqcmFpeikKewogICAgaWYgKHJhaXogIT0gTlVMTCkKICAgIHsKICAgICAgICBwcmludGYoIiVkICIsIHJhaXotPnBvbnR1YWNhbyk7CiAgICAgICAgcHJlX29yZGVtKHJhaXotPmVzcSk7CiAgICAgICAgcHJlX29yZGVtKHJhaXotPmRpcik7CiAgICB9Cn0KCk5vKiBzdWNlc3NvcihObyAqbm9fcmVtb3ZlcikKewoKICAgIC8vIHBvciBzdWNlc3NvcgogICAgTm8gKnN1YyA9IG5vX3JlbW92ZXItPmRpcjsKCiAgICB3aGlsZSAoc3VjLT5lc3EgIT0gTlVMTCkKICAgIHsKICAgICAgICBzdWMgPSBzdWMtPmVzcTsKICAgIH0KCiAgICByZXR1cm4gc3VjOwp9CgpObyogYW50ZWNlc3NvcihObyAqbm9fcmVtb3ZlcikKewoKICAgIC8vIHBvciBzdWNlc3NvcgogICAgTm8gKmFudCA9IG5vX3JlbW92ZXItPmVzcTsKCiAgICB3aGlsZSAoYW50LT5kaXIgIT0gTlVMTCkKICAgIHsKICAgICAgICBhbnQgPSBhbnQtPmRpcjsKICAgIH0KCiAgICByZXR1cm4gYW50Owp9CgpObyAqcmVtb3ZlX25vYXZsKE5vICpyYWl6LCBpbnQgY2hhdmUpCnsKCiAgICBObyAqbm9fcmVtb3ZlciA9IHJhaXo7CiAgICBObyAqcGFpX25vX3JlbW92ZXIgPSBOVUxMOwogICAgTm8gKmNvcGlhID0gTlVMTDsKCiAgICB3aGlsZSAobm9fcmVtb3ZlciAhPSBOVUxMICYmIG5vX3JlbW92ZXItPnBvbnR1YWNhbyAhPSBjaGF2ZSkKICAgIHsKICAgICAgICBpZiAobm9fcmVtb3Zlci0+cG9udHVhY2FvIDwgY2hhdmUpCiAgICAgICAgICAgIG5vX3JlbW92ZXIgPSBub19yZW1vdmVyLT5kaXI7CiAgICAgICAgZWxzZQogICAgICAgICAgICBub19yZW1vdmVyID0gbm9fcmVtb3Zlci0+ZXNxOwogICAgfQoKICAgIHdoaWxlIChub19yZW1vdmVyICE9IE5VTEwpIC8vIGVuY29udHJvdSBvIHZhbG9yIGEgc2VyIHJlbW92aWRvCiAgICB7CiAgICAgICAgaWYgKG5vX3JlbW92ZXItPmVzcSA9PSBOVUxMICYmIG5vX3JlbW92ZXItPmRpciA9PSBOVUxMKS8vZWggZm9saGEKICAgICAgICB7CiAgICAgICAgICAgIGlmIChyYWl6ID09IG5vX3JlbW92ZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZyZWUocmFpeik7CiAgICAgICAgICAgICAgICBub19yZW1vdmVyID0gcmFpeiA9IE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAobm9fcmVtb3Zlci0+cGFpLT5lc3EgIT0gTlVMTCAmJiBub19yZW1vdmVyLT5wYWktPmVzcS0+cG9udHVhY2FvID09IGNoYXZlKQogICAgICAgICAgICAgICAgICAgIG5vX3JlbW92ZXItPnBhaS0+ZXNxID0gTlVMTDsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBub19yZW1vdmVyLT5wYWktPmRpciA9IE5VTEw7CgogICAgICAgICAgICAgICAgZnJlZShub19yZW1vdmVyKTsKICAgICAgICAgICAgICAgIG5vX3JlbW92ZXIgPSBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgLy8gdGVtIHVtIGZpbGhvIG91IGRvaXMgZmlsaG9zCiAgICAgICAgewoKICAgICAgICAgICAgaWYgKG5vX3JlbW92ZXItPmRpciAhPSBOVUxMKQogICAgICAgICAgICAgICAgY29waWEgPSBzdWNlc3Nvcihub19yZW1vdmVyKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgY29waWEgPSBhbnRlY2Vzc29yKG5vX3JlbW92ZXIpOwoKICAgICAgICAgICAgICAgIC8vc3Vic3RpdHVpIG8gdmFsb3IgZGEgc2VyIHJlbW92aWRvIHBlbG8gdmFsb3IKICAgICAgICAgICAgICAgIC8vZG8gc3VjZXNzb3Igb3UgZG8gYW50ZWNlc3NvcgogICAgICAgICAgICBub19yZW1vdmVyLT5wb250dWFjYW8gPSBjb3BpYS0+cG9udHVhY2FvOwogICAgICAgICAgICBub19yZW1vdmVyLT5pZCA9IGNvcGlhLT5pZDsKICAgICAgICAgICAgLy9tdWRhIG8gbm8gYSBzZXIgcmVtb3ZpZG8gcGFyYSBvIHN1Y2Vzc29yIG91IGFudGVjZXNzb3IKICAgICAgICAgICAgbm9fcmVtb3ZlciA9IGNvcGlhOwogICAgICAgICAgICBjaGF2ZSA9IGNvcGlhLT5wb250dWFjYW87CiAgICAgICAgfQogICAgICAgIAogICAgfQogICAgcmV0dXJuIHJhaXo7Cn0KCk5vKiByZWdpc3RyYXIoTm8gKnJhaXopewogICAgaW50IHBvbnR1YWNhbzsKICAgIGludCBpZDsKICAgIHNjYW5mKCIlZCIsICZpZCk7CiAgICBzY2FuZigiJWQiLCAmcG9udHVhY2FvKTsKICAgIHJldHVybiBpbnNlcmVfbm8ocmFpeiwgcG9udHVhY2FvLCBpZCk7Cn0KCmludCB2ZXJpZmljYV9leGlzdGVuY2lhKE5vKnJhaXosIGludCBpZCwgaW50ICpwb250dWFjYW9fdmVsaGEsIGludCpmbGFnKXsKICAgIGlmKHJhaXogIT0gTlVMTCAmJiAoKmZsYWcpICE9IDEpewogICAgICAgIHZlcmlmaWNhX2V4aXN0ZW5jaWEocmFpei0+ZGlyLCBpZCwgcG9udHVhY2FvX3ZlbGhhLCBmbGFnKTsKICAgICAgICBpZihyYWl6LT5pZCA9PSBpZCl7CiAgICAgICAgICAgICgqZmxhZykgPSAxOwogICAgICAgICAgICAoKnBvbnR1YWNhb192ZWxoYSkgPSByYWl6LT5wb250dWFjYW87CiAgICAgICAgfQogICAgICAgIHZlcmlmaWNhX2V4aXN0ZW5jaWEocmFpei0+ZXNxLCBpZCwgcG9udHVhY2FvX3ZlbGhhLCBmbGFnKTsKICAgIH0KfQoKTm8qIFVQREFURShObyAqcmFpeil7CiAgICBpbnQgcG9udHVhY2FvX25vdmEsIHBvbnR1YWNhb192ZWxoYSwgaWQsIGZsYWcgPSAwOwoKICAgIHNjYW5mKCIlZCIsICZpZCk7CiAgICBzY2FuZigiJWQiLCAmcG9udHVhY2FvX25vdmEpOwogICAgCiAgICBpZihyYWl6ICE9IE5VTEwpewogICAgICAgIHZlcmlmaWNhX2V4aXN0ZW5jaWEocmFpeiwgaWQsICZwb250dWFjYW9fdmVsaGEsICZmbGFnKTsKCiAgICAgICAgaWYoZmxhZyA9PSAxKXsKICAgICAgICAgICAgcmFpeiA9IHJlbW92ZV9ub2F2bChyYWl6LCBwb250dWFjYW9fdmVsaGEpOwogICAgICAgICAgICByYWl6ID0gaW5zZXJlX25vKHJhaXosIHBvbnR1YWNhb19ub3ZhLCBpZCk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHJhaXo7Cn0KCmludCBJRF9NQVgoTm8gKnJhaXopewogICAgTm8qIGF1eCA9IHJhaXo7CiAgICB3aGlsZShhdXgtPmVzcSAhPSBOVUxMKQogICAgICAgIGF1eCA9IGF1eC0+ZXNxOwogICAgcmV0dXJuIGF1eC0+aWQ7Cn0KCnZvaWQgcG9zaWNhb19jYWxjKE5vICpyYWl6LCBpbnQgaWQsIGludCAqQ0FULCBpbnQgKmZsYWcpewogICAgaWYocmFpeiAhPSBOVUxMICYmICgqZmxhZykgIT0gMSl7CiAgICAgICAgcG9zaWNhb19jYWxjKHJhaXotPmRpciwgaWQsIENBVCwgZmxhZyk7CiAgICAgICAgaWYocmFpei0+aWQgPT0gaWQpewogICAgICAgICAgICAoKmZsYWcpID0gMTsKICAgICAgICAgICAgKCpDQVQpKys7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoKCpmbGFnKSAhPSAxKXsKICAgICAgICAgICAgKCpDQVQpKys7CiAgICAgICAgfQogICAgICAgIHBvc2ljYW9fY2FsYyhyYWl6LT5lc3EsIGlkLCBDQVQsIGZsYWcpOwogICAgfQp9Cgp2b2lkIHBvc2ljYW8oTm8gKnJhaXopewogICAgaW50IGlkID0gMDsKICAgIHNjYW5mKCIlZCIsICZpZCk7CiAgICAKICAgIGlmKHJhaXogIT0gTlVMTCl7CiAgICAgICAgaW50IHJlel8wMSwgcmV6XzAyLCBhdXhfaWQsIHBvczsKICAgICAgICByZXpfMDEgPSByZXpfMDIgPSBhdXhfaWQgPSBwb3MgPSAwOwoKICAgICAgICBhdXhfaWQgPSBJRF9NQVgocmFpeik7CgogICAgICAgIHBvc2ljYW9fY2FsYyhyYWl6LCBpZCwgJnJlel8wMSwgJnBvcyk7CgogICAgICAgIHBvcyA9IDA7CgogICAgICAgIHBvc2ljYW9fY2FsYyhyYWl6LCBhdXhfaWQsICZyZXpfMDIsICZwb3MpOwoKICAgICAgICBpZihyZXpfMDE+cmV6XzAyKQogICAgICAgICAgICBwcmludGYoIk5PVF9GT1VORFxuIik7CiAgICAgICAgZWxzZQogICAgICAgICAgICBwcmludGYoIiVkXG4iLCByZXpfMDEpOwogICAgfQogICAgZWxzZXsKICAgICAgICBwcmludGYoIk5PVF9GT1VORFxuIik7CiAgICB9CiAgICAKfQoKdm9pZCB0b3AoTm8gKnJhaXopewogICAgaWYocmFpeiAhPSBOVUxMKXsKICAgICAgICBObyogYXV4ID0gcmFpeiwgKnBhaV9hdXggPSBOVUxMOwogICAgICAgIHdoaWxlKGF1eCAhPSBOVUxMKXsKICAgICAgICAgICAgcGFpX2F1eCA9IGF1eDsKICAgICAgICAgICAgYXV4ID0gYXV4LT5kaXI7CiAgICAgICAgfQogICAgICAgIHByaW50ZigiJWRcbiIsIHBhaV9hdXgtPmlkKTsKICAgIH0KICAgIGVsc2V7CiAgICAgICAgcHJpbnRmKCJFTVBUWVxuIik7CiAgICB9Cn0KCnZvaWQgQk9UVE9NKE5vICpyYWl6KXsKICAgIGlmKHJhaXogIT0gTlVMTCl7CiAgICAgICAgTm8qIGF1eCA9IHJhaXosICpwYWlfYXV4ID0gTlVMTDsKICAgICAgICB3aGlsZShhdXggIT0gTlVMTCl7CiAgICAgICAgICAgIHBhaV9hdXggPSBhdXg7CiAgICAgICAgICAgIGF1eCA9IGF1eC0+ZXNxOwogICAgICAgIH0KICAgICAgICBwcmludGYoIiVkXG4iLCBwYWlfYXV4LT5pZCk7CiAgICB9CiAgICBlbHNlewogICAgICAgIHByaW50ZigiRU1QVFlcbiIpOwogICAgfQp9Cgp2b2lkIFJBTkdFX0NBTEMoTm8gKnJhaXosIGludCBwb250X21pbiwgaW50IHBvbnRfbWF4KXsKICAgIGlmKHJhaXogIT0gTlVMTCl7CiAgICAgICAgUkFOR0VfQ0FMQyhyYWl6LT5kaXIsIHBvbnRfbWluLCBwb250X21heCk7CiAgICAgICAgaWYocG9udF9taW4gPD0gcmFpei0+cG9udHVhY2FvICYmIHJhaXotPnBvbnR1YWNhbyA8PSBwb250X21heCl7CiAgICAgICAgICAgIHByaW50ZigiJWQgIiwgcmFpei0+aWQpOwogICAgICAgIH0KICAgICAgICBSQU5HRV9DQUxDKHJhaXotPmVzcSwgcG9udF9taW4sIHBvbnRfbWF4KTsKICAgIH0KfQoKdm9pZCBSQU5HRShObyAqcmFpeil7CiAgICBpbnQgbWluOwogICAgaW50IG1heDsKICAgIG1pbiA9IG1heCA9IDA7CgogICAgc2NhbmYoIiVkICVkIiwgJm1pbiwgJm1heCk7CiAgICBpZihyYWl6ICE9IE5VTEwpewogICAgICAgIFJBTkdFX0NBTEMocmFpeiwgbWluLCBtYXgpOwogICAgICAgIHByaW50ZigiXG4iKTsKICAgIH0KICAgIGVsc2UKICAgICAgICBwcmludGYoIkVNUFRZXG4iKTsKfQoKdm9pZCBDT1VOVF9BQk9WRShObyAqcmFpeiwgaW50IGFjLCBpbnQqIGNvbnRfMHgpewogICAgaWYgKHJhaXogIT0gTlVMTCkKICAgIHsKICAgICAgICBDT1VOVF9BQk9WRShyYWl6LT5kaXIsIGFjLCBjb250XzB4KTsKICAgICAgICBpZihyYWl6LT5wb250dWFjYW8gPiBhYykKICAgICAgICAgICAgKCpjb250XzB4KSsrOwogICAgICAgIENPVU5UX0FCT1ZFKHJhaXotPmVzcSwgYWMsIGNvbnRfMHgpOwogICAgfQp9Cgp2b2lkIENPVU5UX0JFTE9XKE5vICpyYWl6LCBpbnQgYWMsIGludCogY29udF8weCl7CiAgICBpZiAocmFpeiAhPSBOVUxMKQogICAgewogICAgICAgIENPVU5UX0JFTE9XKHJhaXotPmRpciwgYWMsIGNvbnRfMHgpOwogICAgICAgIGlmKHJhaXotPnBvbnR1YWNhbyA8IGFjKQogICAgICAgICAgICAoKmNvbnRfMHgpKys7CiAgICAgICAgQ09VTlRfQkVMT1cocmFpei0+ZXNxLCBhYywgY29udF8weCk7CiAgICB9Cn0KCmludCBtYWluKCl7CgpObyAqQUJCID0gTlVMTDsKaW50IG4sIGNvbnQgPSAwOwppbnQgYWMgPSAwOwppbnQgY29udF8wMiA9IDA7CmNoYXIgcmVwWzIwXTsKCnNjYW5mKCIlZCIsICZuKTsKCndoaWxlKGNvbnQgPCBuKXsKICAgIHN0cmNweShyZXAsIiAiKTsKICAgIGZmbHVzaChzdGRpbik7CiAgICBzY2FuZigiJXMiLCAmcmVwKTsKCiAgICBpZihzdHJjbXAocmVwLCAiUkVHSVNURVIiKSA9PSAwKQogICAgICAgIEFCQiA9IHJlZ2lzdHJhcihBQkIpOyAKICAgIGVsc2UgaWYoc3RyY21wKHJlcCwgIlVQREFURSIpID09IDApCiAgICAgICAgQUJCID0gVVBEQVRFKEFCQik7ICAgIAogICAgZWxzZSBpZihzdHJjbXAocmVwLCAiUE9TSVRJT04iKSA9PSAwKQogICAgICAgIHBvc2ljYW8oQUJCKTsKICAgIGVsc2UgaWYoc3RyY21wKHJlcCwgIlJBTkdFIikgPT0gMCkKICAgICAgICBSQU5HRShBQkIpOwogICAgZWxzZSBpZihzdHJjbXAocmVwLCAiVE9QIikgPT0gMCkKICAgICAgICB0b3AoQUJCKTsKICAgIGVsc2UgaWYoc3RyY21wKHJlcCwgIkJPVFRPTSIpID09IDApCiAgICAgICAgQk9UVE9NKEFCQik7CiAgICBlbHNlIGlmKHN0cmNtcChyZXAsICJDT1VOVF9BQk9WRSIpID09IDApewogICAgICAgIGFjID0gY29udF8wMiA9IDA7CiAgICAgICAgc2NhbmYoIiVkIiwgJmFjKTsKICAgICAgICBDT1VOVF9BQk9WRShBQkIsIGFjLCAmY29udF8wMik7CiAgICAgICAgcHJpbnRmKCIlZFxuIiwgY29udF8wMik7CiAgICB9CiAgICBlbHNlIGlmKHN0cmNtcChyZXAsICJDT1VOVF9CRUxPVyIpID09IDApewogICAgICAgIGFjID0gY29udF8wMiA9IDA7CiAgICAgICAgc2NhbmYoIiVkIiwgJmFjKTsKICAgICAgICBDT1VOVF9CRUxPVyhBQkIsIGFjLCAmY29udF8wMik7CiAgICAgICAgcHJpbnRmKCIlZFxuIiwgY29udF8wMik7CiAgICB9CiAgICBjb250Kys7Cn0KCnJldHVybiAwO30=