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

```asm
<c_timegm>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  lea    0x76c(%rax),%ecx
  mov    -0x18(%rbp),%rax
  mov    0x4(%rax),%eax
  movslq %eax,%rdx
  imul   $0x2aaaaaab,%rdx,%rdx
  shr    $0x20,%rdx
  sar    %edx
  sar    $0x1f,%eax
  mov    %eax,%esi
  mov    %edx,%eax
  sub    %esi,%eax
  add    %ecx,%eax
  cltq
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  lea    -0x7b2(%rax),%rdx
  mov    %rdx,%rax
  shl    $0x3,%rax
  add    %rdx,%rax
  shl    $0x3,%rax
  add    %rdx,%rax
  lea    0x0(,%rax,4),%rdx
  lea    (%rax,%rdx,1),%rsi
  mov    -0x18(%rbp),%rax
  mov    0x4(%rax),%ecx
  movslq %ecx,%rax
  imul   $0x2aaaaaab,%rax,%rax
  shr    $0x20,%rax
  sar    %eax
  mov    %ecx,%edi
  sar    $0x1f,%edi
  sub    %edi,%eax
  mov    %eax,%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  shl    $0x2,%eax
  sub    %eax,%ecx
  mov    %ecx,%edx
  movslq %edx,%rax
  lea    0x0(,%rax,4),%rdx
  lea    D4(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  add    %rsi,%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x8(%rbp),%rax
  sub    $0x7b0,%rax
  lea    0x3(%rax),%rdx
  test   %rax,%rax
  cmovs  %rdx,%rax
  sar    $0x2,%rax
  add    %rax,-0x10(%rbp)
  mov    -0x8(%rbp),%rax
  lea    -0x76c(%rax),%rcx
  movabs $0xa3d70a3d70a3d70b,%rdx
  mov    %rcx,%rax
  imul   %rdx
  lea    (%rdx,%rcx,1),%rax
  sar    $0x6,%rax
  mov    %rax,%rdx
  mov    %rcx,%rax
  sar    $0x3f,%rax
  sub    %rdx,%rax
  add    %rax,-0x10(%rbp)
  mov    -0x8(%rbp),%rax
  lea    -0x640(%rax),%rcx
  movabs $0xa3d70a3d70a3d70b,%rdx
  mov    %rcx,%rax
  imul   %rdx
  lea    (%rdx,%rcx,1),%rax
  sar    $0x8,%rax
  sar    $0x3f,%rcx
  mov    %rcx,%rdx
  sub    %rdx,%rax
  add    %rax,-0x10(%rbp)
  mov    -0x8(%rbp),%rax
  and    $0x3,%eax
  test   %rax,%rax
  jne    L47
  mov    -0x8(%rbp),%rcx
  movabs $0xa3d70a3d70a3d70b,%rdx
  mov    %rcx,%rax
  imul   %rdx
  lea    (%rdx,%rcx,1),%rax
  sar    $0x6,%rax
  mov    %rcx,%rsi
  sar    $0x3f,%rsi
  sub    %rsi,%rax
  mov    %rax,%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  lea    0x0(,%rax,4),%rdx
  add    %rdx,%rax
  shl    $0x2,%rax
  sub    %rax,%rcx
  mov    %rcx,%rdx
  test   %rdx,%rdx
  jne    L35
  mov    -0x8(%rbp),%rcx
  movabs $0xa3d70a3d70a3d70b,%rdx
  mov    %rcx,%rax
  imul   %rdx
  lea    (%rdx,%rcx,1),%rax
  sar    $0x8,%rax
  mov    %rcx,%rsi
  sar    $0x3f,%rsi
  sub    %rsi,%rax
  mov    %rax,%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  lea    0x0(,%rax,4),%rdx
  add    %rdx,%rax
  shl    $0x4,%rax
  sub    %rax,%rcx
  mov    %rcx,%rdx
  test   %rdx,%rdx
  jne    L47
L35:
  mov    -0x18(%rbp),%rax
  mov    0x4(%rax),%ecx
  movslq %ecx,%rax
  imul   $0x2aaaaaab,%rax,%rax
  shr    $0x20,%rax
  sar    %eax
  mov    %ecx,%esi
  sar    $0x1f,%esi
  sub    %esi,%eax
  mov    %eax,%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  shl    $0x2,%eax
  sub    %eax,%ecx
  mov    %ecx,%edx
  cmp    $0x1,%edx
  jg     L47
  subq   $0x1,-0x10(%rbp)
L47:
  mov    -0x18(%rbp),%rax
  mov    0x8(%rax),%eax
  sub    $0x1,%eax
  cltq
  add    %rax,-0x10(%rbp)
  mov    -0x10(%rbp),%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  shl    $0x3,%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x18(%rbp),%rax
  mov    0x20(%rax),%rax
  add    %rax,-0x10(%rbp)
  mov    -0x10(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x4,%rax
  sub    %rdx,%rax
  shl    $0x2,%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x18(%rbp),%rax
  mov    0x18(%rax),%rax
  add    %rax,-0x10(%rbp)
  mov    -0x10(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x4,%rax
  sub    %rdx,%rax
  shl    $0x2,%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x18(%rbp),%rax
  mov    0x10(%rax),%rax
  add    %rax,-0x10(%rbp)
  mov    -0x18(%rbp),%rax
  mov    0xc(%rax),%eax
  cmp    $0x1,%eax
  jne    L46
  subq   $0xe10,-0x10(%rbp)
L46:
  mov    -0x10(%rbp),%rax
  pop    %rbp
  ret
```

tool_calls: name: parse_data
arguments: tag: D4
datatype: string

tool: 

assistant: ```c
time_t c_timegm(struct tm *t) {
  long year;
  time_t result;
  static const int cdays[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
  year = 1900 + t->tm_year + t->tm_mon / 12;
  result = (year - 1970) * 365 + cdays[t->tm_mon % 12];
  result += (year - 1968) / 4;
  result -= (year - 1900) / 100;
  result += (year - 1600) / 400;
  if ((year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0) && (t->tm_mon % 12) < 2) {
    result--;
  }
  result += t->tm_mday - 1;
  result *= 24;
  result += t->tm_hour;
  result *= 60;
  result += t->tm_min;
  result *= 60;
  result += t->tm_sec;
  if (t->tm_isdst == 1)
    result -= 3600;
  return result;
}
```