user: What is the c source code of the assembly code below?

```asm
<get_votes_weighted>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %rdi,%rbp
  mov    %rsi,%r12
  mov    %edx,%ebx
  mov    %ecx,%edi
  mov    %ecx,0x14(%rsp)
  call   <init_votes@plt>
  mov    %rax,0x20(%rsp)
  mov    $0x20,%edi
  call   <malloc@plt>
  mov    %rax,(%rsp)
  test   %ebx,%ebx
  jle    L48
  mov    %r12,0x18(%rsp)
  mov    %rbp,%r13
  lea    -0x1(%rbx),%eax
  lea    0x8(%rbp,%rax,8),%rax
  mov    %rax,0x28(%rsp)
  jmp    L35
L104:
  mov    (%rsp),%rdi
  call   <get_gap_qual@plt>
  mov    %eax,%ebp
  jmp    L62
  mov    (%r12),%rax
  movsbl %bpl,%ebp
  add    %ebp,(%rax)
L37:
  add    $0x1,%rbx
  add    $0x8,%r12
  cmp    0x8(%rsp),%rbx
  je     L110
L70:
  mov    %r13,%r14
  mov    0x0(%r13),%rax
  cmpb   $0x2d,(%rax,%rbx,1)
  je     L104
  mov    0x14(%rsp),%ecx
  mov    (%r15),%rdx
  mov    0x10(%rsp),%esi
  mov    (%rsp),%rdi
  call   <push_qual@plt>
  mov    %eax,0x10(%rsp)
  mov    (%r15),%rax
  movzbl (%rax,%rbx,1),%ebp
L62:
  mov    (%r14),%rax
  movsbl (%rax,%rbx,1),%edi
  call   <toupper@plt>
  sub    $0x2d,%eax
  cmp    $0x27,%eax
  ja     L37
  mov    %eax,%eax
  lea    D1(%rip),%rcx
  movslq (%rcx,%rax,4),%rax
  add    %rcx,%rax
  notrack jmp *%rax
  mov    (%r12),%rax
  movsbl %bpl,%ebp
  add    %ebp,0x4(%rax)
  jmp    L37
  mov    (%r12),%rax
  movsbl %bpl,%ebp
  add    %ebp,0x8(%rax)
  jmp    L37
  mov    (%r12),%rax
  movsbl %bpl,%ebp
  add    %ebp,0xc(%rax)
  jmp    L37
  mov    (%r12),%rax
  movsbl %bpl,%ebp
  add    %ebp,0x10(%rax)
  jmp    L37
  mov    (%r12),%rax
  movsbl %bpl,%ebp
  add    %ebp,0x14(%rax)
  jmp    L37
L110:
  addq   $0x8,0x18(%rsp)
  add    $0x8,%r13
  cmp    0x28(%rsp),%r13
  je     L48
L35:
  mov    0x18(%rsp),%rax
  mov    %rax,%r15
  mov    0x14(%rsp),%ebx
  mov    %ebx,%edx
  mov    (%rax),%rsi
  mov    (%rsp),%rdi
  call   <init_gap_qual_window@plt>
  mov    %eax,0x10(%rsp)
  test   %ebx,%ebx
  jle    L110
  mov    0x20(%rsp),%r12
  mov    %ebx,%eax
  mov    %rax,0x8(%rsp)
  mov    $0x0,%ebx
  jmp    L70
L48:
  mov    (%rsp),%rdi
  call   <free@plt>
  mov    0x20(%rsp),%rax
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
int **get_votes_weighted(char *align[], char *quals[], int n_seqs, int seq_len) {
  int **votes = init_votes(seq_len);
  int *window = malloc(sizeof(int) * 4 * 2);
  int win_edge;
  char qual;
  int i, j;
  for (i = 0; i < n_seqs; i++) {
    win_edge = init_gap_qual_window(window, quals[i], seq_len);
    for (j = 0; j < seq_len; j++) {
      if (align[i][j] == '-') {
        qual = get_gap_qual(window);
      } else {
        win_edge = push_qual(window, win_edge, quals[i], seq_len);
        qual = quals[i][j];
      }
      switch (toupper(align[i][j])) {
      case 'A':
        votes[j][0] += qual;
        break;
      case 'C':
        votes[j][1] += qual;
        break;
      case 'G':
        votes[j][2] += qual;
        break;
      case 'T':
        votes[j][3] += qual;
        break;
      case 'N':
        votes[j][4] += qual;
        break;
      case '-':
        votes[j][5] += qual;
        break;
      }
    }
  }
  free(window);
  return votes;
}
```