user: 下面的汇编指令对应的C源代码是什么：

```asm
<dt_parse_iso_zone_lenient>:
  endbr64
  test   %rsi,%rsi
  je     L123
  push   %r15
  push   %r14
  push   %r13
  mov    %rdx,%r13
  push   %r12
  mov    %rsi,%r12
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  sub    $0x18,%rsp
  movzbl (%rdi),%eax
  cmp    $0x47,%al
  je     L108
  jbe    L192
  mov    %eax,%edx
  and    $0xffffffdf,%edx
  cmp    $0x5a,%dl
  je     L201
  cmp    $0x55,%al
  jne    L336
  cmp    $0x2,%rsi
  jbe    L336
  cmpb   $0x54,0x1(%rdi)
  je     L202
  nopl   0x0(%rax,%rax,1)
L336:
  xor    %eax,%eax
L255:
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L192:
  cmp    $0x2b,%al
  je     L89
  cmp    $0x2d,%al
  jne    L336
  mov    $0xffffffff,%r14d
L22:
  cmp    $0x1,%r12
  je     L336
  mov    %r12,%rdx
  mov    $0x1,%esi
  mov    %rbp,%rdi
  call   <count_digits@plt>
  cmp    $0x2,%eax
  je     L245
  cmp    $0x4,%eax
  je     L100
  cmp    $0x1,%eax
  jne    L336
  mov    $0x1,%edx
  mov    $0x1,%esi
  mov    %rbp,%rdi
  mov    $0x3,%r15d
  call   <parse_number@plt>
  mov    $0x5,%r8d
  mov    %eax,%ebx
  mov    $0x2,%eax
L105:
  xor    %edx,%edx
  xor    %ecx,%ecx
  cmp    %r12,%r15
  ja     L327
  cmpb   $0x3a,0x0(%rbp,%rax,1)
  je     L326
L327:
  cmp    $0x17,%ebx
  jg     L336
  test   %dl,%dl
  jne    L336
  imul   $0x3c,%ebx,%edx
  add    %ecx,%edx
  imul   %r14d,%edx
  jmp    L56
  nopl   0x0(%rax)
L89:
  mov    $0x1,%r14d
  jmp    L22
  nopl   0x0(%rax,%rax,1)
L123:
  xor    %eax,%eax
  ret
  nopl   0x0(%rax,%rax,1)
L201:
  mov    $0x1,%eax
  xor    %edx,%edx
L56:
  test   %r13,%r13
  je     L255
  mov    %edx,0x0(%r13)
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax,%rax,1)
L108:
  cmp    $0x2,%rsi
  jbe    L336
  cmpb   $0x4d,0x1(%rdi)
  jne    L336
  cmpb   $0x54,0x2(%rdi)
  jne    L336
L28:
  cmp    $0x3,%r12
  je     L301
  movzbl 0x3(%rbp),%eax
  sub    $0x2b,%eax
  test   $0xfd,%al
  jne    L301
  lea    -0x3(%r12),%rsi
  lea    0x3(%rbp),%rdi
  mov    %r13,%rdx
  call   <dt_parse_iso_zone_lenient>
  test   %rax,%rax
  je     L336
  add    $0x3,%rax
  jmp    L255
  nopw   0x0(%rax,%rax,1)
L202:
  cmpb   $0x43,0x2(%rdi)
  jne    L336
  jmp    L28
  nopl   0x0(%rax)
L100:
  mov    $0x2,%edx
  mov    $0x1,%esi
  mov    %rbp,%rdi
  call   <parse_number@plt>
  mov    $0x2,%edx
  mov    $0x3,%esi
  mov    %rbp,%rdi
  mov    %eax,%ebx
  call   <parse_number@plt>
  cmp    $0x3b,%eax
  mov    %eax,%ecx
  mov    $0x5,%eax
  setg   %dl
  jmp    L327
L245:
  mov    $0x2,%edx
  mov    $0x1,%esi
  mov    %rbp,%rdi
  mov    $0x4,%r15d
  call   <parse_number@plt>
  mov    $0x6,%r8d
  mov    %eax,%ebx
  mov    $0x3,%eax
  jmp    L105
  nopw   0x0(%rax,%rax,1)
L301:
  mov    $0x3,%eax
  xor    %edx,%edx
  jmp    L56
  nopl   0x0(%rax)
L326:
  mov    %r12,%rdx
  mov    %r15,%rsi
  mov    %rbp,%rdi
  mov    %r8,0x8(%rsp)
  call   <count_digits@plt>
  cmp    $0x2,%eax
  jne    L336
  mov    $0x2,%edx
  mov    %r15,%rsi
  mov    %rbp,%rdi
  call   <parse_number@plt>
  cmp    $0x3b,%eax
  mov    %eax,%ecx
  mov    0x8(%rsp),%rax
  setg   %dl
  jmp    L327
```

assistant: ```c
size_t dt_parse_iso_zone_lenient(const char *str, size_t len, int *op) {
  const unsigned char *p;
  int o, h, m, sign;
  size_t n;
  if (len < 1)
    return 0;
  p = (const unsigned char *)str;
  switch (*p) {
  case 'z':
  case 'Z':
    o = 0;
    n = 1;
    goto zulu;
  case 'G':
    if (len < 3 || p[1] != 'M' || p[2] != 'T')
      return 0;
    if (len > 3 && (p[3] == '+' || p[3] == '-')) {
      if (!(n = dt_parse_iso_zone_lenient(str + 3, len - 3, op)))
        return 0;
      return n + 3;
    }
    o = 0;
    n = 3;
    goto zulu;
  case 'U':
    if (len < 3 || p[1] != 'T' || p[2] != 'C')
      return 0;
    if (len > 3 && (p[3] == '+' || p[3] == '-')) {
      if (!(n = dt_parse_iso_zone_lenient(str + 3, len - 3, op)))
        return 0;
      return n + 3;
    }
    o = 0;
    n = 3;
    goto zulu;
  case '+':
    sign = 1;
    break;
  case '-':
    sign = -1;
    break;
  default:
    return 0;
  }
  if (len < 2)
    return 0;
  n = count_digits(p, 1, len);
  m = 0;
  switch (n) {
  case 1:
    h = parse_number(p, 1, 1);
    n = 2;
    break;
  case 2:
    h = parse_number(p, 1, 2);
    n = 3;
    break;
  case 4:
    h = parse_number(p, 1, 2);
    m = parse_number(p, 3, 2);
    n = 5;
    goto hm;
  default:
    return 0;
  }
  if (len < n + 1 || p[n] != ':')
    goto hm;
  if (count_digits(p, ++n, len) != 2)
    return 0;
  m = parse_number(p, n, 2);
  n += 2;
hm:
  if (h > 23 || m > 59)
    return 0;
  o = sign * (h * 60 + m);
zulu:
  if (op)
    *op = o;
  return n;
}
```