user: Translate the below assembly code into C programming language:

```asm
<main>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  lea    D49(%rip),%r12
  push   %rbp
  lea    D25(%rip),%rbp
  push   %rbx
  mov    %rbp,%rdi
  sub    $0x28,%rsp
  call   <strlen@plt>
  mov    %eax,%edi
  mov    %eax,%ebx
  mov    %eax,0x1c(%rsp)
  call   <random_string@plt>
  xor    %edi,%edi
  mov    %rax,%r13
  call   <time@plt>
  mov    %eax,%edi
  call   <srand@plt>
  lea    0x1(%rbx),%eax
  movl   $0x1,0x14(%rsp)
  mov    %eax,0x18(%rsp)
  nopl   (%rax)
L49:
  mov    0x1c(%rsp),%edx
  mov    %r13,%rsi
  mov    $0x32,%edi
  xor    %r14d,%r14d
  xor    %ebx,%ebx
  call   <reproduce@plt>
  mov    0x14(%rsp),%esi
  lea    D50(%rip),%rdi
  mov    %rax,%r15
  xor    %eax,%eax
  call   <printf@plt>
  lea    D59(%rip),%rdi
  call   <puts@plt>
  pxor   %xmm1,%xmm1
  nopl   0x0(%rax,%rax,1)
L46:
  mov    (%r15,%r14,8),%rdi
  mov    %rbp,%rsi
  movss  %xmm1,0x10(%rsp)
  call   <compare@plt>
  mov    (%r15,%r14,8),%rsi
  xor    %eax,%eax
  mov    %r12,%rdi
  cvtsd2ss %xmm0,%xmm0
  movss  %xmm0,0xc(%rsp)
  call   <printf@plt>
  movss  0x10(%rsp),%xmm1
  movss  0xc(%rsp),%xmm0
  comiss %xmm1,%xmm0
  maxss  %xmm1,%xmm0
  cmova  %r14d,%ebx
  add    $0x1,%r14
  movaps %xmm0,%xmm1
  cmp    $0x32,%r14
  jne    L46
  movslq %ebx,%rcx
  mov    0x18(%rsp),%edx
  mov    %r13,%rdi
  lea    0x190(%r15),%rbx
  mov    (%r15,%rcx,8),%rsi
  call   <strncpy@plt>
  mov    %r13,%rsi
  lea    D20(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  nopl   0x0(%rax)
L12:
  mov    (%r15),%rdi
  add    $0x8,%r15
  call   <free@plt>
  cmp    %r15,%rbx
  jne    L12
  mov    %rbp,%rsi
  mov    %r13,%rdi
  call   <compare@plt>
  ucomisd D13(%rip),%xmm0
  jp     L37
  je     L19
L37:
  addl   $0x1,0x14(%rsp)
  jmp    L49
L19:
  add    $0x28,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: retrieve_data
arguments: label: D49
type_infered: string
name: retrieve_data
arguments: label: D25
type_infered: string
name: retrieve_data
arguments: label: D50
type_infered: string
name: retrieve_data
arguments: label: D59
type_infered: string
name: retrieve_data
arguments: label: D20
type_infered: string
name: retrieve_data
arguments: label: D13
type_infered: f64

tool: D49: %s	

tool: D25: METHINKS IT IS LIKE A WEASEL

tool: D50: Generation #%i


tool: D59: Children:

tool: D20: 

New parent: %s



tool: D13: 1

assistant: ```c
int main() {
  int i, finished = 0, generation = 1;
  int length = strlen("METHINKS IT IS LIKE A WEASEL");
  char *parent = random_string(length);
  char **children;
  srand(time(0));
  while (!finished) {
    int top_index = 0;
    float top_score = 0.0;
    children = reproduce(50, parent, length);
    printf("Generation #%i\n", generation);
    printf("Children:\n");
    for (i = 0; i < 50; i++) {
      float this_score = compare(children[i], "METHINKS IT IS LIKE A WEASEL");
      printf("%s\t", children[i]);
      if (this_score > top_score) {
        top_score = this_score;
        top_index = i;
      }
    }
    strncpy(parent, children[top_index], length + 1);
    printf("\n\nNew parent: %s\n\n", parent);
    for (i = 0; i < 50; i++) {
      free(children[i]);
    }
    if (compare(parent, "METHINKS IT IS LIKE A WEASEL") == 1.0) {
      finished = 1;
    }
    generation++;
  }
  return 0;
}
```