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

```asm
<functionF>:
  endbr64
  sub    $0x118,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x108(%rsp)
  xor    %eax,%eax
  movl   $0xe,(%rsp)
  movl   $0x4,0x4(%rsp)
  movl   $0xd,0x8(%rsp)
  movl   $0x1,0xc(%rsp)
  movl   $0x2,0x10(%rsp)
  movl   $0xf,0x14(%rsp)
  movl   $0xb,0x18(%rsp)
  movl   $0x8,0x1c(%rsp)
  movl   $0x3,0x20(%rsp)
  movl   $0xa,0x24(%rsp)
  movl   $0x6,0x28(%rsp)
  movl   $0xc,0x2c(%rsp)
  movl   $0x5,0x30(%rsp)
  movl   $0x9,0x34(%rsp)
  movl   $0x0,0x38(%rsp)
  movl   $0x7,0x3c(%rsp)
  movl   $0x0,0x40(%rsp)
  movl   $0xf,0x44(%rsp)
  movl   $0x7,0x48(%rsp)
  movl   $0x4,0x4c(%rsp)
  movl   $0xe,0x50(%rsp)
  movl   $0x2,0x54(%rsp)
  movl   $0xd,0x58(%rsp)
  movl   $0x1,0x5c(%rsp)
  movl   $0xa,0x60(%rsp)
  movl   $0x6,0x64(%rsp)
  movl   $0xc,0x68(%rsp)
  movl   $0xb,0x6c(%rsp)
  movl   $0x9,0x70(%rsp)
  movl   $0x5,0x74(%rsp)
  movl   $0x3,0x78(%rsp)
  movl   $0x8,0x7c(%rsp)
  movl   $0x4,0x80(%rsp)
  movl   $0x1,0x84(%rsp)
  movl   $0xe,0x88(%rsp)
  movl   $0x8,0x8c(%rsp)
  movl   $0xd,0x90(%rsp)
  movl   $0x6,0x94(%rsp)
  movl   $0x2,0x98(%rsp)
  movl   $0xb,0x9c(%rsp)
  movl   $0xf,0xa0(%rsp)
  movl   $0xc,0xa4(%rsp)
  movl   $0x9,0xa8(%rsp)
  movl   $0x7,0xac(%rsp)
  movl   $0x3,0xb0(%rsp)
  movl   $0xa,0xb4(%rsp)
  movl   $0x5,0xb8(%rsp)
  movl   $0x0,0xbc(%rsp)
  movl   $0xf,0xc0(%rsp)
  movl   $0xc,0xc4(%rsp)
  movl   $0x8,0xc8(%rsp)
  movl   $0x2,0xcc(%rsp)
  movl   $0x4,0xd0(%rsp)
  movl   $0x9,0xd4(%rsp)
  movl   $0x1,0xd8(%rsp)
  movl   $0x7,0xdc(%rsp)
  movl   $0x5,0xe0(%rsp)
  movl   $0xb,0xe4(%rsp)
  movl   $0x3,0xe8(%rsp)
  movl   $0xe,0xec(%rsp)
  movl   $0xa,0xf0(%rsp)
  movl   $0x0,0xf4(%rsp)
  movl   $0x6,0xf8(%rsp)
  movl   $0xd,0xfc(%rsp)
  mov    %edi,%ecx
  sar    %ecx
  and    $0x1,%ecx
  mov    %edi,%edx
  sar    $0x3,%edx
  and    $0x1,%edx
  mov    %edi,%eax
  shl    $0x4,%eax
  and    $0x10,%eax
  or     %ecx,%eax
  and    $0x4,%edi
  or     %edi,%eax
  mov    %edx,%edi
  shl    $0x5,%edi
  or     %edi,%eax
  shl    $0x3,%ecx
  or     %ecx,%eax
  add    %edx,%edx
  or     %edx,%eax
  xor    %esi,%eax
  mov    %eax,%ecx
  shr    %ecx
  and    $0x8,%ecx
  mov    %eax,%edx
  shr    %edx
  and    $0x4,%edx
  or     %edx,%ecx
  mov    %eax,%edx
  shr    %edx
  and    $0x1,%edx
  or     %edx,%ecx
  mov    %eax,%edx
  shr    %edx
  and    $0x2,%edx
  or     %edx,%ecx
  mov    %ecx,%ecx
  lea    (%rax,%rax,1),%edx
  and    $0x2,%edx
  shr    $0x5,%eax
  and    $0x1,%eax
  or     %edx,%eax
  mov    %eax,%eax
  shl    $0x4,%rax
  add    %rcx,%rax
  mov    (%rsp,%rax,4),%edx
  lea    (%rdx,%rdx,1),%eax
  and    $0x2,%eax
  mov    %edx,%ecx
  shr    $0x3,%ecx
  and    $0x1,%ecx
  or     %ecx,%eax
  lea    (%rdx,%rdx,1),%ecx
  and    $0x8,%ecx
  or     %ecx,%eax
  add    %edx,%edx
  and    $0x4,%edx
  or     %edx,%eax
  mov    0x108(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L1
  add    $0x118,%rsp
  ret
L1:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
unsigned int functionF(int rightSidePlaintext, int key) {
  int a[4][16] = {{14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7}, {0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8}, {4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0}, {15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13}};
  int part0 = rightSidePlaintext & 0x1;
  int part1 = (rightSidePlaintext & 0x2) >> 1;
  int part2 = (rightSidePlaintext & 0x4) >> 2;
  int part3 = (rightSidePlaintext & 0x8) >> 3;
  unsigned int combined = (part3 << 5) | (part0 << 4) | (part1 << 3) | (part2 << 2) | (part3 << 1) | part1;
  combined = combined ^ key;
  int combinedPart0 = combined & 0x1;
  int combinedPart1 = (combined & 0x2) >> 1;
  int combinedPart2 = (combined & 0x4) >> 2;
  int combinedPart3 = (combined & 0x8) >> 3;
  int combinedPart4 = (combined & 0x16) >> 4;
  int combinedPart5 = (combined & 0x32) >> 5;
  unsigned int column = (combinedPart4 << 3) | (combinedPart3 << 2) | (combinedPart2 << 1) | combinedPart1;
  unsigned int row = (combinedPart0 << 1) | combinedPart5;
  unsigned int output = a[row][column];
  int outputPart0 = output & 0x1;
  int outputPart1 = (output & 0x2) >> 1;
  int outputPart2 = (output & 0x4) >> 2;
  int outputPart3 = (output & 0x8) >> 3;
  int final = (outputPart2 << 3) | (outputPart1 << 2) | (outputPart0 << 1) | outputPart3;
  return final;
}
```