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

```asm
<binaryErosion>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdx,-0x8(%rsp)
  mov    (%r8),%edx
  mov    %rdi,-0x38(%rsp)
  mov    %edx,%eax
  mov    %rsi,-0x40(%rsp)
  shr    $0x1f,%eax
  mov    %rcx,-0x30(%rsp)
  add    %edx,%eax
  mov    (%r9),%edx
  mov    %r8,-0x18(%rsp)
  sar    %eax
  mov    %r9,-0x10(%rsp)
  mov    %eax,%r13d
  mov    %edx,%eax
  shr    $0x1f,%eax
  add    %edx,%eax
  mov    (%rsi),%edx
  sar    %eax
  test   %edx,%edx
  jle    L26
  mov    -0x8(%rsp),%rsi
  mov    0x38(%rsp),%rdi
  mov    %eax,%r14d
  xor    %ecx,%ecx
  mov    (%rsi),%r12d
L121:
  xor    %edx,%edx
  test   %r12d,%r12d
  jle    L167
  nopw   0x0(%rax,%rax,1)
L82:
  imul   %ecx,%r12d
  lea    (%r12,%rdx,1),%eax
  add    $0x1,%edx
  cltq
  movl   $0xff,(%rdi,%rax,4)
  mov    (%rsi),%r12d
  cmp    %edx,%r12d
  jg     L82
L167:
  mov    -0x40(%rsp),%rax
  add    $0x1,%ecx
  mov    (%rax),%eax
  cmp    %ecx,%eax
  jg     L121
  test   %eax,%eax
  jle    L26
  movslq %r14d,%rax
  movl   $0x0,-0x20(%rsp)
  mov    $0xffffffff,%r15d
  neg    %rax
  shl    $0x2,%rax
  mov    %rax,-0x28(%rsp)
L60:
  test   %r12d,%r12d
  jle    L37
  mov    %r14d,%eax
  movl   $0x0,-0x1c(%rsp)
  movq   $0x0,-0x48(%rsp)
  neg    %eax
  mov    %eax,-0x50(%rsp)
  nopw   0x0(%rax,%rax,1)
L89:
  mov    -0x18(%rsp),%rax
  mov    (%rax),%eax
  test   %eax,%eax
  jle    L140
  mov    -0x10(%rsp),%rdi
  sub    %r13d,%eax
  xor    %r11d,%r11d
  xor    %ecx,%ecx
  mov    (%rdi),%ebx
  mov    -0x20(%rsp),%edi
  add    %edi,%eax
  mov    %edi,%r10d
  mov    %eax,-0x4c(%rsp)
  mov    -0x50(%rsp),%eax
  sub    %r13d,%r10d
  lea    (%rbx,%rax,1),%ebp
  nopl   (%rax)
L159:
  test   %ebx,%ebx
  jle    L127
  test   %ecx,%ecx
  jne    L127
  lea    (%r10,%r13,1),%eax
  mov    -0x40(%rsp),%rdi
  mov    -0x28(%rsp),%rsi
  movslq %r11d,%rdx
  cmp    %eax,%r13d
  mov    %r15d,%eax
  cmovle %r10d,%eax
  cmp    %eax,(%rdi)
  mov    -0x30(%rsp),%rdi
  cmovle %r15d,%eax
  lea    (%rdi,%rdx,4),%r8
  cmp    $0xffffffff,%eax
  setne  %r9b
  imul   %r12d,%eax
  cltq
  add    -0x48(%rsp),%rax
  lea    (%rsi,%rax,4),%rdi
  mov    -0x50(%rsp),%eax
  add    -0x38(%rsp),%rdi
  xor    %esi,%esi
L87:
  lea    (%rax,%r14,1),%edx
  cmp    %edx,%r14d
  jg     L146
  cmp    %r12d,%eax
  jl     L205
L146:
  mov    $0x1,%ecx
L127:
  add    $0x1,%r10d
  add    %ebx,%r11d
  cmp    -0x4c(%rsp),%r10d
  jne    L159
  test   %ecx,%ecx
  je     L140
L96:
  addl   $0x1,-0x50(%rsp)
  mov    -0x50(%rsp),%eax
  addq   $0x1,-0x48(%rsp)
  add    %r14d,%eax
  mov    %eax,-0x1c(%rsp)
  cmp    %eax,%r12d
  jg     L89
L37:
  mov    -0x40(%rsp),%rdi
  addl   $0x1,-0x20(%rsp)
  mov    -0x20(%rsp),%eax
  cmp    %eax,(%rdi)
  jg     L60
L26:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L205:
  cmp    $0xffffffff,%eax
  je     L146
  test   %r9b,%r9b
  je     L146
  mov    (%rdi,%rsi,1),%edx
  cmp    %edx,(%r8,%rsi,1)
  jne    L146
  add    $0x1,%eax
  add    $0x4,%rsi
  cmp    %eax,%ebp
  jne    L87
  jmp    L127
L140:
  imul   -0x20(%rsp),%r12d
  mov    0x38(%rsp),%rdi
  add    -0x1c(%rsp),%r12d
  movslq %r12d,%rax
  movl   $0x0,(%rdi,%rax,4)
  mov    -0x8(%rsp),%rax
  mov    (%rax),%r12d
  jmp    L96
```

assistant: ```c
void binaryErosion(int *image, int *width, int *height, int *mask, int *mask_width, int *mask_height, int *ret) {
  int x, y, i, j;
  int x_src = *mask_width / 2;
  int y_src = *mask_height / 2;
  for (x = 0; x < *width; x++) {
    for (y = 0; y < *height; y++) {
      ret[((*height) * (x) + (y) + (*width) * (*height) * (0))] = 255;
    }
  }
  for (x = 0; x < *width; x++) {
    for (y = 0; y < *height; y++) {
      int set = 0;
      for (i = 0; i < *mask_width; i++) {
        for (j = 0; j < *mask_height && !set; j++) {
          int x_pos, y_pos;
          x_pos = (x + i < x_src) ? -1 : x + i - x_src;
          x_pos = (x_pos > *width - 1) ? -1 : x_pos;
          y_pos = (y + j < y_src) ? -1 : y + j - y_src;
          y_pos = (y_pos > *height - 1) ? -1 : y_pos;
          if (x_pos != -1 && y_pos != -1) {
            if (mask[((*mask_height) * (i) + (j) + (*mask_width) * (*mask_height) * (0))] != image[((*height) * (x_pos) + (y_pos) + (*width) * (*height) * (0))]) {
              set = 1;
            }
          } else {
            set = 1;
          }
        }
      }
      if (!set) {
        ret[((*height) * (x) + (y) + (*width) * (*height) * (0))] = 0;
      }
    }
  }
}
```