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

```asm
<main>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xa0,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movq   $0x656874,-0x90(%rbp)
  movq   $0x61,-0x88(%rbp)
  movabs $0x6572656874,%rax
  mov    %rax,-0x80(%rbp)
  movabs $0x726577736e61,%rax
  mov    %rax,-0x78(%rbp)
  movq   $0x796e61,-0x70(%rbp)
  movq   $0x7962,-0x68(%rbp)
  movq   $0x657962,-0x60(%rbp)
  movabs $0x7269656874,%rax
  mov    %rax,-0x58(%rbp)
  movabs $0x7365727020746f4e,%rax
  movabs $0x74206e6920746e65,%rdx
  mov    %rax,-0x50(%rbp)
  mov    %rdx,-0x48(%rbp)
  movq   $0x656972,-0x40(%rbp)
  movq   $0x0,-0x38(%rbp)
  movabs $0x20746e6573657250,%rax
  movabs $0x65697274206e69,%rdx
  mov    %rax,-0x30(%rbp)
  mov    %rdx,-0x28(%rbp)
  movq   $0x0,-0x20(%rbp)
  movq   $0x0,-0x18(%rbp)
  mov    $0x0,%eax
  call   <getNode@plt>
  cltq
  mov    %rax,-0x98(%rbp)
  movl   $0x0,-0x9c(%rbp)
  jmp    L3
L22:
  lea    -0x90(%rbp),%rdx
  mov    -0x9c(%rbp),%eax
  cltq
  shl    $0x3,%rax
  add    %rax,%rdx
  mov    -0x98(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <insert@plt>
  addl   $0x1,-0x9c(%rbp)
L3:
  mov    -0x9c(%rbp),%eax
  cmp    $0x7,%eax
  jbe    L22
  mov    -0x98(%rbp),%rax
  lea    D3(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <search@plt>
  lea    -0x50(%rbp),%rdx
  cltq
  shl    $0x5,%rax
  add    %rdx,%rax
  mov    %rax,%rdx
  lea    D3(%rip),%rax
  mov    %rax,%rsi
  lea    D90(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    -0x98(%rbp),%rax
  lea    D104(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <search@plt>
  lea    -0x50(%rbp),%rdx
  cltq
  shl    $0x5,%rax
  add    %rdx,%rax
  mov    %rax,%rdx
  lea    D104(%rip),%rax
  mov    %rax,%rsi
  lea    D90(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    -0x98(%rbp),%rax
  lea    D113(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <search@plt>
  lea    -0x50(%rbp),%rdx
  cltq
  shl    $0x5,%rax
  add    %rdx,%rax
  mov    %rax,%rdx
  lea    D113(%rip),%rax
  mov    %rax,%rsi
  lea    D90(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    -0x98(%rbp),%rax
  lea    D100(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <search@plt>
  lea    -0x50(%rbp),%rdx
  cltq
  shl    $0x5,%rax
  add    %rdx,%rax
  mov    %rax,%rdx
  lea    D100(%rip),%rax
  mov    %rax,%rsi
  lea    D90(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x0,%eax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L10
  call   <__stack_chk_fail@plt>
L10:
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: label: D3
type: string
name: disassemble_data
arguments: label: D90
type: string
name: disassemble_data
arguments: label: D104
type: string
name: disassemble_data
arguments: label: D113
type: string
name: disassemble_data
arguments: label: D100
type: string

tool: D3: the

tool: D90: %s --- %s


tool: D104: these

tool: D113: their

tool: D100: thaw

assistant: ```c
int main() {
  char keys[][8] = {"the", "a", "there", "answer", "any", "by", "bye", "their"};
  char output[][32] = {"Not present in trie", "Present in trie"};
  struct TrieNode *root = getNode();
  int i;
  for (i = 0; i < sizeof(keys) / sizeof(keys[0]); i++)
    insert(root, keys[i]);
  printf("%s --- %s\n", "the", output[search(root, "the")]);
  printf("%s --- %s\n", "these", output[search(root, "these")]);
  printf("%s --- %s\n", "their", output[search(root, "their")]);
  printf("%s --- %s\n", "thaw", output[search(root, "thaw")]);
  return 0;
}
```