user: What would the C source look like for the assembly code provided here?

```asm
<_tw2_get_decode_key>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0xf8,%rsp
  mov    %rdi,-0xe8(%rbp)
  mov    %rsi,-0xf0(%rbp)
  mov    %rdx,-0xf8(%rbp)
  mov    %ecx,-0xfc(%rbp)
  mov    %r8d,-0x100(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x18(%rbp)
  xor    %eax,%eax
  movl   $0x3c,-0xd4(%rbp)
  movl   $0x0,-0xa0(%rbp)
  movl   $0x1,-0x9c(%rbp)
  movl   $0x0,-0x98(%rbp)
  movl   $0x2,-0x94(%rbp)
  movl   $0x5,-0x90(%rbp)
  movl   $0x2,-0x8c(%rbp)
  movl   $0x0,-0x88(%rbp)
  movl   $0x3,-0x84(%rbp)
  movl   $0x3,-0x80(%rbp)
  movl   $0x0,-0x7c(%rbp)
  movl   $0x7,-0x78(%rbp)
  movl   $0xb,-0xd0(%rbp)
  lea    D2(%rip),%rax
  mov    %rax,-0xc0(%rbp)
  lea    D36(%rip),%rax
  mov    %rax,-0xb8(%rbp)
  lea    D45(%rip),%rax
  mov    %rax,-0xb0(%rbp)
  lea    D42(%rip),%rax
  mov    %rax,-0xa8(%rbp)
  jmp    L45
L124:
  lea    -0x70(%rbp),%rax
  mov    %rax,-0xc8(%rbp)
  mov    $0x0,%ebx
  jmp    L4
L60:
  mov    -0xe8(%rbp),%rdx
  lea    0x1(%rdx),%rax
  mov    %rax,-0xe8(%rbp)
  mov    -0xc8(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    %rcx,-0xc8(%rbp)
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
L4:
  mov    -0xe8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x13,%al
  je     L105
  mov    %ebx,%eax
  lea    0x1(%rax),%ebx
  cmp    $0x4d,%eax
  jle    L60
L105:
  mov    -0xc8(%rbp),%rax
  movb   $0x0,(%rax)
  lea    -0x70(%rbp),%rax
  mov    %rax,%rdi
  call   <str_reverse@plt>
  mov    $0x0,%ebx
  jmp    L109
L108:
  mov    -0xd0(%rbp),%eax
  add    %ebx,%eax
  mov    %eax,-0xcc(%rbp)
  movslq %ebx,%rax
  movzbl -0x70(%rbp,%rax,1),%eax
  mov    %eax,%esi
  mov    %ebx,%eax
  cltd
  idivl  -0xd0(%rbp)
  mov    %edx,%eax
  cltq
  mov    -0xa0(%rbp,%rax,4),%eax
  imul   -0xcc(%rbp),%eax
  movslq %eax,%rdx
  imul   $0x3e0f83e1,%rdx,%rdx
  shr    $0x20,%rdx
  sar    $0x3,%edx
  mov    %eax,%ecx
  sar    $0x1f,%ecx
  sub    %ecx,%edx
  mov    %edx,%ecx
  shl    $0x5,%ecx
  add    %edx,%ecx
  sub    %ecx,%eax
  mov    %eax,%edx
  mov    %edx,%eax
  add    %esi,%eax
  mov    %eax,%edx
  movslq %ebx,%rax
  mov    %dl,-0x70(%rbp,%rax,1)
  movslq %ebx,%rax
  movzbl -0x70(%rbp,%rax,1),%eax
  sub    $0x14,%eax
  mov    %eax,%edx
  movslq %ebx,%rax
  mov    %dl,-0x70(%rbp,%rax,1)
  add    $0x1,%ebx
L109:
  lea    -0x70(%rbp),%rax
  mov    %rax,%rdi
  call   <str_len@plt>
  cmp    %eax,%ebx
  jl     L108
  cmpl   $0x0,-0x100(%rbp)
  je     L1
  mov    -0xfc(%rbp),%eax
  cltq
  mov    -0xc0(%rbp,%rax,8),%rax
  lea    -0x70(%rbp),%rdx
  mov    %rax,%rsi
  lea    D44(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
L1:
  cmpl   $0x0,-0xfc(%rbp)
  jne    L81
  lea    -0x70(%rbp),%rdx
  mov    -0xf0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <str_copy@plt>
L81:
  cmpl   $0x3,-0xfc(%rbp)
  jne    L16
  lea    -0x70(%rbp),%rdx
  mov    -0xf8(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <str_copy@plt>
  jmp    L16
L93:
  mov    -0xe8(%rbp),%rax
  add    $0x1,%rax
  mov    %rax,-0xe8(%rbp)
  add    $0x1,%ebx
L16:
  cmp    -0xd4(%rbp),%ebx
  jl     L93
L45:
  mov    -0xfc(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    %edx,-0xfc(%rbp)
  test   %eax,%eax
  jne    L124
  nop
  mov    -0x18(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L119
  call   <__stack_chk_fail@plt>
L119:
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

tool_calls: name: unpack_data
arguments: label: D2
type: string
name: unpack_data
arguments: label: D36
type: string
name: unpack_data
arguments: label: D45
type: string
name: unpack_data
arguments: label: D42
type: string
name: unpack_data
arguments: label: D44
type: string

tool: D2: key  

tool: D36: phone

tool: D45: email

tool: D42: time 

tool: D44: %s: %s


assistant: ```c
void _tw2_get_decode_key(char *skey, char *out_key, char *out_key_time, int cnt, int flag) {
  char akey[80], *pkey;
  register int i, j;
  const int length = 60;
  const int codec[] = {0, 1, 0, 2, 5, 2, 0, 3, 3, 0, 7};
  int k, asize = sizeof(codec) / sizeof(codec[0]);
  char *str[] = {"key  ", "phone", "email", "time "};
  while (cnt--) {
    pkey = akey;
    i = 0;
    while (*skey != 19 && i++ < 80 - 2)
      *pkey++ = *skey++;
    *pkey = '\0';
    str_reverse(akey);
    for (i = 0; i < (int)str_len(akey); i++) {
      k = i + asize;
      akey[i] += (k * (codec[i % asize])) % 33;
      akey[i] -= 20;
    }
    if (flag)
      printf("%s: %s\n", str[cnt], akey);
    if (cnt == 0)
      str_copy(out_key, akey);
    if (cnt == 3)
      str_copy(out_key_time, akey);
    for (j = i; j < length; j++)
      *skey++;
  }
}
```