// File: chhylp123[P]hifiasm/gfa_ut.cpp
// Function: integer_realign_g(ul_resolve_t*, usg_t*, uinfo_srt_warp_t*, unsigned int, integer_t*)
void integer_realign_g(ul_resolve_t *uidx, usg_t *ng, uinfo_srt_warp_t *seq, uint32_t seq_id, integer_t *buf)
{
    if(seq->n < 2) return;
    // if(seq_id != 1137) return;
    uint64_t *srt, *track, k, z, m, t, i, l, seq_n, j, sc, csc, mm_sc, mm_idx, n_v, n_u, n_v0, *p, lin, pn;
    uint32_t vi, vj; mmap_t *zm, *zt; 
    ///ng->map: the nodes in the new graph that are mapped to the initial HiFi graph 
    for (i = seq_n = 0; i < seq->n; ++i) seq_n += ng->mp.a[seq->a[i].v>>1].n;
    // fprintf(stderr, "[M::%s::] seq_id::%u, seq_n::%u, seq->n::%u\n", 
    // __func__, seq_id, (uint32_t)seq_n, (uint32_t)seq->n);

    buf->o.n = buf->u.n = 0; 
    kv_resize(uint64_t, buf->o, (seq_n<<1)); 
    srt = buf->o.a; track = buf->o.a + seq_n;

    for (z = l = 0; z < seq->n; ++z) {
        csc = seq->a[z].n; 
        zm = &(ng->mp.a[seq->a[z].v>>1]);///current 
        zt = ((z>0)?(&(ng->mp.a[seq->a[z-1].v>>1])):(NULL));///prefix
        for (m = 0; m < zm->n; m++) {
            i = l + m; mm_sc = csc; mm_idx = ((uint64_t)0x7FFFFFFF); 
            vi = (zm->a[m]<<1)|(seq->a[z].v&1);
            if(zt && zt->n > 0) {
                for (t = 0; t < zt->n; t++) {
                    j = l + t - zt->n;
                    vj = (zt->a[t]<<1)|(seq->a[z-1].v&1);
                    if(check_hybrid_connect(ng, seq_id, vj, z-1, vi, z)) {///seq_id:: integer contig id
                        sc = csc + (((uint32_t)-1) - (track[j]>>32));
                        if(sc > mm_sc) {
                            mm_sc = sc; mm_idx = j;
                        }
                    }
                }
            }
            mm_sc = ((uint32_t)-1) - mm_sc;
            track[i] = mm_sc; track[i] <<= 32; track[i] |= mm_idx;
            srt[i] = track[i]>>32; srt[i] <<= 32; srt[i] |= i;
        }
        l += zm->n;
    }
    assert(l == seq_n);

    radix_sort_srt64(srt, srt + seq_n); 
    kv_resize(uint64_t, buf->res_dump, buf->res_dump.n + seq_n); 
    l = buf->res_dump.n; m = buf->u.n;
    for (k = n_v = n_u = 0; k < seq_n; k++) {
        n_v0 = n_v; i = (uint32_t)srt[k];
        for (; i != ((uint64_t)0x7FFFFFFF) && (!(track[i]&((uint64_t)0x80000000)));) {
            kv_push(uint64_t, buf->res_dump, i); n_v++; 
            track[i] |= ((uint64_t)0x80000000);
            i = track[i]&((uint64_t)0x7FFFFFFF); 
        }
        if(n_v - n_v0 <= 1) {///not useful to resolve anything if the UL covers less than 1 nodes 
            buf->res_dump.n -= (n_v-n_v0); n_v = n_v0;
            continue;
        }
        kv_pushp(uint64_t, buf->u, &p); n_u++; 
        (*p) = n_v-n_v0; (*p) = ((uint32_t)-1) - (*p); (*p) <<= 32; (*p) |= ((uint64_t)(l+n_v0));
    }

    for (z = i = 0; z < seq->n; ++z) {
        zm = &(ng->mp.a[seq->a[z].v>>1]);
        for (k = 0; k < zm->n; k++, i++) {
            srt[i] = z; srt[i] <<= 32; srt[i] |= ((zm->a[k]<<1)|(seq->a[z].v&1));
        }
    }
    assert(i == seq_n);
    ///srt[]: (idx in seq)|(node id)
    uint64_t *r, nt;
    for (k = n_u = nt = 0; k < buf->u.n; k++) {
        n_v0 = (uint32_t)buf->u.a[k]; r = buf->res_dump.a + n_v0; 
        n_v = (((uint32_t)-1) - (buf->u.a[k]>>32));
        // if(n_v < 2) continue;
        // fprintf(stderr, "+[M::%s::k->%lu] buf->u.n::%u, n_v0::%lu, n_v::%lu, nt::%lu\n", 
        // __func__, k, (uint32_t)buf->u.n, n_v0, n_v, nt);
        assert(n_v >= 2);
        buf->u.a[n_u] = nt<<32;
        for (i = 0; i < n_v; i++, nt++) {
            // fprintf(stderr, ">[M::%s::] i::%lu, nt::%lu, n_v-i-1::%lu, r[n_v-i-1]::%lu\n", 
            //         __func__, i, nt, n_v-i-1, r[n_v-i-1]);
            track[nt] = srt[r[n_v-i-1]];
        }
        buf->u.a[n_u] |= nt; n_u++;
        // fprintf(stderr, "-[M::%s::k->%lu] buf->u.n::%u, n_v0::%lu, n_v::%lu, nt::%lu\n", 
        // __func__, k, (uint32_t)buf->u.n, n_v0, n_v, nt);
    }
    buf->u.n = n_u;

    uint64_t ceq_s, ceq_e, peq_s, peq_e, min_e, max_s;
    for (k = n_u = 0; k < buf->u.n; k++) {
        n_v0 = buf->u.a[k]>>32; n_v = (uint32_t)buf->u.a[k];///[n_v0, n_v)
        ceq_s = track[n_v0]>>32; ceq_e = (track[n_v-1]>>32) + 1;
        assert((ceq_e-ceq_s) == (n_v-n_v0));
        for (z = 0; z < n_u; z++) {
            n_v0 = buf->u.a[z]>>32; n_v = (uint32_t)buf->u.a[z];
            peq_s = track[n_v0]>>32; peq_e = (track[n_v-1]>>32) + 1;
            assert((peq_e-peq_s) == (n_v-n_v0));
            max_s = MAX(peq_s, ceq_s); min_e = MIN(peq_e, ceq_e);
            if(min_e > max_s) break;
        }
        if(z < n_u) continue;
        buf->u.a[n_u++] = buf->u.a[k];
    }
    buf->u.n = n_u; buf->res_dump.n = l;
    for (k = n_u = 0; k < buf->u.n; k++) {
        // t = (uint32_t)-1; t <<= 32; 
        t = seq_id; t <<= 32; t |= ((uint64_t)0x8000000000000000);
        t |= (((uint32_t)buf->u.a[k])-(buf->u.a[k]>>32)); 
        pn = buf->res_dump.n; kv_push(uint64_t, buf->res_dump, t);
        n_v0 = buf->u.a[k]>>32; n_v = (uint32_t)buf->u.a[k];
        for (z = n_v0, lin = 1; z < n_v; z++) {
            if(lin && (z > n_v0)) {
                if((usg_arc_occ(ng, ((uint32_t)track[z])^1) > 1) || 
                            (usg_arc_occ(ng, ((uint32_t)track[z-1])) > 1)) {
                    lin = 0;
                }
            }
            kv_push(uint64_t, buf->res_dump, (uint32_t)track[z]);
        }

        if(lin == 1) buf->res_dump.n = pn;
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x160, %rsp            # imm = 0x160
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movl %ecx, -0x1c(%rbp)
movq %r8, -0x28(%rbp)
movq -0x18(%rbp), %rax
cmpq $0x2, (%rax)
jae 0x354b3d
jmp 0x355d80
movq $0x0, -0x70(%rbp)
movq $0x0, -0x60(%rbp)
movq -0x60(%rbp), %rax
movq -0x18(%rbp), %rcx
cmpq (%rcx), %rax
jae 0x354b9c
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x18(%rbp), %rcx
movq 0x10(%rcx), %rcx
movq -0x60(%rbp), %rdx
shlq $0x4, %rdx
addq %rdx, %rcx
movl (%rcx), %ecx
shrl %ecx
movl %ecx, %ecx
imulq $0x18, %rcx, %rcx
addq %rcx, %rax
movq 0x8(%rax), %rax
addq -0x70(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x60(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x60(%rbp)
jmp 0x354b4d
movq -0x28(%rbp), %rax
movq $0x0, 0x90(%rax)
movq -0x28(%rbp), %rax
movq $0x0, 0x78(%rax)
movq -0x28(%rbp), %rax
movq 0x80(%rax), %rax
movq -0x70(%rbp), %rcx
shlq %rcx
cmpq %rcx, %rax
jae 0x354ce1
movq -0x70(%rbp), %rcx
shlq %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x80(%rax)
movq -0x28(%rbp), %rax
movq 0x80(%rax), %rcx
addq $-0x1, %rcx
movq %rcx, 0x80(%rax)
movq -0x28(%rbp), %rax
movq 0x80(%rax), %rcx
shrq %rcx
movq -0x28(%rbp), %rax
orq 0x80(%rax), %rcx
movq %rcx, 0x80(%rax)
movq -0x28(%rbp), %rax
movq 0x80(%rax), %rcx
shrq $0x2, %rcx
movq -0x28(%rbp), %rax
orq 0x80(%rax), %rcx
movq %rcx, 0x80(%rax)
movq -0x28(%rbp), %rax
movq 0x80(%rax), %rcx
shrq $0x4, %rcx
movq -0x28(%rbp), %rax
orq 0x80(%rax), %rcx
movq %rcx, 0x80(%rax)
movq -0x28(%rbp), %rax
movq 0x80(%rax), %rcx
shrq $0x8, %rcx
movq -0x28(%rbp), %rax
orq 0x80(%rax), %rcx
movq %rcx, 0x80(%rax)
movq -0x28(%rbp), %rax
movq 0x80(%rax), %rcx
shrq $0x10, %rcx
movq -0x28(%rbp), %rax
orq 0x80(%rax), %rcx
movq %rcx, 0x80(%rax)
movq -0x28(%rbp), %rax
movq 0x80(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x80(%rax)
movq -0x28(%rbp), %rax
movq 0x88(%rax), %rdi
movq -0x28(%rbp), %rax
movq 0x80(%rax), %rsi
shlq $0x3, %rsi
callq 0x2360
movq %rax, %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x88(%rax)
jmp 0x354ce3
movq -0x28(%rbp), %rax
movq 0x88(%rax), %rax
movq %rax, -0x30(%rbp)
movq -0x28(%rbp), %rax
movq 0x88(%rax), %rax
movq -0x70(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq %rax, -0x38(%rbp)
movq $0x0, -0x68(%rbp)
movq $0x0, -0x48(%rbp)
movq -0x48(%rbp), %rax
movq -0x18(%rbp), %rcx
cmpq (%rcx), %rax
jae 0x355027
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rax
movq -0x48(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movl 0xc(%rax), %eax
movq %rax, -0x88(%rbp)
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x18(%rbp), %rcx
movq 0x10(%rcx), %rcx
movq -0x48(%rbp), %rdx
shlq $0x4, %rdx
addq %rdx, %rcx
movl (%rcx), %ecx
shrl %ecx
movl %ecx, %ecx
imulq $0x18, %rcx, %rcx
addq %rcx, %rax
movq %rax, -0xd8(%rbp)
cmpq $0x0, -0x48(%rbp)
jbe 0x354db5
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x18(%rbp), %rcx
movq 0x10(%rcx), %rcx
movq -0x48(%rbp), %rdx
subq $0x1, %rdx
shlq $0x4, %rdx
addq %rdx, %rcx
movl (%rcx), %ecx
shrl %ecx
movl %ecx, %ecx
imulq $0x18, %rcx, %rcx
addq %rcx, %rax
movq %rax, -0x128(%rbp)
jmp 0x354dc0
xorl %eax, %eax
movq %rax, -0x128(%rbp)
jmp 0x354dc0
movq -0x128(%rbp), %rax
movq %rax, -0xe0(%rbp)
movq $0x0, -0x50(%rbp)
movq -0x50(%rbp), %rax
movq -0xd8(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jae 0x355003
movq -0x68(%rbp), %rax
addq -0x50(%rbp), %rax
movq %rax, -0x60(%rbp)
movq -0x88(%rbp), %rax
movq %rax, -0x90(%rbp)
movq $0x7fffffff, -0x98(%rbp) # imm = 0x7FFFFFFF
movq -0xd8(%rbp), %rax
movq (%rax), %rax
movq -0x50(%rbp), %rcx
movl (%rax,%rcx,4), %eax
shll %eax
movq -0x18(%rbp), %rcx
movq 0x10(%rcx), %rcx
movq -0x48(%rbp), %rdx
shlq $0x4, %rdx
addq %rdx, %rcx
movl (%rcx), %ecx
andl $0x1, %ecx
orl %ecx, %eax
movl %eax, -0xcc(%rbp)
cmpq $0x0, -0xe0(%rbp)
je 0x354f5d
movq -0xe0(%rbp), %rax
cmpq $0x0, 0x8(%rax)
jbe 0x354f5d
movq $0x0, -0x58(%rbp)
movq -0x58(%rbp), %rax
movq -0xe0(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jae 0x354f5b
movq -0x68(%rbp), %rax
addq -0x58(%rbp), %rax
movq -0xe0(%rbp), %rcx
subq 0x8(%rcx), %rax
movq %rax, -0x78(%rbp)
movq -0xe0(%rbp), %rax
movq (%rax), %rax
movq -0x58(%rbp), %rcx
movl (%rax,%rcx,4), %eax
shll %eax
movq -0x18(%rbp), %rcx
movq 0x10(%rcx), %rcx
movq -0x48(%rbp), %rdx
subq $0x1, %rdx
shlq $0x4, %rdx
addq %rdx, %rcx
movl (%rcx), %ecx
andl $0x1, %ecx
orl %ecx, %eax
movl %eax, -0xd0(%rbp)
movq -0x10(%rbp), %rdi
movl -0x1c(%rbp), %esi
movl -0xd0(%rbp), %edx
movq -0x48(%rbp), %rax
subq $0x1, %rax
movl %eax, %ecx
movl -0xcc(%rbp), %r8d
movq -0x48(%rbp), %rax
movl %eax, %r9d
callq 0x354980
cmpl $0x0, %eax
je 0x354f48
movq -0x88(%rbp), %rax
movq -0x38(%rbp), %rcx
movq -0x78(%rbp), %rdx
movq (%rcx,%rdx,8), %rdx
shrq $0x20, %rdx
movl $0xffffffff, %ecx       # imm = 0xFFFFFFFF
subq %rdx, %rcx
addq %rcx, %rax
movq %rax, -0x80(%rbp)
movq -0x80(%rbp), %rax
cmpq -0x90(%rbp), %rax
jbe 0x354f46
movq -0x80(%rbp), %rax
movq %rax, -0x90(%rbp)
movq -0x78(%rbp), %rax
movq %rax, -0x98(%rbp)
jmp 0x354f48
jmp 0x354f4a
movq -0x58(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x58(%rbp)
jmp 0x354e6b
jmp 0x354f5d
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
subq -0x90(%rbp), %rax
movq %rax, -0x90(%rbp)
movq -0x90(%rbp), %rdx
movq -0x38(%rbp), %rax
movq -0x60(%rbp), %rcx
movq %rdx, (%rax,%rcx,8)
movq -0x38(%rbp), %rax
movq -0x60(%rbp), %rcx
movq (%rax,%rcx,8), %rdx
shlq $0x20, %rdx
movq %rdx, (%rax,%rcx,8)
movq -0x98(%rbp), %rdx
movq -0x38(%rbp), %rax
movq -0x60(%rbp), %rcx
orq (%rax,%rcx,8), %rdx
movq %rdx, (%rax,%rcx,8)
movq -0x38(%rbp), %rax
movq -0x60(%rbp), %rcx
movq (%rax,%rcx,8), %rdx
shrq $0x20, %rdx
movq -0x30(%rbp), %rax
movq -0x60(%rbp), %rcx
movq %rdx, (%rax,%rcx,8)
movq -0x30(%rbp), %rax
movq -0x60(%rbp), %rcx
movq (%rax,%rcx,8), %rdx
shlq $0x20, %rdx
movq %rdx, (%rax,%rcx,8)
movq -0x60(%rbp), %rdx
movq -0x30(%rbp), %rax
movq -0x60(%rbp), %rcx
orq (%rax,%rcx,8), %rdx
movq %rdx, (%rax,%rcx,8)
movq -0x50(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x50(%rbp)
jmp 0x354dd6
movq -0xd8(%rbp), %rax
movq 0x8(%rax), %rax
addq -0x68(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x48(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x48(%rbp)
jmp 0x354d1c
movq -0x68(%rbp), %rax
cmpq -0x70(%rbp), %rax
jne 0x355033
jmp 0x355052
leaq 0x44413(%rip), %rdi     # 0x39944d
leaq 0x41178(%rip), %rsi     # 0x3961b9
movl $0x2eb6, %edx           # imm = 0x2EB6
leaq 0x4440b(%rip), %rcx     # 0x399458
callq 0x2130
movq -0x30(%rbp), %rdi
movq -0x30(%rbp), %rsi
movq -0x70(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rsi
callq 0x30ed90
movq -0x28(%rbp), %rax
movq 0x308(%rax), %rax
movq -0x28(%rbp), %rcx
movq 0x300(%rcx), %rcx
addq -0x70(%rbp), %rcx
cmpq %rcx, %rax
jae 0x3551a4
movq -0x28(%rbp), %rax
movq 0x300(%rax), %rcx
addq -0x70(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x308(%rax)
movq -0x28(%rbp), %rax
movq 0x308(%rax), %rcx
addq $-0x1, %rcx
movq %rcx, 0x308(%rax)
movq -0x28(%rbp), %rax
movq 0x308(%rax), %rcx
shrq %rcx
movq -0x28(%rbp), %rax
orq 0x308(%rax), %rcx
movq %rcx, 0x308(%rax)
movq -0x28(%rbp), %rax
movq 0x308(%rax), %rcx
shrq $0x2, %rcx
movq -0x28(%rbp), %rax
orq 0x308(%rax), %rcx
movq %rcx, 0x308(%rax)
movq -0x28(%rbp), %rax
movq 0x308(%rax), %rcx
shrq $0x4, %rcx
movq -0x28(%rbp), %rax
orq 0x308(%rax), %rcx
movq %rcx, 0x308(%rax)
movq -0x28(%rbp), %rax
movq 0x308(%rax), %rcx
shrq $0x8, %rcx
movq -0x28(%rbp), %rax
orq 0x308(%rax), %rcx
movq %rcx, 0x308(%rax)
movq -0x28(%rbp), %rax
movq 0x308(%rax), %rcx
shrq $0x10, %rcx
movq -0x28(%rbp), %rax
orq 0x308(%rax), %rcx
movq %rcx, 0x308(%rax)
movq -0x28(%rbp), %rax
movq 0x308(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x308(%rax)
movq -0x28(%rbp), %rax
movq 0x310(%rax), %rdi
movq -0x28(%rbp), %rax
movq 0x308(%rax), %rsi
shlq $0x3, %rsi
callq 0x2360
movq %rax, %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x310(%rax)
jmp 0x3551a6
movq -0x28(%rbp), %rax
movq 0x300(%rax), %rax
movq %rax, -0x68(%rbp)
movq -0x28(%rbp), %rax
movq 0x90(%rax), %rax
movq %rax, -0x50(%rbp)
movq $0x0, -0xa8(%rbp)
movq $0x0, -0xa0(%rbp)
movq $0x0, -0x40(%rbp)
movq -0x40(%rbp), %rax
cmpq -0x70(%rbp), %rax
jae 0x3554da
movq -0xa0(%rbp), %rax
movq %rax, -0xb0(%rbp)
movq -0x30(%rbp), %rax
movq -0x40(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movl %eax, %eax
movq %rax, -0x60(%rbp)
xorl %eax, %eax
cmpq $0x7fffffff, -0x60(%rbp) # imm = 0x7FFFFFFF
movb %al, -0x129(%rbp)
je 0x355247
movq -0x38(%rbp), %rcx
movq -0x60(%rbp), %rdx
movabsq $0x80000000, %rax       # imm = 0x80000000
andq (%rcx,%rdx,8), %rax
cmpq $0x0, %rax
setne %al
xorb $-0x1, %al
movb %al, -0x129(%rbp)
movb -0x129(%rbp), %al
testb $0x1, %al
jne 0x355256
jmp 0x355355
jmp 0x355258
movq -0x28(%rbp), %rax
movq 0x300(%rax), %rax
movq -0x28(%rbp), %rcx
cmpq 0x308(%rcx), %rax
jne 0x3552e2
movq -0x28(%rbp), %rax
cmpq $0x0, 0x308(%rax)
je 0x355295
movq -0x28(%rbp), %rax
movq 0x308(%rax), %rax
shlq %rax
movq %rax, -0x138(%rbp)
jmp 0x3552a3
movl $0x2, %eax
movq %rax, -0x138(%rbp)
jmp 0x3552a3
movq -0x138(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x308(%rax)
movq -0x28(%rbp), %rax
movq 0x310(%rax), %rdi
movq -0x28(%rbp), %rax
movq 0x308(%rax), %rsi
shlq $0x3, %rsi
callq 0x2360
movq %rax, %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x310(%rax)
movq -0x60(%rbp), %rdx
movq -0x28(%rbp), %rax
movq 0x310(%rax), %rax
movq -0x28(%rbp), %rsi
movq 0x300(%rsi), %rcx
movq %rcx, %rdi
addq $0x1, %rdi
movq %rdi, 0x300(%rsi)
movq %rdx, (%rax,%rcx,8)
movq -0xa0(%rbp), %rax
addq $0x1, %rax
movq %rax, -0xa0(%rbp)
movq -0x38(%rbp), %rax
movq -0x60(%rbp), %rcx
movabsq $0x80000000, %rdx       # imm = 0x80000000
orq (%rax,%rcx,8), %rdx
movq %rdx, (%rax,%rcx,8)
movq -0x38(%rbp), %rax
movq -0x60(%rbp), %rcx
movq (%rax,%rcx,8), %rax
andq $0x7fffffff, %rax       # imm = 0x7FFFFFFF
movq %rax, -0x60(%rbp)
jmp 0x355210
movq -0xa0(%rbp), %rax
subq -0xb0(%rbp), %rax
cmpq $0x1, %rax
ja 0x35539f
movq -0xa0(%rbp), %rdx
subq -0xb0(%rbp), %rdx
movq -0x28(%rbp), %rax
movq 0x300(%rax), %rcx
subq %rdx, %rcx
movq %rcx, 0x300(%rax)
movq -0xb0(%rbp), %rax
movq %rax, -0xa0(%rbp)
jmp 0x3554c9
jmp 0x3553a1
movq -0x28(%rbp), %rax
movq 0x90(%rax), %rax
movq -0x28(%rbp), %rcx
cmpq 0x98(%rcx), %rax
jne 0x35542b
movq -0x28(%rbp), %rax
cmpq $0x0, 0x98(%rax)
je 0x3553de
movq -0x28(%rbp), %rax
movq 0x98(%rax), %rax
shlq %rax
movq %rax, -0x140(%rbp)
jmp 0x3553ec
movl $0x2, %eax
movq %rax, -0x140(%rbp)
jmp 0x3553ec
movq -0x140(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x98(%rax)
movq -0x28(%rbp), %rax
movq 0xa0(%rax), %rdi
movq -0x28(%rbp), %rax
movq 0x98(%rax), %rsi
shlq $0x3, %rsi
callq 0x2360
movq %rax, %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0xa0(%rax)
movq -0x28(%rbp), %rax
movq 0xa0(%rax), %rax
movq -0x28(%rbp), %rdx
movq 0x90(%rdx), %rcx
movq %rcx, %rsi
addq $0x1, %rsi
movq %rsi, 0x90(%rdx)
shlq $0x3, %rcx
addq %rcx, %rax
movq %rax, -0xb8(%rbp)
movq -0xa8(%rbp), %rax
addq $0x1, %rax
movq %rax, -0xa8(%rbp)
movq -0xa0(%rbp), %rcx
subq -0xb0(%rbp), %rcx
movq -0xb8(%rbp), %rax
movq %rcx, (%rax)
movq -0xb8(%rbp), %rax
movl $0xffffffff, %ecx       # imm = 0xFFFFFFFF
subq (%rax), %rcx
movq -0xb8(%rbp), %rax
movq %rcx, (%rax)
movq -0xb8(%rbp), %rax
movq (%rax), %rcx
shlq $0x20, %rcx
movq %rcx, (%rax)
movq -0x68(%rbp), %rcx
addq -0xb0(%rbp), %rcx
movq -0xb8(%rbp), %rax
orq (%rax), %rcx
movq %rcx, (%rax)
movq -0x40(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x40(%rbp)
jmp 0x3551e2
movq $0x0, -0x60(%rbp)
movq $0x0, -0x48(%rbp)
movq -0x48(%rbp), %rax
movq -0x18(%rbp), %rcx
cmpq (%rcx), %rax
jae 0x3555dc
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x18(%rbp), %rcx
movq 0x10(%rcx), %rcx
movq -0x48(%rbp), %rdx
shlq $0x4, %rdx
addq %rdx, %rcx
movl (%rcx), %ecx
shrl %ecx
movl %ecx, %ecx
imulq $0x18, %rcx, %rcx
addq %rcx, %rax
movq %rax, -0xd8(%rbp)
movq $0x0, -0x40(%rbp)
movq -0x40(%rbp), %rax
movq -0xd8(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jae 0x3555c9
movq -0x48(%rbp), %rdx
movq -0x30(%rbp), %rax
movq -0x60(%rbp), %rcx
movq %rdx, (%rax,%rcx,8)
movq -0x30(%rbp), %rax
movq -0x60(%rbp), %rcx
movq (%rax,%rcx,8), %rdx
shlq $0x20, %rdx
movq %rdx, (%rax,%rcx,8)
movq -0xd8(%rbp), %rax
movq (%rax), %rax
movq -0x40(%rbp), %rcx
movl (%rax,%rcx,4), %eax
shll %eax
movq -0x18(%rbp), %rcx
movq 0x10(%rcx), %rcx
movq -0x48(%rbp), %rdx
shlq $0x4, %rdx
addq %rdx, %rcx
movl (%rcx), %ecx
andl $0x1, %ecx
orl %ecx, %eax
movl %eax, %eax
movl %eax, %edx
movq -0x30(%rbp), %rax
movq -0x60(%rbp), %rcx
orq (%rax,%rcx,8), %rdx
movq %rdx, (%rax,%rcx,8)
movq -0x40(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x40(%rbp)
movq -0x60(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x60(%rbp)
jmp 0x355532
jmp 0x3555cb
movq -0x48(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x48(%rbp)
jmp 0x3554ea
movq -0x60(%rbp), %rax
cmpq -0x70(%rbp), %rax
jne 0x3555e8
jmp 0x355607
leaq 0x43ec4(%rip), %rdi     # 0x3994b3
leaq 0x40bc3(%rip), %rsi     # 0x3961b9
movl $0x2ed0, %edx           # imm = 0x2ED0
leaq 0x43e56(%rip), %rcx     # 0x399458
callq 0x2130
movq $0x0, -0xf0(%rbp)
movq $0x0, -0xa8(%rbp)
movq $0x0, -0x40(%rbp)
movq -0x40(%rbp), %rax
movq -0x28(%rbp), %rcx
cmpq 0x90(%rcx), %rax
jae 0x355792
movq -0x28(%rbp), %rax
movq 0xa0(%rax), %rax
movq -0x40(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movl %eax, %eax
movq %rax, -0xb0(%rbp)
movq -0x28(%rbp), %rax
movq 0x310(%rax), %rax
movq -0xb0(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq %rax, -0xe8(%rbp)
movq -0x28(%rbp), %rax
movq 0xa0(%rax), %rax
movq -0x40(%rbp), %rcx
movq (%rax,%rcx,8), %rcx
shrq $0x20, %rcx
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
subq %rcx, %rax
movq %rax, -0xa0(%rbp)
cmpq $0x2, -0xa0(%rbp)
jb 0x3556a8
jmp 0x3556c7
leaq 0x43e0f(%rip), %rdi     # 0x3994be
leaq 0x40b03(%rip), %rsi     # 0x3961b9
movl $0x2ed9, %edx           # imm = 0x2ED9
leaq 0x43d96(%rip), %rcx     # 0x399458
callq 0x2130
movq -0xf0(%rbp), %rdx
shlq $0x20, %rdx
movq -0x28(%rbp), %rax
movq 0xa0(%rax), %rax
movq -0xa8(%rbp), %rcx
movq %rdx, (%rax,%rcx,8)
movq $0x0, -0x60(%rbp)
movq -0x60(%rbp), %rax
cmpq -0xa0(%rbp), %rax
jae 0x35574e
movq -0x30(%rbp), %rax
movq -0xe8(%rbp), %rcx
movq -0xa0(%rbp), %rdx
subq -0x60(%rbp), %rdx
subq $0x1, %rdx
movq (%rcx,%rdx,8), %rcx
movq (%rax,%rcx,8), %rdx
movq -0x38(%rbp), %rax
movq -0xf0(%rbp), %rcx
movq %rdx, (%rax,%rcx,8)
movq -0x60(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x60(%rbp)
movq -0xf0(%rbp), %rax
addq $0x1, %rax
movq %rax, -0xf0(%rbp)
jmp 0x3556f0
movq -0xf0(%rbp), %rdx
movq -0x28(%rbp), %rax
movq 0xa0(%rax), %rax
movq -0xa8(%rbp), %rcx
orq (%rax,%rcx,8), %rdx
movq %rdx, (%rax,%rcx,8)
movq -0xa8(%rbp), %rax
addq $0x1, %rax
movq %rax, -0xa8(%rbp)
movq -0x40(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x40(%rbp)
jmp 0x355625
movq -0xa8(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x90(%rax)
movq $0x0, -0xa8(%rbp)
movq $0x0, -0x40(%rbp)
movq -0x40(%rbp), %rax
movq -0x28(%rbp), %rcx
cmpq 0x90(%rcx), %rax
jae 0x355a49
movq -0x28(%rbp), %rax
movq 0xa0(%rax), %rax
movq -0x40(%rbp), %rcx
movq (%rax,%rcx,8), %rax
shrq $0x20, %rax
movq %rax, -0xb0(%rbp)
movq -0x28(%rbp), %rax
movq 0xa0(%rax), %rax
movq -0x40(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movl %eax, %eax
movq %rax, -0xa0(%rbp)
movq -0x38(%rbp), %rax
movq -0xb0(%rbp), %rcx
movq (%rax,%rcx,8), %rax
shrq $0x20, %rax
movq %rax, -0xf8(%rbp)
movq -0x38(%rbp), %rax
movq -0xa0(%rbp), %rcx
subq $0x1, %rcx
movq (%rax,%rcx,8), %rax
shrq $0x20, %rax
addq $0x1, %rax
movq %rax, -0x100(%rbp)
movq -0x100(%rbp), %rax
subq -0xf8(%rbp), %rax
movq -0xa0(%rbp), %rcx
subq -0xb0(%rbp), %rcx
cmpq %rcx, %rax
jne 0x355865
jmp 0x355884
leaq 0x43c5b(%rip), %rdi     # 0x3994c7
leaq 0x40946(%rip), %rsi     # 0x3961b9
movl $0x2eea, %edx           # imm = 0x2EEA
leaq 0x43bd9(%rip), %rcx     # 0x399458
callq 0x2130
movq $0x0, -0x48(%rbp)
movq -0x48(%rbp), %rax
cmpq -0xa8(%rbp), %rax
jae 0x3559f2
movq -0x28(%rbp), %rax
movq 0xa0(%rax), %rax
movq -0x48(%rbp), %rcx
movq (%rax,%rcx,8), %rax
shrq $0x20, %rax
movq %rax, -0xb0(%rbp)
movq -0x28(%rbp), %rax
movq 0xa0(%rax), %rax
movq -0x48(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movl %eax, %eax
movq %rax, -0xa0(%rbp)
movq -0x38(%rbp), %rax
movq -0xb0(%rbp), %rcx
movq (%rax,%rcx,8), %rax
shrq $0x20, %rax
movq %rax, -0x108(%rbp)
movq -0x38(%rbp), %rax
movq -0xa0(%rbp), %rcx
subq $0x1, %rcx
movq (%rax,%rcx,8), %rax
shrq $0x20, %rax
addq $0x1, %rax
movq %rax, -0x110(%rbp)
movq -0x110(%rbp), %rax
subq -0x108(%rbp), %rax
movq -0xa0(%rbp), %rcx
subq -0xb0(%rbp), %rcx
cmpq %rcx, %rax
jne 0x355936
jmp 0x355955
leaq 0x43ba6(%rip), %rdi     # 0x3994e3
leaq 0x40875(%rip), %rsi     # 0x3961b9
movl $0x2eee, %edx           # imm = 0x2EEE
leaq 0x43b08(%rip), %rcx     # 0x399458
callq 0x2130
movq -0x108(%rbp), %rax
cmpq -0xf8(%rbp), %rax
jb 0x355975
movq -0x108(%rbp), %rax
movq %rax, -0x148(%rbp)
jmp 0x355983
movq -0xf8(%rbp), %rax
movq %rax, -0x148(%rbp)
movq -0x148(%rbp), %rax
movq %rax, -0x120(%rbp)
movq -0x110(%rbp), %rax
cmpq -0x100(%rbp), %rax
ja 0x3559b1
movq -0x110(%rbp), %rax
movq %rax, -0x150(%rbp)
jmp 0x3559bf
movq -0x100(%rbp), %rax
movq %rax, -0x150(%rbp)
movq -0x150(%rbp), %rax
movq %rax, -0x118(%rbp)
movq -0x118(%rbp), %rax
cmpq -0x120(%rbp), %rax
jbe 0x3559df
jmp 0x3559f2
jmp 0x3559e1
movq -0x48(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x48(%rbp)
jmp 0x35588c
movq -0x48(%rbp), %rax
cmpq -0xa8(%rbp), %rax
jae 0x355a01
jmp 0x355a38
movq -0x28(%rbp), %rax
movq 0xa0(%rax), %rax
movq -0x40(%rbp), %rcx
movq (%rax,%rcx,8), %rdx
movq -0x28(%rbp), %rax
movq 0xa0(%rax), %rax
movq -0xa8(%rbp), %rcx
movq %rcx, %rsi
addq $0x1, %rsi
movq %rsi, -0xa8(%rbp)
movq %rdx, (%rax,%rcx,8)
movq -0x40(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x40(%rbp)
jmp 0x3557b7
movq -0xa8(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x90(%rax)
movq -0x68(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x300(%rax)
movq $0x0, -0xa8(%rbp)
movq $0x0, -0x40(%rbp)
movq -0x40(%rbp), %rax
movq -0x28(%rbp), %rcx
cmpq 0x90(%rcx), %rax
jae 0x355d80
movl -0x1c(%rbp), %eax
movq %rax, -0x58(%rbp)
movq -0x58(%rbp), %rax
shlq $0x20, %rax
movq %rax, -0x58(%rbp)
movabsq $-0x8000000000000000, %rax # imm = 0x8000000000000000
orq -0x58(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x28(%rbp), %rax
movq 0xa0(%rax), %rax
movq -0x40(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movl %eax, %eax
movq -0x28(%rbp), %rcx
movq 0xa0(%rcx), %rcx
movq -0x40(%rbp), %rdx
movq (%rcx,%rdx,8), %rcx
shrq $0x20, %rcx
subq %rcx, %rax
orq -0x58(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x28(%rbp), %rax
movq 0x300(%rax), %rax
movq %rax, -0xc8(%rbp)
movq -0x28(%rbp), %rax
movq 0x300(%rax), %rax
movq -0x28(%rbp), %rcx
cmpq 0x308(%rcx), %rax
jne 0x355b8a
movq -0x28(%rbp), %rax
cmpq $0x0, 0x308(%rax)
je 0x355b3d
movq -0x28(%rbp), %rax
movq 0x308(%rax), %rax
shlq %rax
movq %rax, -0x158(%rbp)
jmp 0x355b4b
movl $0x2, %eax
movq %rax, -0x158(%rbp)
jmp 0x355b4b
movq -0x158(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x308(%rax)
movq -0x28(%rbp), %rax
movq 0x310(%rax), %rdi
movq -0x28(%rbp), %rax
movq 0x308(%rax), %rsi
shlq $0x3, %rsi
callq 0x2360
movq %rax, %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x310(%rax)
movq -0x58(%rbp), %rdx
movq -0x28(%rbp), %rax
movq 0x310(%rax), %rax
movq -0x28(%rbp), %rsi
movq 0x300(%rsi), %rcx
movq %rcx, %rdi
addq $0x1, %rdi
movq %rdi, 0x300(%rsi)
movq %rdx, (%rax,%rcx,8)
movq -0x28(%rbp), %rax
movq 0xa0(%rax), %rax
movq -0x40(%rbp), %rcx
movq (%rax,%rcx,8), %rax
shrq $0x20, %rax
movq %rax, -0xb0(%rbp)
movq -0x28(%rbp), %rax
movq 0xa0(%rax), %rax
movq -0x40(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movl %eax, %eax
movq %rax, -0xa0(%rbp)
movq -0xb0(%rbp), %rax
movq %rax, -0x48(%rbp)
movq $0x1, -0xc0(%rbp)
movq -0x48(%rbp), %rax
cmpq -0xa0(%rbp), %rax
jae 0x355d51
cmpq $0x0, -0xc0(%rbp)
je 0x355c7a
movq -0x48(%rbp), %rax
cmpq -0xb0(%rbp), %rax
jbe 0x355c7a
movq -0x10(%rbp), %rdi
movq -0x38(%rbp), %rax
movq -0x48(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movl %eax, %esi
xorl $0x1, %esi
callq 0x354a50
cmpl $0x1, %eax
ja 0x355c6d
movq -0x10(%rbp), %rdi
movq -0x38(%rbp), %rax
movq -0x48(%rbp), %rcx
subq $0x1, %rcx
movq (%rax,%rcx,8), %rax
movl %eax, %esi
callq 0x354a50
cmpl $0x1, %eax
jbe 0x355c78
movq $0x0, -0xc0(%rbp)
jmp 0x355c7a
jmp 0x355c7c
movq -0x28(%rbp), %rax
movq 0x300(%rax), %rax
movq -0x28(%rbp), %rcx
cmpq 0x308(%rcx), %rax
jne 0x355d06
movq -0x28(%rbp), %rax
cmpq $0x0, 0x308(%rax)
je 0x355cb9
movq -0x28(%rbp), %rax
movq 0x308(%rax), %rax
shlq %rax
movq %rax, -0x160(%rbp)
jmp 0x355cc7
movl $0x2, %eax
movq %rax, -0x160(%rbp)
jmp 0x355cc7
movq -0x160(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x308(%rax)
movq -0x28(%rbp), %rax
movq 0x310(%rax), %rdi
movq -0x28(%rbp), %rax
movq 0x308(%rax), %rsi
shlq $0x3, %rsi
callq 0x2360
movq %rax, %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x310(%rax)
movq -0x38(%rbp), %rax
movq -0x48(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movl %eax, %eax
movl %eax, %edx
movq -0x28(%rbp), %rax
movq 0x310(%rax), %rax
movq -0x28(%rbp), %rsi
movq 0x300(%rsi), %rcx
movq %rcx, %rdi
addq $0x1, %rdi
movq %rdi, 0x300(%rsi)
movq %rdx, (%rax,%rcx,8)
jmp 0x355d40
movq -0x48(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x48(%rbp)
jmp 0x355c06
cmpq $0x1, -0xc0(%rbp)
jne 0x355d6d
movq -0xc8(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x300(%rax)
jmp 0x355d6f
movq -0x40(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x40(%rbp)
jmp 0x355a7d
addq $0x160, %rsp            # imm = 0x160
popq %rbp
retq
nopl (%rax)