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

```asm
<hide>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  mov    %rdx,%r12
  test   %rdx,%rdx
  sete   %al
  test   %rcx,%rcx
  sete   %dl
  or     %dl,%al
  jne    L92
  mov    %rdi,%rbp
  mov    %rsi,%r13
  mov    %rcx,%rbx
  test   %rdi,%rdi
  je     L92
  lea    D31(%rip),%rsi
  mov    %rcx,%rdi
  call   <fopen@plt>
  mov    %rax,%r14
  test   %rax,%rax
  je     L12
  lea    D20(%rip),%rsi
  mov    %r12,%rdi
  call   <fopen@plt>
  mov    %rax,%r15
  test   %rax,%rax
  je     L28
  mov    %rax,%rsi
  mov    %r13,%rdi
  call   <has_enough_lines@plt>
  mov    $0x7,%r12d
  test   %eax,%eax
  je     L99
L154:
  lea    0x0(,%r12,8),%ecx
  mov    %r13,%rdi
  shr    %cl,%rdi
  movsbl %dil,%edi
  mov    %r14,%rdx
  mov    %r15,%rsi
  call   <hide_byte@plt>
  mov    %eax,%ebx
  test   %eax,%eax
  setne  %al
  sub    $0x1,%r12d
  js     L103
  test   %al,%al
  jne    L154
L103:
  add    %rbp,%r13
  cmp    %r13,%rbp
  je     L31
  test   %al,%al
  je     L31
L37:
  movsbl 0x0(%rbp),%edi
  mov    %r14,%rdx
  mov    %r15,%rsi
  call   <hide_byte@plt>
  mov    %eax,%ebx
  add    $0x1,%rbp
  cmp    %rbp,%r13
  je     L31
  test   %eax,%eax
  jne    L37
L31:
  test   %ebx,%ebx
  je     L140
L107:
  mov    %r14,%rdx
  mov    %r15,%rsi
  mov    $0x0,%edi
  call   <hide_byte@plt>
  test   %eax,%eax
  jne    L107
L140:
  mov    %r14,%rdi
  call   <fclose@plt>
  mov    %r15,%rdi
  call   <fclose@plt>
  test   %ebx,%ebx
  sete   %al
  movzbl %al,%eax
  jmp    L120
L12:
  mov    %rbx,%rsi
  lea    D8(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x1,%eax
  jmp    L120
L28:
  mov    %r14,%rdi
  call   <fclose@plt>
  mov    %r12,%rsi
  lea    D7(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x1,%eax
  jmp    L120
L99:
  lea    D44(%rip),%rdi
  call   <puts@plt>
  mov    %r14,%rdi
  call   <fclose@plt>
  mov    %r15,%rdi
  call   <fclose@plt>
  mov    %rbx,%rdi
  call   <remove@plt>
  mov    $0x1,%eax
  jmp    L120
L92:
  mov    $0x1,%eax
L120:
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: read_data
arguments: data_tag: D31
type_guessed: string
name: read_data
arguments: data_tag: D20
type_guessed: string
name: read_data
arguments: data_tag: D8
type_guessed: string
name: read_data
arguments: data_tag: D7
type_guessed: string
name: read_data
arguments: data_tag: D44
type_guessed: string

tool: D31: wb

tool: D20: rb

tool: D8: ERROR: unable to write to "%s".


tool: D7: ERROR: unable to read from "%s".


tool: D44: ERROR: the cover file must be larger.

assistant: ```c
int hide(const char *input_buf, const size_t input_buf_size, const char *cover_path, const char *output_path) {
  const char *ip = input_buf;
  const char *ip_end = ip + input_buf_size;
  FILE *cover_fp = NULL;
  FILE *output_fp = NULL;
  unsigned char byte = 0;
  int b = 0;
  int should_continue = 1;
  if (input_buf == NULL || cover_path == NULL || output_path == NULL) {
    return 1;
  }
  output_fp = fopen(output_path, "wb");
  if (output_fp == NULL) {
    printf("ERROR: unable to write to \"%s\".\n", output_path);
    return 1;
  }
  cover_fp = fopen(cover_path, "rb");
  if (cover_fp == NULL) {
    fclose(output_fp);
    printf("ERROR: unable to read from \"%s\".\n", cover_path);
    return 1;
  }
  if (!has_enough_lines(input_buf_size, cover_fp)) {
    printf("ERROR: the cover file must be larger.\n");
    fclose(output_fp);
    fclose(cover_fp);
    remove(output_path);
    return 1;
  }
  b = sizeof(input_buf_size) - 1;
  while (b > -1 && should_continue) {
    byte = input_buf_size >> (8 * b);
    should_continue = hide_byte(byte, cover_fp, output_fp);
    b--;
  }
  while (ip != ip_end && should_continue) {
    should_continue = hide_byte(*ip, cover_fp, output_fp);
    ip++;
  }
  if (should_continue) {
    while (hide_byte(0, cover_fp, output_fp))
      ;
  }
  fclose(output_fp);
  fclose(cover_fp);
  return (should_continue) ? 0 : 1;
}
```