// File: /workspace/github_cpp_makefile_star2_O1/theuni[P]libbtcnet/src/base32.cpp
// Function: EncodeBase32[abi:cxx11](unsigned char const*, unsigned long)
std::string EncodeBase32(const unsigned char* pch, size_t len)
{
    static const char* pbase32 = "abcdefghijklmnopqrstuvwxyz234567";

    std::string strRet = "";
    strRet.reserve((len + 4) / 5 * 8);

    int mode = 0, left = 0;
    const unsigned char* pchEnd = pch + len;

    while (pch < pchEnd) {
        int enc = *(pch++);
        switch (mode) {
        case 0: // we have no bits
            strRet += pbase32[enc >> 3];
            left = (enc & 7) << 2;
            mode = 1;
            break;

        case 1: // we have three bits
            strRet += pbase32[left | (enc >> 6)];
            strRet += pbase32[(enc >> 1) & 31];
            left = (enc & 1) << 4;
            mode = 2;
            break;

        case 2: // we have one bit
            strRet += pbase32[left | (enc >> 4)];
            left = (enc & 15) << 1;
            mode = 3;
            break;

        case 3: // we have four bits
            strRet += pbase32[left | (enc >> 7)];
            strRet += pbase32[(enc >> 2) & 31];
            left = (enc & 3) << 3;
            mode = 4;
            break;

        case 4: // we have two bits
            strRet += pbase32[left | (enc >> 5)];
            strRet += pbase32[enc & 31];
            mode = 0;
        }
    }

    static constexpr std::array<int, 5> nPadding{{0, 6, 4, 3, 1}};
    if (mode != 0) {
        strRet += pbase32[left];
        for (int n = 0; n < nPadding.at(mode); n++)
            strRet += '=';
    }

    return strRet;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movq %rdx, %r14
movq %rsi, %r15
movq %rdi, %rbx
leaq 0x10(%rdi), %r12
movq %r12, (%rdi)
leaq 0xbff6(%rip), %rdx      # 0x138b4
movq %rdx, %rsi
callq 0x51f6
leaq 0x4(%r14), %rax
movabsq $-0x3333333333333333, %rcx # imm = 0xCCCCCCCCCCCCCCCD
mulq %rcx
leaq (%rdx,%rdx), %rsi
andq $-0x8, %rsi
movq %rbx, %rdi
movq %r12, (%rsp)
callq 0x4580
testq %r14, %r14
jle 0x7a4f
addq %r15, %r14
xorl %ebp, %ebp
xorl %r13d, %r13d
cmpl $0x4, %r13d
ja 0x7a3f
movzbl (%r15), %r12d
movl %r13d, %eax
leaq 0xa9fc(%rip), %rcx      # 0x12310
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movl %r12d, %eax
shrl $0x3, %eax
leaq 0xae4a(%rip), %rcx      # 0x12774
movsbl (%rax,%rcx), %esi
movq %rbx, %rdi
callq 0x42e0
shll $0x2, %r12d
andl $0x1c, %r12d
movl $0x1, %r13d
jmp 0x7a3c
movl %r12d, %eax
shrl $0x5, %eax
orl %ebp, %eax
leaq 0xae1c(%rip), %rcx      # 0x12774
movsbl (%rax,%rcx), %esi
movq %rbx, %rdi
callq 0x42e0
andl $0x1f, %r12d
leaq 0xae05(%rip), %rax      # 0x12774
movsbl (%r12,%rax), %esi
xorl %r13d, %r13d
movq %rbx, %rdi
callq 0x42e0
jmp 0x7a3f
movl %r12d, %eax
shrl $0x4, %eax
orl %ebp, %eax
leaq 0xade1(%rip), %rcx      # 0x12774
movsbl (%rax,%rcx), %esi
movq %rbx, %rdi
callq 0x42e0
addl %r12d, %r12d
andl $0x1e, %r12d
movl $0x3, %r13d
jmp 0x7a3c
movl %r12d, %eax
shrl $0x7, %eax
orl %ebp, %eax
leaq 0xadb4(%rip), %rcx      # 0x12774
movsbl (%rax,%rcx), %esi
movq %rbx, %rdi
callq 0x42e0
movl %r12d, %eax
shrl $0x2, %eax
andl $0x1f, %eax
leaq 0xad98(%rip), %rcx      # 0x12774
movsbl (%rax,%rcx), %esi
movq %rbx, %rdi
callq 0x42e0
shll $0x3, %r12d
andl $0x18, %r12d
movl $0x4, %r13d
jmp 0x7a3c
movl %r12d, %eax
shrl $0x6, %eax
orl %ebp, %eax
leaq 0xad6d(%rip), %rcx      # 0x12774
movsbl (%rax,%rcx), %esi
movq %rbx, %rdi
callq 0x42e0
movl %r12d, %eax
shrl %eax
andl $0x1f, %eax
leaq 0xad52(%rip), %rcx      # 0x12774
movsbl (%rax,%rcx), %esi
movq %rbx, %rdi
callq 0x42e0
shll $0x4, %r12d
andl $0x10, %r12d
movl $0x2, %r13d
movl %r12d, %ebp
incq %r15
cmpq %r14, %r15
jb 0x78fc
movl %ebp, %eax
jmp 0x7a54
xorl %r13d, %r13d
xorl %eax, %eax
testl %r13d, %r13d
je 0x7ab6
leaq 0xad14(%rip), %rcx      # 0x12774
movsbl (%rax,%rcx), %esi
movq %rbx, %rdi
callq 0x42e0
movslq %r13d, %r14
cmpl $0x4, %r13d
ja 0x7aa0
leaq 0xa8e4(%rip), %rax      # 0x12360
movl (%rax,%r14,4), %eax
xorl %ebp, %ebp
testl %eax, %eax
cmovgl %eax, %ebp
incl %ebp
decl %ebp
je 0x7ab6
movq %rbx, %rdi
movl $0x3d, %esi
callq 0x42e0
cmpl $0x5, %r13d
jb 0x7a89
leaq 0xacee(%rip), %rdi      # 0x12795
movl $0x5, %edx
movq %r14, %rsi
xorl %eax, %eax
callq 0x4520
movq %rbx, %rax
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
jmp 0x7ad0
jmp 0x7ad0
jmp 0x7ad0
jmp 0x7ad0
movq %rax, %r14
movq (%rbx), %rdi
cmpq (%rsp), %rdi
je 0x7ae1
callq 0x4340
movq %r14, %rdi
callq 0x4640