// File: chhylp123[P]hifiasm/Correct.cpp
// Function: adjust_specific_ext_offset(overlap_region*, ul_idx_t const*, hpc_t*, All_reads*, bit_extz_t*, char*, UC_Read*, long*, long*, long*, long*, long, long, long, long*)
void adjust_specific_ext_offset(overlap_region *z, const ul_idx_t *uref, hpc_t *hpc_g, All_reads *rref, bit_extz_t *exz, char* qstr, UC_Read *tu, 
int64_t *qs0, int64_t *qe0, int64_t *ts0, int64_t *te0, int64_t ql, int64_t tl, int64_t wl, int64_t *mode)
{   
    ///[qs, qe)
    if((*mode) != 1 && (*mode) != 2) return;
    int64_t qs = *qs0, qe = *qe0, ts = *ts0, te = *te0, k, update, wid, we, ws, sl, gq, gt, gg, min_g = INT32_MAX, min_id = -1, gl;
    adjust_ext_offset(&qs, &qe, &ts, &te, ql, tl, 0, *mode);
    if((*mode) == 1) {///forward extension
        //qs0 and ts0 are fixed; te0 = -1, qe0 is unreliable
        if(qe > (*qe0)) {
            we = (*qe0); we/=wl; we *= wl; we +=wl; we--; ///next window
            for (k = 0; we < qe && k < ext_w; we+=wl) {//[ws, we]; [qs, qe)
                wid = get_win_id_by_e(z, we, wl, NULL);
                if(z->w_list.a[wid].y_end == -1) continue;//unmapped
                if(z->w_list.a[wid].x_end < (*qs0)) continue;
                if(z->w_list.a[wid].y_end < (*ts0)) continue;
                sl = z->w_list.a[wid].x_end+1-z->w_list.a[wid].x_start;
                if(z->w_list.a[wid].error > (sl/A_L)) continue;
                gq = z->w_list.a[wid].x_end-(*qs0); 
                gt = z->w_list.a[wid].y_end-(*ts0); 
                gl = MIN(gq, gt); gl/=16; if(gl <= 0) gl = 1;
                gg = (gq>=gt)?(gq-gt):(gt-gq); gg /= gl;
                update = 0;
                if(min_g>gg) {
                    update = 1;
                } else if((min_g==gg)&&(z->w_list.a[min_id].error>z->w_list.a[wid].error)) {
                    update = 1;
                } 
                if(update) {
                    min_g = gg; min_id = wid;
                }
                k++;
            }
        }
        if(min_id >= 0) {
            (*qe0) = z->w_list.a[min_id].x_end+1; 
            if(((*qe0)+wl) >= qe) {
                (*qe0) = qe; (*te0) = te; ///still extension
                return;
            }
            (*te0) = z->w_list.a[min_id].y_end+1; (*mode) = 0;///global
        } else {
            (*qe0) = qe; (*te0) = te; ///still extension
        }
    } else if((*mode) == 2) {///backward extension
        //qe0 and te0 are fixed; ts0 = -1, qs0 is unreliable
        if(qs < (*qs0)) {
            ws = (*qs0)-1; ws/=wl; ws*=wl; 
            for (k = 0; ws >= qs && k < ext_w; ws-=wl) {//[ws, we]; [qs, qe)
                wid = get_win_id_by_s(z, ws, wl, NULL);
                if(z->w_list.a[wid].y_end == -1) continue;//unmapped
                if(z->w_list.a[wid].x_start >= (*qe0)) continue;
                if(z->w_list.a[wid].y_start >= (*te0)) continue;
                sl = z->w_list.a[wid].x_end+1-z->w_list.a[wid].x_start;
                if(z->w_list.a[wid].error > (sl/A_L)) continue;
                gq = (*qe0) - z->w_list.a[wid].x_start; 
                gt = (*te0) - z->w_list.a[wid].y_start; 
                gl = MIN(gq, gt); gl/=16; if(gl <= 0) gl = 1;
                gg = (gq>=gt)?(gq-gt):(gt-gq); gg /= gl;
                update = 0;
                if(min_g>gg) {
                    update = 1;
                } else if((min_g==gg)&&(z->w_list.a[min_id].error>z->w_list.a[wid].error)) {
                    update = 1;
                } 
                if(update) {
                    min_g = gg; min_id = wid;
                }
                k++;
            }
        }
        if(min_id >= 0) {
            (*qs0) = z->w_list.a[min_id].x_start; 
            if((qs+wl) >= (*qs0)) {
                (*qs0) = qs; (*ts0) = ts; ///still extension
                return;
            }
            (*ts0) = z->w_list.a[min_id].y_start; (*mode) = 0;///global
        } else {
            (*qs0) = qs; (*ts0) = ts; ///still extension
        }
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x100, %rsp            # imm = 0x100
movq 0x50(%rbp), %rax
movq 0x48(%rbp), %rax
movq 0x40(%rbp), %rax
movq 0x38(%rbp), %rax
movq 0x30(%rbp), %rax
movq 0x28(%rbp), %rax
movq 0x20(%rbp), %rax
movq 0x18(%rbp), %rax
movq 0x10(%rbp), %rax
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq %r8, -0x28(%rbp)
movq %r9, -0x30(%rbp)
movq 0x50(%rbp), %rax
cmpq $0x1, (%rax)
je 0x583b0
movq 0x50(%rbp), %rax
cmpq $0x2, (%rax)
je 0x583b0
jmp 0x58c0a
movq 0x18(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x38(%rbp)
movq 0x20(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x40(%rbp)
movq 0x28(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x48(%rbp)
movq 0x30(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x50(%rbp)
movq $0x7fffffff, -0xa0(%rbp) # imm = 0x7FFFFFFF
movq $-0x1, -0xa8(%rbp)
movq 0x38(%rbp), %r8
movq 0x40(%rbp), %r9
movq 0x50(%rbp), %rax
movq (%rax), %rax
leaq -0x38(%rbp), %rdi
leaq -0x40(%rbp), %rsi
leaq -0x48(%rbp), %rdx
leaq -0x50(%rbp), %rcx
xorl %r10d, %r10d
movq $0x0, (%rsp)
movq %rax, 0x8(%rsp)
callq 0x581e0
movq 0x50(%rbp), %rax
cmpq $0x1, (%rax)
jne 0x58828
movq -0x40(%rbp), %rax
movq 0x20(%rbp), %rcx
cmpq (%rcx), %rax
jle 0x5877a
movq 0x20(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x70(%rbp)
movq 0x48(%rbp), %rcx
movq -0x70(%rbp), %rax
cqto
idivq %rcx
movq %rax, -0x70(%rbp)
movq 0x48(%rbp), %rax
imulq -0x70(%rbp), %rax
movq %rax, -0x70(%rbp)
movq 0x48(%rbp), %rax
addq -0x70(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x70(%rbp)
movq $0x0, -0x58(%rbp)
movq -0x70(%rbp), %rcx
xorl %eax, %eax
cmpq -0x40(%rbp), %rcx
movb %al, -0xb1(%rbp)
jge 0x584ae
cmpq $0x6, -0x58(%rbp)
setl %al
movb %al, -0xb1(%rbp)
movb -0xb1(%rbp), %al
testb $0x1, %al
jne 0x584bd
jmp 0x58778
movq -0x8(%rbp), %rdi
movq -0x70(%rbp), %rsi
movq 0x48(%rbp), %rdx
xorl %eax, %eax
movl %eax, %ecx
callq 0x9e250
movq %rax, -0x68(%rbp)
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x68(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
cmpl $-0x1, 0xc(%rax)
jne 0x584f4
jmp 0x58767
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x68(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movslq 0x4(%rax), %rax
movq 0x18(%rbp), %rcx
cmpq (%rcx), %rax
jge 0x58519
jmp 0x58767
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x68(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movslq 0xc(%rax), %rax
movq 0x28(%rbp), %rcx
cmpq (%rcx), %rax
jge 0x5853e
jmp 0x58767
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x68(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movl 0x4(%rax), %eax
addl $0x1, %eax
movq -0x8(%rbp), %rcx
movq 0x58(%rcx), %rcx
movq -0x68(%rbp), %rdx
shlq $0x5, %rdx
addq %rdx, %rcx
subl (%rcx), %eax
cltq
movq %rax, -0x80(%rbp)
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x68(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movswq 0x14(%rax), %rax
movq %rax, -0xc0(%rbp)
movq -0x80(%rbp), %rax
movl $0x10, %ecx
cqto
idivq %rcx
movq %rax, %rcx
movq -0xc0(%rbp), %rax
cmpq %rcx, %rax
jle 0x585b3
jmp 0x58767
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x68(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movslq 0x4(%rax), %rax
movq 0x18(%rbp), %rcx
subq (%rcx), %rax
movq %rax, -0x88(%rbp)
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x68(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movslq 0xc(%rax), %rax
movq 0x28(%rbp), %rcx
subq (%rcx), %rax
movq %rax, -0x90(%rbp)
movq -0x88(%rbp), %rax
cmpq -0x90(%rbp), %rax
jg 0x5861d
movq -0x88(%rbp), %rax
movq %rax, -0xc8(%rbp)
jmp 0x5862b
movq -0x90(%rbp), %rax
movq %rax, -0xc8(%rbp)
movq -0xc8(%rbp), %rax
movq %rax, -0xb0(%rbp)
movq -0xb0(%rbp), %rax
movl $0x10, %ecx
cqto
idivq %rcx
movq %rax, -0xb0(%rbp)
cmpq $0x0, -0xb0(%rbp)
jg 0x58666
movq $0x1, -0xb0(%rbp)
movq -0x88(%rbp), %rax
cmpq -0x90(%rbp), %rax
jl 0x5868d
movq -0x88(%rbp), %rax
subq -0x90(%rbp), %rax
movq %rax, -0xd0(%rbp)
jmp 0x586a2
movq -0x90(%rbp), %rax
subq -0x88(%rbp), %rax
movq %rax, -0xd0(%rbp)
movq -0xd0(%rbp), %rax
movq %rax, -0x98(%rbp)
movq -0xb0(%rbp), %rcx
movq -0x98(%rbp), %rax
cqto
idivq %rcx
movq %rax, -0x98(%rbp)
movq $0x0, -0x60(%rbp)
movq -0xa0(%rbp), %rax
cmpq -0x98(%rbp), %rax
jle 0x586ec
movq $0x1, -0x60(%rbp)
jmp 0x5873b
movq -0xa0(%rbp), %rax
cmpq -0x98(%rbp), %rax
jne 0x58739
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0xa8(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movswl 0x14(%rax), %eax
movq -0x8(%rbp), %rcx
movq 0x58(%rcx), %rcx
movq -0x68(%rbp), %rdx
shlq $0x5, %rdx
addq %rdx, %rcx
movswl 0x14(%rcx), %ecx
cmpl %ecx, %eax
jle 0x58739
movq $0x1, -0x60(%rbp)
jmp 0x5873b
cmpq $0x0, -0x60(%rbp)
je 0x5875b
movq -0x98(%rbp), %rax
movq %rax, -0xa0(%rbp)
movq -0x68(%rbp), %rax
movq %rax, -0xa8(%rbp)
movq -0x58(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x58(%rbp)
movq 0x48(%rbp), %rax
addq -0x70(%rbp), %rax
movq %rax, -0x70(%rbp)
jmp 0x5848e
jmp 0x5877a
cmpq $0x0, -0xa8(%rbp)
jl 0x5880d
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0xa8(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movl 0x4(%rax), %eax
addl $0x1, %eax
movslq %eax, %rcx
movq 0x20(%rbp), %rax
movq %rcx, (%rax)
movq 0x20(%rbp), %rax
movq (%rax), %rax
addq 0x48(%rbp), %rax
cmpq -0x40(%rbp), %rax
jl 0x587da
movq -0x40(%rbp), %rcx
movq 0x20(%rbp), %rax
movq %rcx, (%rax)
movq -0x50(%rbp), %rcx
movq 0x30(%rbp), %rax
movq %rcx, (%rax)
jmp 0x58c0a
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0xa8(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movl 0xc(%rax), %eax
addl $0x1, %eax
movslq %eax, %rcx
movq 0x30(%rbp), %rax
movq %rcx, (%rax)
movq 0x50(%rbp), %rax
movq $0x0, (%rax)
jmp 0x58823
movq -0x40(%rbp), %rcx
movq 0x20(%rbp), %rax
movq %rcx, (%rax)
movq -0x50(%rbp), %rcx
movq 0x30(%rbp), %rax
movq %rcx, (%rax)
jmp 0x58c0a
movq 0x50(%rbp), %rax
cmpq $0x2, (%rax)
jne 0x58c08
movq -0x38(%rbp), %rax
movq 0x18(%rbp), %rcx
cmpq (%rcx), %rax
jge 0x58b6f
movq 0x18(%rbp), %rax
movq (%rax), %rax
subq $0x1, %rax
movq %rax, -0x78(%rbp)
movq 0x48(%rbp), %rcx
movq -0x78(%rbp), %rax
cqto
idivq %rcx
movq %rax, -0x78(%rbp)
movq 0x48(%rbp), %rax
imulq -0x78(%rbp), %rax
movq %rax, -0x78(%rbp)
movq $0x0, -0x58(%rbp)
movq -0x78(%rbp), %rcx
xorl %eax, %eax
cmpq -0x38(%rbp), %rcx
movb %al, -0xd1(%rbp)
jl 0x5889c
cmpq $0x6, -0x58(%rbp)
setl %al
movb %al, -0xd1(%rbp)
movb -0xd1(%rbp), %al
testb $0x1, %al
jne 0x588ab
jmp 0x58b6d
movq -0x8(%rbp), %rdi
movq -0x78(%rbp), %rsi
movq 0x48(%rbp), %rdx
xorl %eax, %eax
movl %eax, %ecx
callq 0x9e2e0
movq %rax, -0x68(%rbp)
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x68(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
cmpl $-0x1, 0xc(%rax)
jne 0x588e2
jmp 0x58b59
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x68(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movslq (%rax), %rax
movq 0x20(%rbp), %rcx
cmpq (%rcx), %rax
jl 0x58906
jmp 0x58b59
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x68(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movslq 0x8(%rax), %rax
movq 0x30(%rbp), %rcx
cmpq (%rcx), %rax
jl 0x5892b
jmp 0x58b59
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x68(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movl 0x4(%rax), %eax
addl $0x1, %eax
movq -0x8(%rbp), %rcx
movq 0x58(%rcx), %rcx
movq -0x68(%rbp), %rdx
shlq $0x5, %rdx
addq %rdx, %rcx
subl (%rcx), %eax
cltq
movq %rax, -0x80(%rbp)
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0x68(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movswq 0x14(%rax), %rax
movq %rax, -0xe0(%rbp)
movq -0x80(%rbp), %rax
movl $0x10, %ecx
cqto
idivq %rcx
movq %rax, %rcx
movq -0xe0(%rbp), %rax
cmpq %rcx, %rax
jle 0x589a0
jmp 0x58b59
movq 0x20(%rbp), %rax
movq (%rax), %rax
movq -0x8(%rbp), %rcx
movq 0x58(%rcx), %rcx
movq -0x68(%rbp), %rdx
shlq $0x5, %rdx
addq %rdx, %rcx
movslq (%rcx), %rcx
subq %rcx, %rax
movq %rax, -0x88(%rbp)
movq 0x30(%rbp), %rax
movq (%rax), %rax
movq -0x8(%rbp), %rcx
movq 0x58(%rcx), %rcx
movq -0x68(%rbp), %rdx
shlq $0x5, %rdx
addq %rdx, %rcx
movslq 0x8(%rcx), %rcx
subq %rcx, %rax
movq %rax, -0x90(%rbp)
movq -0x88(%rbp), %rax
cmpq -0x90(%rbp), %rax
jg 0x58a0f
movq -0x88(%rbp), %rax
movq %rax, -0xe8(%rbp)
jmp 0x58a1d
movq -0x90(%rbp), %rax
movq %rax, -0xe8(%rbp)
movq -0xe8(%rbp), %rax
movq %rax, -0xb0(%rbp)
movq -0xb0(%rbp), %rax
movl $0x10, %ecx
cqto
idivq %rcx
movq %rax, -0xb0(%rbp)
cmpq $0x0, -0xb0(%rbp)
jg 0x58a58
movq $0x1, -0xb0(%rbp)
movq -0x88(%rbp), %rax
cmpq -0x90(%rbp), %rax
jl 0x58a7f
movq -0x88(%rbp), %rax
subq -0x90(%rbp), %rax
movq %rax, -0xf0(%rbp)
jmp 0x58a94
movq -0x90(%rbp), %rax
subq -0x88(%rbp), %rax
movq %rax, -0xf0(%rbp)
movq -0xf0(%rbp), %rax
movq %rax, -0x98(%rbp)
movq -0xb0(%rbp), %rcx
movq -0x98(%rbp), %rax
cqto
idivq %rcx
movq %rax, -0x98(%rbp)
movq $0x0, -0x60(%rbp)
movq -0xa0(%rbp), %rax
cmpq -0x98(%rbp), %rax
jle 0x58ade
movq $0x1, -0x60(%rbp)
jmp 0x58b2d
movq -0xa0(%rbp), %rax
cmpq -0x98(%rbp), %rax
jne 0x58b2b
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0xa8(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movswl 0x14(%rax), %eax
movq -0x8(%rbp), %rcx
movq 0x58(%rcx), %rcx
movq -0x68(%rbp), %rdx
shlq $0x5, %rdx
addq %rdx, %rcx
movswl 0x14(%rcx), %ecx
cmpl %ecx, %eax
jle 0x58b2b
movq $0x1, -0x60(%rbp)
jmp 0x58b2d
cmpq $0x0, -0x60(%rbp)
je 0x58b4d
movq -0x98(%rbp), %rax
movq %rax, -0xa0(%rbp)
movq -0x68(%rbp), %rax
movq %rax, -0xa8(%rbp)
movq -0x58(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x58(%rbp)
movq 0x48(%rbp), %rcx
movq -0x78(%rbp), %rax
subq %rcx, %rax
movq %rax, -0x78(%rbp)
jmp 0x5887c
jmp 0x58b6f
cmpq $0x0, -0xa8(%rbp)
jl 0x58bf0
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0xa8(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movslq (%rax), %rcx
movq 0x18(%rbp), %rax
movq %rcx, (%rax)
movq -0x38(%rbp), %rax
addq 0x48(%rbp), %rax
movq 0x18(%rbp), %rcx
cmpq (%rcx), %rax
jl 0x58bc2
movq -0x38(%rbp), %rcx
movq 0x18(%rbp), %rax
movq %rcx, (%rax)
movq -0x48(%rbp), %rcx
movq 0x28(%rbp), %rax
movq %rcx, (%rax)
jmp 0x58c0a
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rax
movq -0xa8(%rbp), %rcx
shlq $0x5, %rcx
addq %rcx, %rax
movslq 0x8(%rax), %rcx
movq 0x28(%rbp), %rax
movq %rcx, (%rax)
movq 0x50(%rbp), %rax
movq $0x0, (%rax)
jmp 0x58c06
movq -0x38(%rbp), %rcx
movq 0x18(%rbp), %rax
movq %rcx, (%rax)
movq -0x48(%rbp), %rcx
movq 0x28(%rbp), %rax
movq %rcx, (%rax)
jmp 0x58c08
jmp 0x58c0a
addq $0x100, %rsp            # imm = 0x100
popq %rbp
retq
nopw %cs:(%rax,%rax)