user: Please show me the C implementation that matches the assembly code listed below:

```asm
<main>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x968,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x958(%rsp)
  xor    %eax,%eax
  movq   $0x0,0x150(%rsp)
  movq   $0x0,0x158(%rsp)
  lea    0x160(%rsp),%rdi
  mov    $0x0,%r12d
  mov    $0x7e,%ecx
  rep stos %rax,%es:(%rdi)
  lea    D59(%rip),%r13
  mov    %r13,%rdi
  call   <strlen@plt>
  mov    %eax,%edx
  sub    $0x8,%rsp
  lea    D74(%rip),%rax
  push   %rax
  push   $0x1
  push   $0x0
  push   $0x0
  push   $0xa7
  lea    0x180(%rsp),%rbx
  push   %rbx
  lea    D88(%rip),%rbp
  push   %rbp
  push   %rax
  push   $0x0
  mov    $0x0,%r9d
  mov    $0x0,%r8d
  mov    $0x1,%ecx
  mov    %r13,%rsi
  lea    D57(%rip),%rdi
  call   <make_pdu@plt>
  add    $0x50,%rsp
  mov    %rbx,%rsi
  lea    D80(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  movq   $0x0,0x8c(%rsp)
  movl   $0x0,0x94(%rsp)
  movq   $0x0,0xd0(%rsp)
  movq   $0x0,0xd8(%rsp)
  movq   $0x0,0xe0(%rsp)
  movb   $0x0,0xe8(%rsp)
  movq   $0x0,0xf0(%rsp)
  movq   $0x0,0xf8(%rsp)
  movq   $0x0,0x100(%rsp)
  movb   $0x0,0x108(%rsp)
  movq   $0x0,0x110(%rsp)
  movq   $0x0,0x118(%rsp)
  movq   $0x0,0x120(%rsp)
  movb   $0x0,0x128(%rsp)
  movq   $0x0,0x550(%rsp)
  movq   $0x0,0x558(%rsp)
  lea    0x560(%rsp),%rdi
  mov    $0x7e,%ecx
  mov    %r12,%rax
  rep stos %rax,%es:(%rdi)
  movq   $0x0,0x130(%rsp)
  movq   $0x0,0x138(%rsp)
  movq   $0x0,0x140(%rsp)
  movb   $0x0,0x148(%rsp)
  movq   $0x0,0x98(%rsp)
  movl   $0x0,0xa0(%rsp)
  movw   $0x0,0xa7(%rsp)
  movb   $0x0,0xa9(%rsp)
  movw   $0x0,0xaa(%rsp)
  movb   $0x0,0xac(%rsp)
  movw   $0x0,0xad(%rsp)
  movb   $0x0,0xaf(%rsp)
  movq   $0x0,0x74(%rsp)
  movq   $0x0,0x7c(%rsp)
  movq   $0x0,0xb0(%rsp)
  movq   $0x0,0xb8(%rsp)
  movl   $0x0,0xc0(%rsp)
  movq   $0x0,0x84(%rsp)
  lea    0x110(%rsp),%rax
  lea    0xf0(%rsp),%rdx
  lea    0xd0(%rsp),%rsi
  lea    0x8c(%rsp),%rdi
  sub    $0x8,%rsp
  push   $0x0
  lea    0x94(%rsp),%r15
  push   %r15
  lea    0xc8(%rsp),%r14
  push   %r14
  lea    0x9c(%rsp),%rcx
  mov    %rcx,0x30(%rsp)
  push   %rcx
  lea    0x9c(%rsp),%r10
  mov    %r10,0x40(%rsp)
  push   %r10
  lea    0xdd(%rsp),%r11
  mov    %r11,0x50(%rsp)
  push   %r11
  lea    0xa8(%rsp),%r8
  mov    %r8,0x60(%rsp)
  push   %r8
  lea    0xac(%rsp),%r9
  mov    %r9,0x70(%rsp)
  push   %r9
  lea    0xf2(%rsp),%r13
  mov    %r13,0x80(%rsp)
  push   %r13
  lea    0xf7(%rsp),%r12
  mov    %r12,0x90(%rsp)
  push   %r12
  lea    0xf0(%rsp),%rcx
  mov    %rcx,0xa0(%rsp)
  push   %rcx
  lea    0x190(%rsp),%r13
  push   %r13
  lea    0x5b8(%rsp),%r12
  push   %r12
  mov    %rax,0x70(%rsp)
  mov    %rax,%r9
  mov    %rdx,0xc0(%rsp)
  mov    %rdx,%r8
  mov    %rsi,0x78(%rsp)
  mov    %rsi,%rcx
  mov    %rdi,0xc8(%rsp)
  mov    %rdi,%rdx
  mov    %rbp,%rsi
  lea    D9(%rip),%rdi
  call   <splitpdu@plt>
  add    $0x70,%rsp
  mov    (%rsp),%rcx
  mov    0x8(%rsp),%rdx
  mov    %r12,%rsi
  lea    D20(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  sub    $0x8,%rsp
  push   $0x0
  push   %r15
  push   %r14
  push   0x30(%rsp)
  push   0x40(%rsp)
  push   0x50(%rsp)
  push   0x60(%rsp)
  push   0x70(%rsp)
  push   0x80(%rsp)
  push   0x90(%rsp)
  push   0xa0(%rsp)
  push   %r13
  push   %r12
  mov    0x70(%rsp),%r9
  mov    0xc0(%rsp),%r8
  mov    0x78(%rsp),%rcx
  mov    0xc8(%rsp),%rdx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <splitpdu@plt>
  add    $0x70,%rsp
  cmpl   $0x0,0x70(%rsp)
  jne    L16
  lea    D17(%rip),%rdi
  call   <puts@plt>
L7:
  mov    0x958(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L22
  mov    $0x0,%eax
  add    $0x968,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L16:
  lea    D82(%rip),%rdi
  call   <puts@plt>
  jmp    L7
L22:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: unpack_data
arguments: tag: D59
type: string
name: unpack_data
arguments: tag: D74
type: string
name: unpack_data
arguments: tag: D88
type: string
name: unpack_data
arguments: tag: D57
type: string
name: unpack_data
arguments: tag: D80
type: string
name: unpack_data
arguments: tag: D9
type: string
name: unpack_data
arguments: tag: D20
type: string
name: unpack_data
arguments: tag: D17
type: string
name: unpack_data
arguments: tag: D82
type: string

tool: D59: viltsik

tool: 

tool: D88: new

tool: D57: 3725215471

tool: D80: 
PDU: %s



tool: D9: 07916998051030F2040B916998775706F80000410192518220611254791E447F83E4E530194447A7E72E10

tool: D20: received message = %s from sender = %s at time = %s


tool: D17: there is a msg

tool: D82: there's a problem with that pdu. It isn't supported!

assistant: ```c
int main(void) {
  char *message = "viltsik";
  char *to = "3725215471";
  int alphabet = 1;
  int flash = 0;
  int with_udh = 0;
  char *udh_data = "";
  char *mode = "new";
  int report = 0;
  char pdu[1024] = {0};
  int validity = 167;
  int system_msg = 0;
  int replace_msg = 0;
  int to_type = 1;
  char *smsc = "";
  make_pdu(to, message, strlen(message), alphabet, flash, report, with_udh, udh_data, mode, pdu, validity, replace_msg, system_msg, to_type, smsc);
  printf("\nPDU: %s\n\n", pdu);
  char *mode1 = "new";
  int alphabet1[3] = {0};
  char sendr[25] = {0};
  char date[25] = {0};
  char recvd_time[25] = {0};
  char message1[1024] = {0};
  char smsc1[25] = {0};
  int with_udh1[3] = {0};
  char a_udh_data[3] = {0};
  char a_udh_type[3] = {0};
  int is_statusreport;
  int is_unsupported_pdu;
  char from_toa[3] = {0};
  int report1[2] = {0};
  int replace[2] = {0};
  char warning_headers[20] = {0};
  int flash1[2] = {0};
  int bin_udh = 0;
  char *received_msg = "07916998051030F2040B916998775706F80000410192518220611254791E447F83E4E530194447A7E72E10";
  splitpdu(received_msg, mode1, alphabet1, sendr, date, recvd_time, message1, smsc1, with_udh1, a_udh_data, a_udh_type, &is_statusreport, &is_unsupported_pdu, from_toa, report1, replace, warning_headers, flash1, bin_udh);
  printf("received message = %s from sender = %s at time = %s\n", message1, sendr, recvd_time);
  splitpdu(pdu, mode1, alphabet1, sendr, date, recvd_time, message1, smsc1, with_udh1, a_udh_data, a_udh_type, &is_statusreport, &is_unsupported_pdu, from_toa, report1, replace, warning_headers, flash1, bin_udh);
  if (!is_unsupported_pdu) {
    printf("there is a msg\n");
  } else {
    printf("there's a problem with that pdu. It isn't supported!\n");
  }
  return 0;
}
```