if (p->trb_color == TRB_BLACK)
  {
    for (; k > 1; k--)
      {
        if (pa[k - 1]->trb_tag[da[k - 1]] == TRB_CHILD)
          {
            struct trb_node *x = pa[k - 1]->trb_link[da[k - 1]];
            if (x->trb_color == TRB_RED)
              {
                x->trb_color = TRB_BLACK;
                break;
              }
          }

        if (da[k - 1] == 0)
          {
            struct trb_node *w = pa[k - 1]->trb_link[1];

            if (w->trb_color == TRB_RED)
              {
                w->trb_color = TRB_BLACK;
                pa[k - 1]->trb_color = TRB_RED;

                pa[k - 1]->trb_link[1] = w->trb_link[0];
                w->trb_link[0] = pa[k - 1];
                pa[k - 2]->trb_link[da[k - 2]] = w;

                pa[k] = pa[k - 1];
                da[k] = 0;
                pa[k - 1] = w;
                k++;

                w = pa[k - 1]->trb_link[1];
              }

            if ((w->trb_tag[0] == TRB_THREAD
                 || w->trb_link[0]->trb_color == TRB_BLACK)
                && (w->trb_tag[1] == TRB_THREAD
                    || w->trb_link[1]->trb_color == TRB_BLACK))
              {
                w->trb_color = TRB_RED;
              }
            else
              {
                if (w->trb_tag[1] == TRB_THREAD
                    || w->trb_link[1]->trb_color == TRB_BLACK)
                  {
                    struct trb_node *y = w->trb_link[0];
                    y->trb_color = TRB_BLACK;
                    w->trb_color = TRB_RED;
                    w->trb_link[0] = y->trb_link[1];
                    y->trb_link[1] = w;
                    w = pa[k - 1]->trb_link[1] = y;

                    if (w->trb_tag[1] == TRB_THREAD)
                      {
                        w->trb_tag[1] = TRB_CHILD;
                        w->trb_link[1]->trb_tag[0] = TRB_THREAD;
                        w->trb_link[1]->trb_link[0] = w;
                      }
                  }

                w->trb_color = pa[k - 1]->trb_color;
                pa[k - 1]->trb_color = TRB_BLACK;
                w->trb_link[1]->trb_color = TRB_BLACK;

                pa[k - 1]->trb_link[1] = w->trb_link[0];
                w->trb_link[0] = pa[k - 1];
                pa[k - 2]->trb_link[da[k - 2]] = w;

                if (w->trb_tag[0] == TRB_THREAD)
                  {
                    w->trb_tag[0] = TRB_CHILD;
                    pa[k - 1]->trb_tag[1] = TRB_THREAD;
                    pa[k - 1]->trb_link[1] = w;
                  }
                break;
              }
          }
        else
          {
            struct trb_node *w = pa[k - 1]->trb_link[0];

            if (w->trb_color == TRB_RED)
              {
                w->trb_color = TRB_BLACK;
                pa[k - 1]->trb_color = TRB_RED;

                pa[k - 1]->trb_link[0] = w->trb_link[1];
                w->trb_link[1] = pa[k - 1];
                pa[k - 2]->trb_link[da[k - 2]] = w;

                pa[k] = pa[k - 1];
                da[k] = 1;
                pa[k - 1] = w;
                k++;

                w = pa[k - 1]->trb_link[0];
              }

            if ((w->trb_tag[0] == TRB_THREAD
                 || w->trb_link[0]->trb_color == TRB_BLACK)
                && (w->trb_tag[1] == TRB_THREAD
                    || w->trb_link[1]->trb_color == TRB_BLACK))
              {
                w->trb_color = TRB_RED;
              }
            else
              {
                if (w->trb_tag[0] == TRB_THREAD
                    || w->trb_link[0]->trb_color == TRB_BLACK)
                  {
                    struct trb_node *y = w->trb_link[1];
                    y->trb_color = TRB_BLACK;
                    w->trb_color = TRB_RED;
                    w->trb_link[1] = y->trb_link[0];
                    y->trb_link[0] = w;
                    w = pa[k - 1]->trb_link[0] = y;

                    if (w->trb_tag[0] == TRB_THREAD)
                      {
                        w->trb_tag[0] = TRB_CHILD;
                        w->trb_link[0]->trb_tag[1] = TRB_THREAD;
                        w->trb_link[0]->trb_link[1] = w;
                      }
                  }

                w->trb_color = pa[k - 1]->trb_color;
                pa[k - 1]->trb_color = TRB_BLACK;
                w->trb_link[0]->trb_color = TRB_BLACK;

                pa[k - 1]->trb_link[0] = w->trb_link[1];
                w->trb_link[1] = pa[k - 1];
                pa[k - 2]->trb_link[da[k - 2]] = w;

                if (w->trb_tag[1] == TRB_THREAD)
                  {
                    w->trb_tag[1] = TRB_CHILD;
                    pa[k - 1]->trb_tag[0] = TRB_THREAD;
                    pa[k - 1]->trb_link[0] = w;
                  }
                break;
              }
          }
      }

    if (tree->trb_root != NULL)
      tree->trb_root->trb_color = TRB_BLACK;
  }

