user: Translate the below assembly code into C programming language:

```asm
<Send_KeyBindings>:
  endbr64
  push   %rbx
  sub    $0x20,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  call   <trap_Key_GetCatcher@plt>
  test   %rax,%rax
  je     L80
L159:
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L161
  add    $0x20,%rsp
  pop    %rbx
  ret
L80:
  lea    0x8(%rsp),%rsi
  lea    D23(%rip),%rdi
  call   <Controls_GetKeyBindings@plt>
  mov    0x8(%rsp),%ecx
  cmp    $0xffffffff,%ecx
  jne    L37
L146:
  lea    0x8(%rsp),%rsi
  lea    D296(%rip),%rdi
  call   <Controls_GetKeyBindings@plt>
  mov    0x8(%rsp),%ecx
  cmp    $0xffffffff,%ecx
  jne    L79
L239:
  lea    0x8(%rsp),%rsi
  lea    D287(%rip),%rdi
  call   <Controls_GetKeyBindings@plt>
  mov    0x8(%rsp),%ecx
  cmp    $0xffffffff,%ecx
  jne    L58
L60:
  lea    0x8(%rsp),%rsi
  lea    D170(%rip),%rdi
  call   <Controls_GetKeyBindings@plt>
  mov    0x8(%rsp),%ecx
  cmp    $0xffffffff,%ecx
  jne    L25
L226:
  lea    0x8(%rsp),%rsi
  lea    D329(%rip),%rdi
  call   <Controls_GetKeyBindings@plt>
  mov    0x8(%rsp),%ecx
  cmp    $0xffffffff,%ecx
  jne    L73
L137:
  lea    0x8(%rsp),%rsi
  lea    D10(%rip),%rdi
  call   <Controls_GetKeyBindings@plt>
  mov    0x8(%rsp),%ecx
  cmp    $0xffffffff,%ecx
  jne    L208
L100:
  lea    0x8(%rsp),%rsi
  lea    D394(%rip),%rdi
  call   <Controls_GetKeyBindings@plt>
  mov    0x8(%rsp),%ecx
  cmp    $0xffffffff,%ecx
  jne    L8
L65:
  lea    0x8(%rsp),%rsi
  lea    D155(%rip),%rdi
  call   <Controls_GetKeyBindings@plt>
  mov    0x8(%rsp),%ecx
  cmp    $0xffffffff,%ecx
  je     L159
  lea    0x13(%rsp),%rbx
  lea    D194(%rip),%rdx
  mov    $0x5,%esi
  mov    %rbx,%rdi
  call   <Com_sprintf@plt>
  mov    %rbx,%rsi
  lea    D104(%rip),%rdi
  call   <trap_Cvar_Set@plt>
  mov    0xc(%rsp),%ecx
  cmp    $0xffffffff,%ecx
  je     L159
  lea    D194(%rip),%rdx
  mov    $0x5,%esi
  mov    %rbx,%rdi
  call   <Com_sprintf@plt>
  mov    %rbx,%rsi
  lea    D303(%rip),%rdi
  call   <trap_Cvar_Set@plt>
  jmp    L159
L37:
  lea    0x13(%rsp),%rbx
  lea    D194(%rip),%rdx
  mov    $0x5,%esi
  mov    %rbx,%rdi
  call   <Com_sprintf@plt>
  mov    %rbx,%rsi
  lea    D208(%rip),%rdi
  call   <trap_Cvar_Set@plt>
  mov    0xc(%rsp),%ecx
  cmp    $0xffffffff,%ecx
  je     L146
  lea    D194(%rip),%rdx
  mov    $0x5,%esi
  mov    %rbx,%rdi
  call   <Com_sprintf@plt>
  mov    %rbx,%rsi
  lea    D83(%rip),%rdi
  call   <trap_Cvar_Set@plt>
  jmp    L146
L79:
  lea    0x13(%rsp),%rbx
  lea    D194(%rip),%rdx
  mov    $0x5,%esi
  mov    %rbx,%rdi
  call   <Com_sprintf@plt>
  mov    %rbx,%rsi
  lea    D365(%rip),%rdi
  call   <trap_Cvar_Set@plt>
  mov    0xc(%rsp),%ecx
  cmp    $0xffffffff,%ecx
  je     L239
  lea    D194(%rip),%rdx
  mov    $0x5,%esi
  mov    %rbx,%rdi
  call   <Com_sprintf@plt>
  mov    %rbx,%rsi
  lea    D253(%rip),%rdi
  call   <trap_Cvar_Set@plt>
  jmp    L239
L58:
  lea    0x13(%rsp),%rbx
  lea    D194(%rip),%rdx
  mov    $0x5,%esi
  mov    %rbx,%rdi
  call   <Com_sprintf@plt>
  mov    %rbx,%rsi
  lea    D390(%rip),%rdi
  call   <trap_Cvar_Set@plt>
  mov    0xc(%rsp),%ecx
  cmp    $0xffffffff,%ecx
  je     L60
  lea    D194(%rip),%rdx
  mov    $0x5,%esi
  mov    %rbx,%rdi
  call   <Com_sprintf@plt>
  mov    %rbx,%rsi
  lea    D297(%rip),%rdi
  call   <trap_Cvar_Set@plt>
  jmp    L60
L25:
  lea    0x13(%rsp),%rbx
  lea    D194(%rip),%rdx
  mov    $0x5,%esi
  mov    %rbx,%rdi
  call   <Com_sprintf@plt>
  mov    %rbx,%rsi
  lea    D237(%rip),%rdi
  call   <trap_Cvar_Set@plt>
  mov    0xc(%rsp),%ecx
  cmp    $0xffffffff,%ecx
  je     L226
  lea    D194(%rip),%rdx
  mov    $0x5,%esi
  mov    %rbx,%rdi
  call   <Com_sprintf@plt>
  mov    %rbx,%rsi
  lea    D367(%rip),%rdi
  call   <trap_Cvar_Set@plt>
  jmp    L226
L73:
  lea    0x13(%rsp),%rbx
  lea    D194(%rip),%rdx
  mov    $0x5,%esi
  mov    %rbx,%rdi
  call   <Com_sprintf@plt>
  mov    %rbx,%rsi
  lea    D353(%rip),%rdi
  call   <trap_Cvar_Set@plt>
  mov    0xc(%rsp),%ecx
  cmp    $0xffffffff,%ecx
  je     L137
  lea    D194(%rip),%rdx
  mov    $0x5,%esi
  mov    %rbx,%rdi
  call   <Com_sprintf@plt>
  mov    %rbx,%rsi
  lea    D218(%rip),%rdi
  call   <trap_Cvar_Set@plt>
  jmp    L137
L208:
  lea    0x13(%rsp),%rbx
  lea    D194(%rip),%rdx
  mov    $0x5,%esi
  mov    %rbx,%rdi
  call   <Com_sprintf@plt>
  mov    %rbx,%rsi
  lea    D307(%rip),%rdi
  call   <trap_Cvar_Set@plt>
  mov    0xc(%rsp),%ecx
  cmp    $0xffffffff,%ecx
  je     L100
  lea    D194(%rip),%rdx
  mov    $0x5,%esi
  mov    %rbx,%rdi
  call   <Com_sprintf@plt>
  mov    %rbx,%rsi
  lea    D294(%rip),%rdi
  call   <trap_Cvar_Set@plt>
  jmp    L100
L8:
  lea    0x13(%rsp),%rbx
  lea    D194(%rip),%rdx
  mov    $0x5,%esi
  mov    %rbx,%rdi
  call   <Com_sprintf@plt>
  mov    %rbx,%rsi
  lea    D251(%rip),%rdi
  call   <trap_Cvar_Set@plt>
  mov    0xc(%rsp),%ecx
  cmp    $0xffffffff,%ecx
  je     L65
  lea    D194(%rip),%rdx
  mov    $0x5,%esi
  mov    %rbx,%rdi
  call   <Com_sprintf@plt>
  mov    %rbx,%rsi
  lea    D225(%rip),%rdi
  call   <trap_Cvar_Set@plt>
  jmp    L65
L161:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: data_label: D23
data_type: string
name: retrieve_data
arguments: data_label: D296
data_type: string
name: retrieve_data
arguments: data_label: D287
data_type: string
name: retrieve_data
arguments: data_label: D170
data_type: string
name: retrieve_data
arguments: data_label: D329
data_type: string
name: retrieve_data
arguments: data_label: D10
data_type: string
name: retrieve_data
arguments: data_label: D394
data_type: string
name: retrieve_data
arguments: data_label: D155
data_type: string
name: retrieve_data
arguments: data_label: D194
data_type: string
name: retrieve_data
arguments: data_label: D104
data_type: string
name: retrieve_data
arguments: data_label: D303
data_type: string
name: retrieve_data
arguments: data_label: D208
data_type: string
name: retrieve_data
arguments: data_label: D83
data_type: string
name: retrieve_data
arguments: data_label: D365
data_type: string
name: retrieve_data
arguments: data_label: D253
data_type: string
name: retrieve_data
arguments: data_label: D390
data_type: string
name: retrieve_data
arguments: data_label: D297
data_type: string
name: retrieve_data
arguments: data_label: D237
data_type: string
name: retrieve_data
arguments: data_label: D367
data_type: string
name: retrieve_data
arguments: data_label: D353
data_type: string
name: retrieve_data
arguments: data_label: D218
data_type: string
name: retrieve_data
arguments: data_label: D307
data_type: string
name: retrieve_data
arguments: data_label: D294
data_type: string
name: retrieve_data
arguments: data_label: D251
data_type: string
name: retrieve_data
arguments: data_label: D225
data_type: string

tool: D23: +attack

tool: D296: +button6

tool: D287: +forward

tool: D170: +back

tool: D329: +moveleft

tool: D10: +moveright

tool: D394: +left

tool: D155: +right

tool: D194: %i

tool: D104: cl_button_turnright1

tool: D303: cl_button_turnright2

tool: D208: cl_button_attack1

tool: D83: cl_button_attack2

tool: D365: cl_button_altattack1

tool: D253: cl_button_altattack2

tool: D390: cl_button_forward1

tool: D297: cl_button_forward2

tool: D237: cl_button_back1

tool: D367: cl_button_back2

tool: D353: cl_button_moveleft1

tool: D218: cl_button_moveleft2

tool: D307: cl_button_moveright1

tool: D294: cl_button_moveright2

tool: D251: cl_button_turnleft1

tool: D225: cl_button_turnleft2

assistant: ```c
void Send_KeyBindings(void) {
  int keys[2];
  char key[5];
  if (trap_Key_GetCatcher())
    return;
  Controls_GetKeyBindings("+attack", keys);
  if (keys[0] != -1) {
    Com_sprintf(key, sizeof(key), "%i", keys[0]);
    trap_Cvar_Set("cl_button_attack1", key);
    if (keys[1] != -1) {
      Com_sprintf(key, sizeof(key), "%i", keys[1]);
      trap_Cvar_Set("cl_button_attack2", key);
    }
  }
  Controls_GetKeyBindings("+button6", keys);
  if (keys[0] != -1) {
    Com_sprintf(key, sizeof(key), "%i", keys[0]);
    trap_Cvar_Set("cl_button_altattack1", key);
    if (keys[1] != -1) {
      Com_sprintf(key, sizeof(key), "%i", keys[1]);
      trap_Cvar_Set("cl_button_altattack2", key);
    }
  }
  Controls_GetKeyBindings("+forward", keys);
  if (keys[0] != -1) {
    Com_sprintf(key, sizeof(key), "%i", keys[0]);
    trap_Cvar_Set("cl_button_forward1", key);
    if (keys[1] != -1) {
      Com_sprintf(key, sizeof(key), "%i", keys[1]);
      trap_Cvar_Set("cl_button_forward2", key);
    }
  }
  Controls_GetKeyBindings("+back", keys);
  if (keys[0] != -1) {
    Com_sprintf(key, sizeof(key), "%i", keys[0]);
    trap_Cvar_Set("cl_button_back1", key);
    if (keys[1] != -1) {
      Com_sprintf(key, sizeof(key), "%i", keys[1]);
      trap_Cvar_Set("cl_button_back2", key);
    }
  }
  Controls_GetKeyBindings("+moveleft", keys);
  if (keys[0] != -1) {
    Com_sprintf(key, sizeof(key), "%i", keys[0]);
    trap_Cvar_Set("cl_button_moveleft1", key);
    if (keys[1] != -1) {
      Com_sprintf(key, sizeof(key), "%i", keys[1]);
      trap_Cvar_Set("cl_button_moveleft2", key);
    }
  }
  Controls_GetKeyBindings("+moveright", keys);
  if (keys[0] != -1) {
    Com_sprintf(key, sizeof(key), "%i", keys[0]);
    trap_Cvar_Set("cl_button_moveright1", key);
    if (keys[1] != -1) {
      Com_sprintf(key, sizeof(key), "%i", keys[1]);
      trap_Cvar_Set("cl_button_moveright2", key);
    }
  }
  Controls_GetKeyBindings("+left", keys);
  if (keys[0] != -1) {
    Com_sprintf(key, sizeof(key), "%i", keys[0]);
    trap_Cvar_Set("cl_button_turnleft1", key);
    if (keys[1] != -1) {
      Com_sprintf(key, sizeof(key), "%i", keys[1]);
      trap_Cvar_Set("cl_button_turnleft2", key);
    }
  }
  Controls_GetKeyBindings("+right", keys);
  if (keys[0] != -1) {
    Com_sprintf(key, sizeof(key), "%i", keys[0]);
    trap_Cvar_Set("cl_button_turnright1", key);
    if (keys[1] != -1) {
      Com_sprintf(key, sizeof(key), "%i", keys[1]);
      trap_Cvar_Set("cl_button_turnright2", key);
    }
  }
}
```