user: 请从给定的汇编指令推导出C源代码：

```asm
<fm_team_info>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  lea    D3(%rip),%rax
  mov    %rax,%rdi
  call   <fm_read@plt>
  mov    %rax,-0x18(%rbp)
  cmpq   $0x0,-0x18(%rbp)
  jne    L135
  mov    $0xffffffff,%eax
  jmp    L107
L135:
  mov    -0x18(%rbp),%rax
  lea    D4(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strstr@plt>
  mov    %rax,-0x10(%rbp)
  cmpq   $0x0,-0x10(%rbp)
  jne    L122
  cmpq   $0x0,-0x18(%rbp)
  je     L112
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  movq   $0x0,-0x18(%rbp)
L112:
  mov    $0xffffffff,%eax
  jmp    L107
L122:
  addq   $0xa,-0x10(%rbp)
  mov    -0x10(%rbp),%rax
  mov    $0x3b,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  mov    %rax,-0x8(%rbp)
  cmpq   $0x0,-0x8(%rbp)
  jne    L149
  cmpq   $0x0,-0x18(%rbp)
  je     L148
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  movq   $0x0,-0x18(%rbp)
L148:
  mov    $0xffffffff,%eax
  jmp    L107
L149:
  mov    -0x8(%rbp),%rax
  sub    -0x10(%rbp),%rax
  mov    %eax,%edx
  mov    -0x10(%rbp),%rcx
  mov    -0x28(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  mov    -0x8(%rbp),%rax
  sub    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  mov    -0x18(%rbp),%rax
  lea    D22(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strstr@plt>
  mov    %rax,-0x10(%rbp)
  cmpq   $0x0,-0x10(%rbp)
  jne    L104
  cmpq   $0x0,-0x18(%rbp)
  je     L23
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  movq   $0x0,-0x18(%rbp)
L23:
  mov    $0xffffffff,%eax
  jmp    L107
L104:
  addq   $0x9,-0x10(%rbp)
  mov    -0x10(%rbp),%rax
  mov    $0x3b,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  mov    %rax,-0x8(%rbp)
  cmpq   $0x0,-0x8(%rbp)
  jne    L102
  cmpq   $0x0,-0x18(%rbp)
  je     L68
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  movq   $0x0,-0x18(%rbp)
L68:
  mov    $0xffffffff,%eax
  jmp    L107
L102:
  mov    -0x8(%rbp),%rax
  sub    -0x10(%rbp),%rax
  mov    %eax,%edx
  mov    -0x10(%rbp),%rcx
  mov    -0x30(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  mov    -0x8(%rbp),%rax
  sub    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  cmpq   $0x0,-0x18(%rbp)
  je     L67
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  movq   $0x0,-0x18(%rbp)
L67:
  mov    $0x0,%eax
L107:
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: tag: D3
type_infered: string
name: retrieve_data
arguments: tag: D4
type_infered: string
name: retrieve_data
arguments: tag: D22
type_infered: string

tool: D3: probe.team

tool: D4: team_name:

tool: D22: pin_code:

assistant: ```c
int fm_team_info(char *team_name, char *pin_code) {
  char *tmp, *end, *data;
  data = fm_read("probe.team");
  if (data == NULL)
    return -1;
  tmp = strstr(data, "team_name:");
  if (tmp == NULL) {
    do {
      if ((data) != NULL) {
        free(data);
        (data) = NULL;
      }
    } while (0);
    return -1;
  }
  tmp += 10;
  end = strchr(tmp, ';');
  if (end == NULL) {
    do {
      if ((data) != NULL) {
        free(data);
        (data) = NULL;
      }
    } while (0);
    return -1;
  }
  memcpy(team_name, tmp, end - tmp);
  team_name[end - tmp + 1] = '\0';
  tmp = strstr(data, "pin_code:");
  if (tmp == NULL) {
    do {
      if ((data) != NULL) {
        free(data);
        (data) = NULL;
      }
    } while (0);
    return -1;
  }
  tmp += 9;
  end = strchr(tmp, ';');
  if (end == NULL) {
    do {
      if ((data) != NULL) {
        free(data);
        (data) = NULL;
      }
    } while (0);
    return -1;
  }
  memcpy(pin_code, tmp, end - tmp);
  pin_code[end - tmp + 1] = '\0';
  do {
    if ((data) != NULL) {
      free(data);
      (data) = NULL;
    }
  } while (0);
  return 0;
}
```