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

```asm
<main>:
  endbr64
  push   %r15
  lea    D113(%rip),%r15
  push   %r14
  lea    D106(%rip),%r14
  push   %r13
  lea    D10(%rip),%r13
  push   %r12
  lea    D78(%rip),%r12
  push   %rbp
  lea    D79(%rip),%rbp
  push   %rbx
  lea    D100(%rip),%rbx
  sub    $0x28,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  lea    0x17(%rsp),%rax
  mov    %rax,0x8(%rsp)
L40:
  mov    %r15,%rdi
  call   <printf@plt>
  mov    %r14,%rdi
  call   <printf@plt>
  mov    %r13,%rdi
  call   <printf@plt>
  mov    %r12,%rdi
  call   <printf@plt>
  mov    %rbp,%rdi
  call   <printf@plt>
  mov    %rbx,%rdi
  call   <printf@plt>
  lea    D115(%rip),%rdi
  call   <printf@plt>
  mov    0x8(%rsp),%rsi
  lea    D57(%rip),%rdi
  call   <scanf@plt>
  movzbl 0x17(%rsp),%eax
  sub    $0x41,%eax
  cmp    $0x24,%al
  ja     L58
  lea    D66(%rip),%rcx
  movzbl %al,%eax
  movslq (%rcx,%rax,4),%rax
  add    %rcx,%rax
  notrack jmp *%rax
  nopl   0x0(%rax,%rax,1)
L58:
  lea    D76(%rip),%rdi
  call   <printf@plt>
  xor    %eax,%eax
  call   <main>
L31:
  mov    0x18(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L5
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopw   0x0(%rax,%rax,1)
  xor    %eax,%eax
  call   <volumeComputation@plt>
L39:
  xor    %eax,%eax
  call   <getchar@plt>
  lea    D118(%rip),%rdi
  call   <printf@plt>
  movzbl 0x17(%rsp),%eax
  and    $0xffffffdf,%eax
  cmp    $0x45,%al
  jne    L40
  lea    D68(%rip),%rdi
  call   <printf@plt>
  xor    %eax,%eax
  jmp    L31
  nopw   0x0(%rax,%rax,1)
  xor    %eax,%eax
  call   <perimeterComputation@plt>
  jmp    L39
  nopl   0x0(%rax)
  xor    %eax,%eax
  call   <areaComputation@plt>
  jmp    L39
L5:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: label: D113
type_guessed: string
name: disassemble_data
arguments: label: D106
type_guessed: string
name: disassemble_data
arguments: label: D10
type_guessed: string
name: disassemble_data
arguments: label: D78
type_guessed: string
name: disassemble_data
arguments: label: D79
type_guessed: string
name: disassemble_data
arguments: label: D100
type_guessed: string
name: disassemble_data
arguments: label: D115
type_guessed: string
name: disassemble_data
arguments: label: D57
type_guessed: string
name: disassemble_data
arguments: label: D76
type_guessed: string
name: disassemble_data
arguments: label: D118
type_guessed: string
name: disassemble_data
arguments: label: D68
type_guessed: string

tool: D113: 
 Main Menu

tool: D106: 
================

tool: D10: 
 A - AREA

tool: D78: 
 B - VOLUME

tool: D79: 
 C - PERIMETER

tool: D100: 
 E - Exit

tool: D115: 
 Enter selection: 

tool: D57: %c

tool: D76: 
 Invalid selection

tool: D118: 


tool: D68: 
 Bye ...


assistant: ```c
main() {
  char selection;
  while (1) {
    printf("\n Main Menu");
    printf("\n================");
    printf("\n A - AREA");
    printf("\n B - VOLUME");
    printf("\n C - PERIMETER");
    printf("\n E - Exit");
    printf("\n Enter selection: ");
    scanf("%c", &selection);
    switch (selection) {
    case 'A':
    case 'a':
      areaComputation();
      break;
    case 'B':
    case 'b':
      volumeComputation();
      break;
    case 'C':
    case 'c':
      break;
    case 'E':
    case 'e':
      perimeterComputation();
      break;
    default:
      printf("\n Invalid selection");
      return main();
    }
    getchar();
    printf("\n");
    if (selection == 'E' || selection == 'e')
      break;
  }
  printf("\n Bye ...\n");
  return 0;
}
```