// File: chhylp123[P]hifiasm/gfa_ut.cpp
// Function: push_integer_seq_exact(ul_vec_t*, ma_ug_t*, unsigned long*, unsigned long, unsigned long*, unsigned int)
void push_integer_seq_exact(ul_vec_t *res, ma_ug_t *ug, uint64_t *seq, uint64_t seq_n, uint64_t *off, uint32_t tid)
{
    if(seq_n <= 0) return;
    uint64_t k, v, ql, ul; uc_block_t *x;
    // fprintf(stderr, "[M::%s::] old_len::%u, new_len::%u\n", __func__, res->rlen, (uint32_t)off[seq_n-1]);
    res->rlen = (uint32_t)off[seq_n-1]; res->bb.n = 0; kv_resize(uc_block_t, res->bb, seq_n);
    for (k = 0; k < seq_n; k++) {
        v = (uint32_t)seq[k];
        kv_pushp(uc_block_t, res->bb, &x);
        x->hid = v>>1; x->rev = !!(v&1); x->pchain = 1; x->el = 1; x->base = 0;
        x->qs = off[k]>>32; x->qe = (uint32_t)off[k]; 
        ql = x->qe - x->qs; ul = ug->g->seq[x->hid].len;
        if((ul == ql) || (k > 0 && k + 1 < seq_n)) {
            x->ts = 0; x->te = ul;
        } else {
            // if(!(k == 0 || k + 1 == seq_n)){
            //     fprintf(stderr, "[M::%s::] k::%lu, ql::%lu, ul::%lu\n", __func__, k, ql, ul);
            // }
            // assert(k == 0 || k + 1 == seq_n);
            if(k == 0) {
                if(x->rev) {
                    x->ts = 0; x->te = MIN(ql, ul);                 
                } else {
                    x->ts = ul - MIN(ql, ul); x->te = ul;
                }
            }

            if(k + 1 == seq_n) {
                if(!x->rev) {
                    x->ts = 0; x->te = MIN(ql, ul);
                } else {
                    x->ts = ul - MIN(ql, ul); x->te = ul;
                }
            }
        }
        x->pidx = x->aidx = x->pdis = (uint32_t)-1;
        if(k > 0 && (seq[k]&((uint64_t)(0x8000000000000000)))) {
            x->pidx = k - 1; x->pdis = (seq[k]<<1)>>33;
            res->bb.a[x->pidx].aidx = k;
        }
    }
    assert(res->rlen == x->qe);
    // res->rlen = ((uint32_t)-1) - tid;
    // print_primary_ul_chain(NULL, res, ug);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x90, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq %r8, -0x28(%rbp)
movl %r9d, -0x2c(%rbp)
cmpq $0x0, -0x20(%rbp)
ja 0x33ac1f
jmp 0x33b0f6
movq -0x28(%rbp), %rax
movq -0x20(%rbp), %rcx
subq $0x1, %rcx
movq (%rax,%rcx,8), %rax
movl %eax, %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x18(%rax)
movq -0x8(%rbp), %rax
movq $0x0, 0x20(%rax)
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
cmpq -0x20(%rbp), %rax
jae 0x33ad1a
movq -0x20(%rbp), %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x28(%rax)
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rcx
addq $-0x1, %rcx
movq %rcx, 0x28(%rax)
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rcx
shrq %rcx
movq -0x8(%rbp), %rax
orq 0x28(%rax), %rcx
movq %rcx, 0x28(%rax)
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rcx
shrq $0x2, %rcx
movq -0x8(%rbp), %rax
orq 0x28(%rax), %rcx
movq %rcx, 0x28(%rax)
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rcx
shrq $0x4, %rcx
movq -0x8(%rbp), %rax
orq 0x28(%rax), %rcx
movq %rcx, 0x28(%rax)
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rcx
shrq $0x8, %rcx
movq -0x8(%rbp), %rax
orq 0x28(%rax), %rcx
movq %rcx, 0x28(%rax)
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rcx
shrq $0x10, %rcx
movq -0x8(%rbp), %rax
orq 0x28(%rax), %rcx
movq %rcx, 0x28(%rax)
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x28(%rax)
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rdi
movq -0x8(%rbp), %rax
imulq $0x24, 0x28(%rax), %rsi
callq 0x2360
movq %rax, %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x30(%rax)
jmp 0x33ad1c
movq $0x0, -0x38(%rbp)
movq -0x38(%rbp), %rax
cmpq -0x20(%rbp), %rax
jae 0x33b0c5
movq -0x18(%rbp), %rax
movq -0x38(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movl %eax, %eax
movq %rax, -0x40(%rbp)
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
movq -0x8(%rbp), %rcx
cmpq 0x28(%rcx), %rax
jne 0x33adaa
movq -0x8(%rbp), %rax
cmpq $0x0, 0x28(%rax)
je 0x33ad72
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rax
shlq %rax
movq %rax, -0x60(%rbp)
jmp 0x33ad7d
movl $0x2, %eax
movq %rax, -0x60(%rbp)
jmp 0x33ad7d
movq -0x60(%rbp), %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x28(%rax)
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rdi
movq -0x8(%rbp), %rax
imulq $0x24, 0x28(%rax), %rsi
callq 0x2360
movq %rax, %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x30(%rax)
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rax
movq -0x8(%rbp), %rdx
movq 0x20(%rdx), %rcx
movq %rcx, %rsi
addq $0x1, %rsi
movq %rsi, 0x20(%rdx)
imulq $0x24, %rcx, %rcx
addq %rcx, %rax
movq %rax, -0x58(%rbp)
movq -0x40(%rbp), %rax
shrq %rax
movl %eax, %ecx
movq -0x58(%rbp), %rax
movl %ecx, (%rax)
movq -0x40(%rbp), %rax
andq $0x1, %rax
cmpq $0x0, %rax
setne %dl
xorb $-0x1, %dl
xorb $-0x1, %dl
andb $0x1, %dl
movq -0x58(%rbp), %rax
movb 0x20(%rax), %cl
andb $0x1, %dl
shlb $0x5, %dl
andb $-0x21, %cl
orb %dl, %cl
movb %cl, 0x20(%rax)
movq -0x58(%rbp), %rax
movb 0x20(%rax), %cl
andb $-0x20, %cl
orb $0x1, %cl
movb %cl, 0x20(%rax)
movq -0x58(%rbp), %rax
movb 0x20(%rax), %cl
andb $0x7f, %cl
orb $-0x80, %cl
movb %cl, 0x20(%rax)
movq -0x58(%rbp), %rax
movb 0x20(%rax), %cl
andb $-0x41, %cl
orb $0x0, %cl
movb %cl, 0x20(%rax)
movq -0x28(%rbp), %rax
movq -0x38(%rbp), %rcx
movq (%rax,%rcx,8), %rax
shrq $0x20, %rax
movl %eax, %ecx
movq -0x58(%rbp), %rax
movl %ecx, 0x4(%rax)
movq -0x28(%rbp), %rax
movq -0x38(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movl %eax, %ecx
movq -0x58(%rbp), %rax
movl %ecx, 0x8(%rax)
movq -0x58(%rbp), %rax
movl 0x8(%rax), %eax
movq -0x58(%rbp), %rcx
subl 0x4(%rcx), %eax
movl %eax, %eax
movq %rax, -0x48(%rbp)
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x20(%rax), %rax
movq -0x58(%rbp), %rcx
movl (%rcx), %ecx
movl (%rax,%rcx,8), %eax
andl $0x7fffffff, %eax       # imm = 0x7FFFFFFF
movl %eax, %eax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rax
cmpq -0x48(%rbp), %rax
je 0x33aebd
cmpq $0x0, -0x38(%rbp)
jbe 0x33aeda
movq -0x38(%rbp), %rax
addq $0x1, %rax
cmpq -0x20(%rbp), %rax
jae 0x33aeda
movq -0x58(%rbp), %rax
movl $0x0, 0xc(%rax)
movq -0x50(%rbp), %rax
movl %eax, %ecx
movq -0x58(%rbp), %rax
movl %ecx, 0x10(%rax)
jmp 0x33b022
cmpq $0x0, -0x38(%rbp)
jne 0x33af72
movq -0x58(%rbp), %rax
movb 0x20(%rax), %al
shrb $0x5, %al
andb $0x1, %al
cmpb $0x0, %al
je 0x33af2b
movq -0x58(%rbp), %rax
movl $0x0, 0xc(%rax)
movq -0x48(%rbp), %rax
cmpq -0x50(%rbp), %rax
ja 0x33af14
movq -0x48(%rbp), %rax
movq %rax, -0x68(%rbp)
jmp 0x33af1c
movq -0x50(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x68(%rbp), %rax
movl %eax, %ecx
movq -0x58(%rbp), %rax
movl %ecx, 0x10(%rax)
jmp 0x33af70
movq -0x50(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x48(%rbp), %rax
cmpq -0x50(%rbp), %rax
ja 0x33af47
movq -0x48(%rbp), %rax
movq %rax, -0x78(%rbp)
jmp 0x33af4f
movq -0x50(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x70(%rbp), %rax
movq -0x78(%rbp), %rcx
subq %rcx, %rax
movl %eax, %ecx
movq -0x58(%rbp), %rax
movl %ecx, 0xc(%rax)
movq -0x50(%rbp), %rax
movl %eax, %ecx
movq -0x58(%rbp), %rax
movl %ecx, 0x10(%rax)
jmp 0x33af72
movq -0x38(%rbp), %rax
addq $0x1, %rax
cmpq -0x20(%rbp), %rax
jne 0x33b020
movq -0x58(%rbp), %rax
movb 0x20(%rax), %al
shrb $0x5, %al
andb $0x1, %al
cmpb $0x0, %al
jne 0x33afca
movq -0x58(%rbp), %rax
movl $0x0, 0xc(%rax)
movq -0x48(%rbp), %rax
cmpq -0x50(%rbp), %rax
ja 0x33afb3
movq -0x48(%rbp), %rax
movq %rax, -0x80(%rbp)
jmp 0x33afbb
movq -0x50(%rbp), %rax
movq %rax, -0x80(%rbp)
movq -0x80(%rbp), %rax
movl %eax, %ecx
movq -0x58(%rbp), %rax
movl %ecx, 0x10(%rax)
jmp 0x33b01e
movq -0x50(%rbp), %rax
movq %rax, -0x88(%rbp)
movq -0x48(%rbp), %rax
cmpq -0x50(%rbp), %rax
ja 0x33afec
movq -0x48(%rbp), %rax
movq %rax, -0x90(%rbp)
jmp 0x33aff7
movq -0x50(%rbp), %rax
movq %rax, -0x90(%rbp)
movq -0x88(%rbp), %rax
movq -0x90(%rbp), %rcx
subq %rcx, %rax
movl %eax, %ecx
movq -0x58(%rbp), %rax
movl %ecx, 0xc(%rax)
movq -0x50(%rbp), %rax
movl %eax, %ecx
movq -0x58(%rbp), %rax
movl %ecx, 0x10(%rax)
jmp 0x33b020
jmp 0x33b022
movq -0x58(%rbp), %rax
movl $0xffffffff, 0x18(%rax) # imm = 0xFFFFFFFF
movq -0x58(%rbp), %rax
movl $0xffffffff, 0x1c(%rax) # imm = 0xFFFFFFFF
movq -0x58(%rbp), %rax
movl $0xffffffff, 0x14(%rax) # imm = 0xFFFFFFFF
cmpq $0x0, -0x38(%rbp)
jbe 0x33b0b2
movq -0x18(%rbp), %rcx
movq -0x38(%rbp), %rdx
movabsq $-0x8000000000000000, %rax # imm = 0x8000000000000000
andq (%rcx,%rdx,8), %rax
cmpq $0x0, %rax
je 0x33b0b2
movq -0x38(%rbp), %rax
subq $0x1, %rax
movl %eax, %ecx
movq -0x58(%rbp), %rax
movl %ecx, 0x14(%rax)
movq -0x18(%rbp), %rax
movq -0x38(%rbp), %rcx
movq (%rax,%rcx,8), %rax
shlq %rax
shrq $0x21, %rax
movl %eax, %ecx
movq -0x58(%rbp), %rax
movl %ecx, 0x18(%rax)
movq -0x38(%rbp), %rax
movl %eax, %ecx
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rax
movq -0x58(%rbp), %rdx
movl 0x14(%rdx), %edx
imulq $0x24, %rdx, %rdx
addq %rdx, %rax
movl %ecx, 0x1c(%rax)
jmp 0x33b0b4
movq -0x38(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x38(%rbp)
jmp 0x33ad24
movq -0x8(%rbp), %rax
movl 0x18(%rax), %eax
movq -0x58(%rbp), %rcx
cmpl 0x8(%rcx), %eax
jne 0x33b0d7
jmp 0x33b0f6
leaq 0x5d527(%rip), %rdi     # 0x398605
leaq 0x5b0d4(%rip), %rsi     # 0x3961b9
movl $0x1cb5, %edx           # imm = 0x1CB5
leaq 0x5d527(%rip), %rcx     # 0x398618
callq 0x2130
addq $0x90, %rsp
popq %rbp
retq
nop