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

```asm
<ai_playmonopoly>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x88,%rsp
  mov    %edi,0x14(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x78(%rsp)
  xor    %eax,%eax
  mov    $0x2,%esi
  call   <data_getcards@plt>
  mov    %rax,%rdx
  mov    $0x0,%eax
  test   %rdx,%rdx
  jne    L149
L14:
  mov    0x78(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L153
  add    $0x88,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L149:
  mov    $0xffffffff,%edx
  mov    $0x2,%esi
  mov    0x14(%rsp),%ebx
  mov    %ebx,%edi
  call   <data_addcards@plt>
  mov    %ebx,%edi
  call   <ai_rateres@plt>
  mov    %rax,0x18(%rsp)
  lea    0x20(%rsp),%rdi
  call   <stats_getlast5rolls@plt>
  movl   $0x0,0x40(%rsp)
  movl   $0x0,0x44(%rsp)
  movl   $0x0,0x48(%rsp)
  movl   $0x0,0x4c(%rsp)
  movl   $0x0,0x50(%rsp)
  mov    $0x1,%r12d
  lea    0x34(%rsp),%r14
  lea    0x60(%rsp),%rax
  mov    %rax,0x8(%rsp)
  lea    0x78(%rsp),%r15
  jmp    L25
L107:
  mov    0x8(%rsp),%rbp
  mov    %rbp,%rsi
  mov    %r12d,%edi
  call   <ai_vertsonhex@plt>
  jmp    L125
L106:
  add    $0x4,%rbp
  cmp    %rbp,%r15
  je     L170
L125:
  mov    0x0(%rbp),%r13d
  mov    %r13d,%edi
  call   <data_playeratvertex@plt>
  mov    %eax,%edi
  mov    %r13d,%esi
  call   <data_atvertex@plt>
  test   %rax,%rax
  jle    L106
  mov    0x0(%rbp),%r13d
  mov    %r13d,%edi
  call   <data_playeratvertex@plt>
  mov    %eax,%edi
  mov    %r13d,%esi
  call   <data_atvertex@plt>
  mov    %rax,%r13
  mov    $0x0,%esi
  mov    %r12d,%edi
  call   <map_getdat@plt>
  add    %r13d,0x40(%rsp,%rax,4)
  jmp    L106
L137:
  add    $0x1,%r12d
  cmp    $0x16,%r12d
  je     L39
L25:
  lea    0x20(%rsp),%rbx
L119:
  movslq (%rbx),%rbp
  mov    $0x1,%esi
  mov    %r12d,%edi
  call   <map_getdat@plt>
  cmp    %rax,%rbp
  je     L107
L170:
  add    $0x4,%rbx
  cmp    %r14,%rbx
  jne    L119
  jmp    L137
L39:
  mov    $0x0,%ebx
  mov    $0x0,%r14d
  mov    $0x0,%r13d
  jmp    L121
L46:
  add    $0x1,%rbx
  cmp    $0x5,%rbx
  je     L20
L121:
  mov    0x40(%rsp,%rbx,4),%r12d
  mov    %ebx,%esi
  mov    0x14(%rsp),%r15d
  mov    %r15d,%edi
  call   <data_getresource@plt>
  mov    %eax,%edx
  mov    %r12d,%eax
  sub    %edx,%eax
  cmp    %r13d,%eax
  jle    L46
  mov    0x18(%rsp),%rax
  cmpl   $0x1,(%rax,%rbx,4)
  jle    L46
  mov    %ebx,%esi
  mov    %r15d,%edi
  call   <data_getresource@plt>
  sub    %eax,%r12d
  mov    %r12d,%r13d
  mov    %ebx,%r14d
  jmp    L46
L20:
  mov    $0x0,%eax
  cmp    $0x3,%r13d
  jle    L14
  mov    %r14d,%edi
  call   <map_getresname@plt>
  mov    %rax,%rbx
  mov    0x14(%rsp),%r15d
  lea    0x1(%r15),%edi
  call   <itoa@plt>
  mov    %rax,%rsi
  lea    D18(%rip),%rdi
  call   <cat@plt>
  mov    %rax,%rdi
  lea    D8(%rip),%rsi
  call   <cat@plt>
  mov    %rax,%rdi
  mov    %rbx,%rsi
  call   <cat@plt>
  mov    %rax,%rdi
  call   <map_setmessage@plt>
  mov    %r14d,%esi
  mov    %r15d,%edi
  call   <devcards_domonopoly@plt>
  mov    $0x1,%eax
  jmp    L14
L153:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: extract_symbolic_data
arguments: label: D18
type_guessed: string
name: extract_symbolic_data
arguments: label: D8
type_guessed: string

tool: D18: Player 

tool: D8:  monopolized 

assistant: ```c
int ai_playmonopoly(int player) {
  if (data_getcards(player, 2)) {
    data_addcards(player, 2, -1);
    int *res = ai_rateres(player);
    int nums[5];
    stats_getlast5rolls(nums);
    int i, j, k, max, maxi, verts[6];
    int resources[5];
    for (i = 0; i < 5; i++)
      resources[i] = 0;
    max = maxi = 0;
    for (i = 1; i < 22; i++) {
      for (j = 0; j < 5; j++) {
        if (nums[j] == map_getdat(i, 1)) {
          ai_vertsonhex(i, verts);
          for (k = 0; k < 6; k++) {
            if (data_atvertex(data_playeratvertex(verts[k]), verts[k]) > 0) {
              resources[map_getdat(i, 0)] += data_atvertex(data_playeratvertex(verts[k]), verts[k]);
            }
          }
        }
      }
    }
    for (i = 0; i < 5; i++) {
      if (max < resources[i] - data_getresource(player, i) && res[i] > 1) {
        max = resources[i] - data_getresource(player, i);
        maxi = i;
      }
    }
    if (max < 4)
      return 0;
    map_setmessage(cat(cat(cat("Player ", itoa(player + 1)), " monopolized "), map_getresname(maxi)));
    devcards_domonopoly(player, maxi);
    return 1;
  }
  return 0;
}
```