// File: chhylp123[P]hifiasm/Correct.cpp
// Function: hpc_mask_ff(char*, long, long, long, long, unsigned char*, long, long, long)
uint8_t hpc_mask_ff(char *sa, int64_t sn, int64_t p, int64_t hpc_flk, int64_t hpc_rr, uint8_t *f, int64_t fn, int64_t fsift, int64_t hpc_cutoff)
{
    int64_t s = ((p>=hpc_flk)?(p-hpc_flk):0), e = (((p+hpc_flk)<=sn)?(p+hpc_flk):(sn)), k, r, rc, zs, ze; 

    for (r = 1; r <= hpc_rr; r++) {
        rc = r * hpc_cutoff/**HPC_CC**/;
        
        ///inlcuding p
        for (k = p + r; (k < e) && ((k-r) >= s) && (sa[k] == sa[k-r]); k++); ze = k; if(ze > e) ze = e; 
        for (k = p - 1; (k >= s) && ((k+r) < e) && (sa[k] == sa[k+r]); k--); zs = k + 1; if(zs < s) zs = s;
        if(((ze - zs) > r) && ((ze - zs) >= rc)) {
            // fprintf(stderr, "-0-[M::%s] p::%ld, hh::[%ld,%ld), f::%u, %.*s\n", __func__, p, zs, ze, f?1:0, (int32_t)(ze - zs), sa + zs);
            if(f) {
                for (k = MAX(p, zs); (k < ze) && (k - fsift < fn); k++) f[k - fsift] = 0; f[p - fsift] = 0;
            }
            return 1;
        } 

        ///do not inlcude p
        for (k = p + r + 1; (k < e) && ((k-r) >= s) && (sa[k] == sa[k-r]); k++); 
        zs = p + 1; if(zs < s) zs = s; ze = k; if(ze > e) ze = e; 
        if(((ze - zs) > r) && ((ze - zs) >= rc)) {
            // fprintf(stderr, "-1-[M::%s] p::%ld, hh::[%ld,%ld), f::%u, %.*s\n", __func__, p, zs, ze, f?1:0, (int32_t)(ze - zs), sa + zs);
            if(f) {
                for (k = MAX(p, zs); (k < ze) && (k - fsift < fn); k++) f[k - fsift] = 0; f[p - fsift] = 0;
            }
            return 1;
        }  

        ///inlcuding p
        for (k = p - r; (k >= s) && ((k+r) < e) && (sa[k] == sa[k+r]); k--); zs = k + 1; if(zs < s) zs = s; 
        for (k = p + 1; (k < e) && ((k-r) >= s) && (sa[k] == sa[k-r]); k++); ze = k; if(ze > e) ze = e; 
        if(((ze - zs) > r) && ((ze - zs) >= rc)) {
            // fprintf(stderr, "-2-[M::%s] p::%ld, hh::[%ld,%ld), f::%u, %.*s\n", __func__, p, zs, ze, f?1:0, (int32_t)(ze - zs), sa + zs);
            if(f) {
                for (k = MAX(p, zs); (k < ze) && (k - fsift < fn); k++) f[k - fsift] = 0; f[p - fsift] = 0;
            }
            return 1;
        } 

        ///do not inlcude p
        for (k = p - r - 1; (k >= s) && ((k+r) < e) && (sa[k] == sa[k+r]); k--); 
        zs = k + 1; if(zs < s) zs = s; ze = p; if(ze > e) ze = e; 
        if(((ze - zs) > r) && ((ze - zs) >= rc)) {
            // fprintf(stderr, "-3-[M::%s] p::%ld, hh::[%ld,%ld), f::%u, %.*s\n", __func__, p, zs, ze, f?1:0, (int32_t)(ze - zs), sa + zs);
            if(f) {
                for (k = MAX(p, zs); (k < ze) && (k - fsift < fn); k++) f[k - fsift] = 0; f[p - fsift] = 0;
            }
            return 1;
        } 
    }
    // fprintf(stderr, "-6-[M::%s] p::%ld, hh::[,), %.*s\n", __func__, p, (int32_t)(e - s), sa + s);
    return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x48, %rsp
movq 0x20(%rbp), %rax
movq 0x18(%rbp), %rax
movq 0x10(%rbp), %rax
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq %rcx, -0x28(%rbp)
movq %r8, -0x30(%rbp)
movq %r9, -0x38(%rbp)
movq -0x20(%rbp), %rax
cmpq -0x28(%rbp), %rax
jl 0x49a34
movq -0x20(%rbp), %rax
subq -0x28(%rbp), %rax
movq %rax, -0x78(%rbp)
jmp 0x49a3c
xorl %eax, %eax
movq %rax, -0x78(%rbp)
jmp 0x49a3c
movq -0x78(%rbp), %rax
movq %rax, -0x40(%rbp)
movq -0x20(%rbp), %rax
addq -0x28(%rbp), %rax
cmpq -0x18(%rbp), %rax
jg 0x49a60
movq -0x20(%rbp), %rax
addq -0x28(%rbp), %rax
movq %rax, -0x80(%rbp)
jmp 0x49a68
movq -0x18(%rbp), %rax
movq %rax, -0x80(%rbp)
movq -0x80(%rbp), %rax
movq %rax, -0x48(%rbp)
movq $0x1, -0x58(%rbp)
movq -0x58(%rbp), %rax
cmpq -0x30(%rbp), %rax
jg 0x4a16d
movq -0x58(%rbp), %rax
imulq 0x20(%rbp), %rax
movq %rax, -0x60(%rbp)
movq -0x20(%rbp), %rax
addq -0x58(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rcx
xorl %eax, %eax
cmpq -0x48(%rbp), %rcx
movb %al, -0x81(%rbp)
jge 0x49aee
movq -0x50(%rbp), %rcx
subq -0x58(%rbp), %rcx
xorl %eax, %eax
cmpq -0x40(%rbp), %rcx
movb %al, -0x81(%rbp)
jl 0x49aee
movq -0x10(%rbp), %rax
movq -0x50(%rbp), %rcx
movsbl (%rax,%rcx), %eax
movq -0x10(%rbp), %rcx
movq -0x50(%rbp), %rdx
subq -0x58(%rbp), %rdx
movsbl (%rcx,%rdx), %ecx
cmpl %ecx, %eax
sete %al
movb %al, -0x81(%rbp)
movb -0x81(%rbp), %al
testb $0x1, %al
jne 0x49afa
jmp 0x49b0a
jmp 0x49afc
movq -0x50(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x50(%rbp)
jmp 0x49a9f
movq -0x50(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rax
cmpq -0x48(%rbp), %rax
jle 0x49b24
movq -0x48(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x20(%rbp), %rax
subq $0x1, %rax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rcx
xorl %eax, %eax
cmpq -0x40(%rbp), %rcx
movb %al, -0x82(%rbp)
jl 0x49b7f
movq -0x50(%rbp), %rcx
addq -0x58(%rbp), %rcx
xorl %eax, %eax
cmpq -0x48(%rbp), %rcx
movb %al, -0x82(%rbp)
jge 0x49b7f
movq -0x10(%rbp), %rax
movq -0x50(%rbp), %rcx
movsbl (%rax,%rcx), %eax
movq -0x10(%rbp), %rcx
movq -0x50(%rbp), %rdx
addq -0x58(%rbp), %rdx
movsbl (%rcx,%rdx), %ecx
cmpl %ecx, %eax
sete %al
movb %al, -0x82(%rbp)
movb -0x82(%rbp), %al
testb $0x1, %al
jne 0x49b8b
jmp 0x49b9b
jmp 0x49b8d
movq -0x50(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x50(%rbp)
jmp 0x49b30
movq -0x50(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x68(%rbp)
movq -0x68(%rbp), %rax
cmpq -0x40(%rbp), %rax
jge 0x49bb9
movq -0x40(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x70(%rbp), %rax
subq -0x68(%rbp), %rax
cmpq -0x58(%rbp), %rax
jle 0x49c7f
movq -0x70(%rbp), %rax
subq -0x68(%rbp), %rax
cmpq -0x60(%rbp), %rax
jl 0x49c7f
cmpq $0x0, -0x38(%rbp)
je 0x49c76
movq -0x20(%rbp), %rax
cmpq -0x68(%rbp), %rax
jl 0x49bff
movq -0x20(%rbp), %rax
movq %rax, -0x90(%rbp)
jmp 0x49c0a
movq -0x68(%rbp), %rax
movq %rax, -0x90(%rbp)
movq -0x90(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rcx
xorl %eax, %eax
cmpq -0x70(%rbp), %rcx
movb %al, -0x91(%rbp)
jge 0x49c3c
movq -0x50(%rbp), %rax
subq 0x18(%rbp), %rax
cmpq 0x10(%rbp), %rax
setl %al
movb %al, -0x91(%rbp)
movb -0x91(%rbp), %al
testb $0x1, %al
jne 0x49c48
jmp 0x49c66
movq -0x38(%rbp), %rax
movq -0x50(%rbp), %rcx
subq 0x18(%rbp), %rcx
movb $0x0, (%rax,%rcx)
movq -0x50(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x50(%rbp)
jmp 0x49c15
movq -0x38(%rbp), %rax
movq -0x20(%rbp), %rcx
subq 0x18(%rbp), %rcx
movb $0x0, (%rax,%rcx)
movb $0x1, -0x1(%rbp)
jmp 0x4a171
movq -0x20(%rbp), %rax
addq -0x58(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rcx
xorl %eax, %eax
cmpq -0x48(%rbp), %rcx
movb %al, -0x92(%rbp)
jge 0x49cde
movq -0x50(%rbp), %rcx
subq -0x58(%rbp), %rcx
xorl %eax, %eax
cmpq -0x40(%rbp), %rcx
movb %al, -0x92(%rbp)
jl 0x49cde
movq -0x10(%rbp), %rax
movq -0x50(%rbp), %rcx
movsbl (%rax,%rcx), %eax
movq -0x10(%rbp), %rcx
movq -0x50(%rbp), %rdx
subq -0x58(%rbp), %rdx
movsbl (%rcx,%rdx), %ecx
cmpl %ecx, %eax
sete %al
movb %al, -0x92(%rbp)
movb -0x92(%rbp), %al
testb $0x1, %al
jne 0x49cea
jmp 0x49cfa
jmp 0x49cec
movq -0x50(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x50(%rbp)
jmp 0x49c8f
movq -0x20(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x68(%rbp)
movq -0x68(%rbp), %rax
cmpq -0x40(%rbp), %rax
jge 0x49d18
movq -0x40(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x50(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rax
cmpq -0x48(%rbp), %rax
jle 0x49d32
movq -0x48(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rax
subq -0x68(%rbp), %rax
cmpq -0x58(%rbp), %rax
jle 0x49df8
movq -0x70(%rbp), %rax
subq -0x68(%rbp), %rax
cmpq -0x60(%rbp), %rax
jl 0x49df8
cmpq $0x0, -0x38(%rbp)
je 0x49def
movq -0x20(%rbp), %rax
cmpq -0x68(%rbp), %rax
jl 0x49d78
movq -0x20(%rbp), %rax
movq %rax, -0xa0(%rbp)
jmp 0x49d83
movq -0x68(%rbp), %rax
movq %rax, -0xa0(%rbp)
movq -0xa0(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rcx
xorl %eax, %eax
cmpq -0x70(%rbp), %rcx
movb %al, -0xa1(%rbp)
jge 0x49db5
movq -0x50(%rbp), %rax
subq 0x18(%rbp), %rax
cmpq 0x10(%rbp), %rax
setl %al
movb %al, -0xa1(%rbp)
movb -0xa1(%rbp), %al
testb $0x1, %al
jne 0x49dc1
jmp 0x49ddf
movq -0x38(%rbp), %rax
movq -0x50(%rbp), %rcx
subq 0x18(%rbp), %rcx
movb $0x0, (%rax,%rcx)
movq -0x50(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x50(%rbp)
jmp 0x49d8e
movq -0x38(%rbp), %rax
movq -0x20(%rbp), %rcx
subq 0x18(%rbp), %rcx
movb $0x0, (%rax,%rcx)
movb $0x1, -0x1(%rbp)
jmp 0x4a171
movq -0x20(%rbp), %rax
subq -0x58(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rcx
xorl %eax, %eax
cmpq -0x40(%rbp), %rcx
movb %al, -0xa2(%rbp)
jl 0x49e53
movq -0x50(%rbp), %rcx
addq -0x58(%rbp), %rcx
xorl %eax, %eax
cmpq -0x48(%rbp), %rcx
movb %al, -0xa2(%rbp)
jge 0x49e53
movq -0x10(%rbp), %rax
movq -0x50(%rbp), %rcx
movsbl (%rax,%rcx), %eax
movq -0x10(%rbp), %rcx
movq -0x50(%rbp), %rdx
addq -0x58(%rbp), %rdx
movsbl (%rcx,%rdx), %ecx
cmpl %ecx, %eax
sete %al
movb %al, -0xa2(%rbp)
movb -0xa2(%rbp), %al
testb $0x1, %al
jne 0x49e5f
jmp 0x49e6f
jmp 0x49e61
movq -0x50(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x50(%rbp)
jmp 0x49e04
movq -0x50(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x68(%rbp)
movq -0x68(%rbp), %rax
cmpq -0x40(%rbp), %rax
jge 0x49e8d
movq -0x40(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x20(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rcx
xorl %eax, %eax
cmpq -0x48(%rbp), %rcx
movb %al, -0xa3(%rbp)
jge 0x49ee8
movq -0x50(%rbp), %rcx
subq -0x58(%rbp), %rcx
xorl %eax, %eax
cmpq -0x40(%rbp), %rcx
movb %al, -0xa3(%rbp)
jl 0x49ee8
movq -0x10(%rbp), %rax
movq -0x50(%rbp), %rcx
movsbl (%rax,%rcx), %eax
movq -0x10(%rbp), %rcx
movq -0x50(%rbp), %rdx
subq -0x58(%rbp), %rdx
movsbl (%rcx,%rdx), %ecx
cmpl %ecx, %eax
sete %al
movb %al, -0xa3(%rbp)
movb -0xa3(%rbp), %al
testb $0x1, %al
jne 0x49ef4
jmp 0x49f04
jmp 0x49ef6
movq -0x50(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x50(%rbp)
jmp 0x49e99
movq -0x50(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rax
cmpq -0x48(%rbp), %rax
jle 0x49f1e
movq -0x48(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rax
subq -0x68(%rbp), %rax
cmpq -0x58(%rbp), %rax
jle 0x49fe4
movq -0x70(%rbp), %rax
subq -0x68(%rbp), %rax
cmpq -0x60(%rbp), %rax
jl 0x49fe4
cmpq $0x0, -0x38(%rbp)
je 0x49fdb
movq -0x20(%rbp), %rax
cmpq -0x68(%rbp), %rax
jl 0x49f64
movq -0x20(%rbp), %rax
movq %rax, -0xb0(%rbp)
jmp 0x49f6f
movq -0x68(%rbp), %rax
movq %rax, -0xb0(%rbp)
movq -0xb0(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rcx
xorl %eax, %eax
cmpq -0x70(%rbp), %rcx
movb %al, -0xb1(%rbp)
jge 0x49fa1
movq -0x50(%rbp), %rax
subq 0x18(%rbp), %rax
cmpq 0x10(%rbp), %rax
setl %al
movb %al, -0xb1(%rbp)
movb -0xb1(%rbp), %al
testb $0x1, %al
jne 0x49fad
jmp 0x49fcb
movq -0x38(%rbp), %rax
movq -0x50(%rbp), %rcx
subq 0x18(%rbp), %rcx
movb $0x0, (%rax,%rcx)
movq -0x50(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x50(%rbp)
jmp 0x49f7a
movq -0x38(%rbp), %rax
movq -0x20(%rbp), %rcx
subq 0x18(%rbp), %rcx
movb $0x0, (%rax,%rcx)
movb $0x1, -0x1(%rbp)
jmp 0x4a171
movq -0x20(%rbp), %rax
subq -0x58(%rbp), %rax
subq $0x1, %rax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rcx
xorl %eax, %eax
cmpq -0x40(%rbp), %rcx
movb %al, -0xb2(%rbp)
jl 0x4a043
movq -0x50(%rbp), %rcx
addq -0x58(%rbp), %rcx
xorl %eax, %eax
cmpq -0x48(%rbp), %rcx
movb %al, -0xb2(%rbp)
jge 0x4a043
movq -0x10(%rbp), %rax
movq -0x50(%rbp), %rcx
movsbl (%rax,%rcx), %eax
movq -0x10(%rbp), %rcx
movq -0x50(%rbp), %rdx
addq -0x58(%rbp), %rdx
movsbl (%rcx,%rdx), %ecx
cmpl %ecx, %eax
sete %al
movb %al, -0xb2(%rbp)
movb -0xb2(%rbp), %al
testb $0x1, %al
jne 0x4a04f
jmp 0x4a05f
jmp 0x4a051
movq -0x50(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x50(%rbp)
jmp 0x49ff4
movq -0x50(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x68(%rbp)
movq -0x68(%rbp), %rax
cmpq -0x40(%rbp), %rax
jge 0x4a07d
movq -0x40(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x20(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rax
cmpq -0x48(%rbp), %rax
jle 0x4a097
movq -0x48(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rax
subq -0x68(%rbp), %rax
cmpq -0x58(%rbp), %rax
jle 0x4a15a
movq -0x70(%rbp), %rax
subq -0x68(%rbp), %rax
cmpq -0x60(%rbp), %rax
jl 0x4a15a
cmpq $0x0, -0x38(%rbp)
je 0x4a154
movq -0x20(%rbp), %rax
cmpq -0x68(%rbp), %rax
jl 0x4a0dd
movq -0x20(%rbp), %rax
movq %rax, -0xc0(%rbp)
jmp 0x4a0e8
movq -0x68(%rbp), %rax
movq %rax, -0xc0(%rbp)
movq -0xc0(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rcx
xorl %eax, %eax
cmpq -0x70(%rbp), %rcx
movb %al, -0xc1(%rbp)
jge 0x4a11a
movq -0x50(%rbp), %rax
subq 0x18(%rbp), %rax
cmpq 0x10(%rbp), %rax
setl %al
movb %al, -0xc1(%rbp)
movb -0xc1(%rbp), %al
testb $0x1, %al
jne 0x4a126
jmp 0x4a144
movq -0x38(%rbp), %rax
movq -0x50(%rbp), %rcx
subq 0x18(%rbp), %rcx
movb $0x0, (%rax,%rcx)
movq -0x50(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x50(%rbp)
jmp 0x4a0f3
movq -0x38(%rbp), %rax
movq -0x20(%rbp), %rcx
subq 0x18(%rbp), %rcx
movb $0x0, (%rax,%rcx)
movb $0x1, -0x1(%rbp)
jmp 0x4a171
jmp 0x4a15c
movq -0x58(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x58(%rbp)
jmp 0x49a78
movb $0x0, -0x1(%rbp)
movb -0x1(%rbp), %al
addq $0x48, %rsp
popq %rbp
retq
nopw (%rax,%rax)