#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */
typedef int wchar_t;

/* Variables and functions */
char *malloc(int);
int /*<<< orphan*/ perror(char *);
int /*<<< orphan*/ printf(char *);
int /*<<< orphan*/ strncpy(char *, char const *, int);
int strtol(char *, int /*<<< orphan*/ *, int);
char *strndup_unescaped(const char *s1, size_t n) {
  char *res;
  const char *reset;
  char *p;
  int i;
  char prescan;
  char hexstr[5];
  wchar_t wc;
  reset = s1;
  if (n == 0) {
    return NULL;
  }
  res = malloc(sizeof(*res) * (n + 1));
  if (res == NULL) {
    perror("malloc");
    return NULL;
  }
  p = res;
  i = 0;
  while (i < n && *s1 != 0) {
    prescan = *s1;
    if (*s1 == '\\') {
      prescan = *(s1 + 1);
      switch (prescan) {
      case 0:
        break;
      case '"':
      case '/':
        s1++;
        i++;
        goto cont;
        break;
      case 'n':
        *p = '\n';
        s1 += 2;
        i += 2;
        p++;
        goto cont;
        break;
      case 't':
        *p = '\t';
        s1 += 2;
        i += 2;
        p++;
        goto cont;
        break;
      case 'u':
        prescan = *(s1 + 2);
        for (int j = 2; j < 6; j++) {
          if (prescan == 0) {
            printf("Unexpected EOF\n");
            goto endwhile;
          }
          prescan = *(s1 + j);
        }
        strncpy(hexstr, (s1 + 2), 4);
        hexstr[4] = 0;
        wc = strtol(hexstr, NULL, 16);
        if (wc < 0x80) {
          *p = (char)wc;
          p++;
        } else {
          *p = (wc >> 6) | 0xC0;
          p++;
          *p = (wc & 0x3F) | 0x80;
          p++;
        }
        i += 6;
        s1 += 6;
        goto cont;
        break;
      }
    }
    *p = *s1;
    p++;
    s1++;
    i++;
  cont:;
  }
endwhile:;
  *p = 0;
  s1 = reset;
  return res;
}


x86 assembly (clang, -O0):
<strndup_unescaped>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
cmpq   $0x0,-0x18(%rbp)
jne    1180 <strndup_unescaped+0x30>
movq   $0x0,-0x8(%rbp)
jmp    145a <strndup_unescaped+0x30a>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
shl    $0x0,%rax
mov    %eax,%edi
call   1060 <malloc@plt>
mov    %rax,-0x20(%rbp)
cmpq   $0x0,-0x20(%rbp)
jne    11bb <strndup_unescaped+0x6b>
lea    0xe57(%rip),%rdi
call   1070 <perror@plt>
movq   $0x0,-0x8(%rbp)
jmp    145a <strndup_unescaped+0x30a>
mov    -0x20(%rbp),%rax
mov    %rax,-0x30(%rbp)
movl   $0x0,-0x34(%rbp)
movslq -0x34(%rbp),%rcx
xor    %eax,%eax
cmp    -0x18(%rbp),%rcx
mov    %al,-0x45(%rbp)
jae    11ed <strndup_unescaped+0x9d>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
setne  %al
mov    %al,-0x45(%rbp)
mov    -0x45(%rbp),%al
test   $0x1,%al
jne    11fd <strndup_unescaped+0xad>
jmp    143e <strndup_unescaped+0x2ee>
mov    -0x10(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x35(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5c,%eax
jne    140c <strndup_unescaped+0x2bc>
mov    -0x10(%rbp),%rax
mov    0x1(%rax),%al
mov    %al,-0x35(%rbp)
movsbl -0x35(%rbp),%eax
mov    %eax,-0x4c(%rbp)
test   %eax,%eax
je     1289 <strndup_unescaped+0x139>
jmp    1234 <strndup_unescaped+0xe4>
mov    -0x4c(%rbp),%eax
sub    $0x22,%eax
je     128e <strndup_unescaped+0x13e>
jmp    1245 <strndup_unescaped+0xf5>
mov    -0x4c(%rbp),%eax
sub    $0x2f,%eax
je     128e <strndup_unescaped+0x13e>
jmp    1256 <strndup_unescaped+0x106>
mov    -0x4c(%rbp),%eax
sub    $0x6e,%eax
je     12a8 <strndup_unescaped+0x158>
jmp    1267 <strndup_unescaped+0x117>
mov    -0x4c(%rbp),%eax
sub    $0x74,%eax
je     12d5 <strndup_unescaped+0x185>
jmp    1278 <strndup_unescaped+0x128>
mov    -0x4c(%rbp),%eax
sub    $0x75,%eax
je     1302 <strndup_unescaped+0x1b2>
jmp    1407 <strndup_unescaped+0x2b7>
jmp    1407 <strndup_unescaped+0x2b7>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1439 <strndup_unescaped+0x2e9>
mov    -0x30(%rbp),%rax
movb   $0xa,(%rax)
mov    -0x10(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x10(%rbp)
mov    -0x34(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x34(%rbp)
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    1439 <strndup_unescaped+0x2e9>
mov    -0x30(%rbp),%rax
movb   $0x9,(%rax)
mov    -0x10(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x10(%rbp)
mov    -0x34(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x34(%rbp)
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    1439 <strndup_unescaped+0x2e9>
mov    -0x10(%rbp),%rax
mov    0x2(%rax),%al
mov    %al,-0x35(%rbp)
movl   $0x2,-0x44(%rbp)
cmpl   $0x6,-0x44(%rbp)
jge    1357 <strndup_unescaped+0x207>
movsbl -0x35(%rbp),%eax
cmp    $0x0,%eax
jne    133b <strndup_unescaped+0x1eb>
lea    0xcd6(%rip),%rdi
call   1040 <printf@plt>
jmp    1443 <strndup_unescaped+0x2f3>
mov    -0x10(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x35(%rbp)
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    1313 <strndup_unescaped+0x1c3>
lea    -0x3a(%rbp),%rdi
mov    -0x10(%rbp),%rsi
add    $0x2,%rsi
mov    $0x4,%edx
call   1030 <strncpy@plt>
movb   $0x0,-0x36(%rbp)
lea    -0x3a(%rbp),%rdi
xor    %eax,%eax
mov    %eax,%esi
mov    $0x10,%edx
call   1050 <strtol@plt>
mov    %eax,-0x40(%rbp)
cmpl   $0x80,-0x40(%rbp)
jge    13af <strndup_unescaped+0x25f>
mov    -0x40(%rbp),%eax
mov    %al,%cl
mov    -0x30(%rbp),%rax
mov    %cl,(%rax)
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    13ed <strndup_unescaped+0x29d>
mov    -0x40(%rbp),%eax
sar    $0x6,%eax
or     $0xc0,%eax
mov    %al,%cl
mov    -0x30(%rbp),%rax
mov    %cl,(%rax)
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x40(%rbp),%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x30(%rbp),%rax
mov    %cl,(%rax)
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x34(%rbp),%eax
add    $0x6,%eax
mov    %eax,-0x34(%rbp)
mov    -0x10(%rbp),%rax
add    $0x6,%rax
mov    %rax,-0x10(%rbp)
jmp    1439 <strndup_unescaped+0x2e9>
jmp    140c <strndup_unescaped+0x2bc>
mov    -0x10(%rbp),%rax
mov    (%rax),%cl
mov    -0x30(%rbp),%rax
mov    %cl,(%rax)
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    11ca <strndup_unescaped+0x7a>
jmp    1443 <strndup_unescaped+0x2f3>
mov    -0x30(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x28(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<strndup_unescaped>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
test   %rsi,%rsi
je     128b <strndup_unescaped+0x13b>
mov    %rsi,%r15
mov    %rdi,%rbx
lea    0x1(%rsi),%edi
call   1060 <malloc@plt>
test   %rax,%rax
je     12b3 <strndup_unescaped+0x163>
mov    %rax,%r14
xor    %ebp,%ebp
lea    0x3(%rsp),%r12
mov    %rax,%r13
jmp    11b3 <strndup_unescaped+0x63>
nopw   0x0(%rax,%rax,1)
test   %al,%al
je     129c <strndup_unescaped+0x14c>
mov    %al,0x0(%r13)
add    $0x1,%r13
add    $0x1,%rbx
add    $0x1,%ebp
movslq %ebp,%rax
cmp    %r15,%rax
jae    129c <strndup_unescaped+0x14c>
movzbl (%rbx),%eax
cmp    $0x5c,%al
jne    1190 <strndup_unescaped+0x40>
movsbl 0x1(%rbx),%ecx
cmp    $0x6d,%ecx
jle    1230 <strndup_unescaped+0xe0>
cmp    $0x6e,%ecx
je     1247 <strndup_unescaped+0xf7>
cmp    $0x74,%ecx
je     124e <strndup_unescaped+0xfe>
cmp    $0x75,%ecx
jne    1198 <strndup_unescaped+0x48>
cmpb   $0x0,0x2(%rbx)
je     1290 <strndup_unescaped+0x140>
cmpb   $0x0,0x3(%rbx)
je     1290 <strndup_unescaped+0x140>
cmpb   $0x0,0x4(%rbx)
je     1290 <strndup_unescaped+0x140>
lea    0x2(%rbx),%rsi
mov    %r12,%rdi
mov    $0x4,%edx
call   1030 <strncpy@plt>
movb   $0x0,0x7(%rsp)
mov    %r12,%rdi
xor    %esi,%esi
mov    $0x10,%edx
call   1050 <strtol@plt>
cmp    $0x80,%eax
jge    1263 <strndup_unescaped+0x113>
mov    %al,0x0(%r13)
mov    $0x1,%eax
jmp    127c <strndup_unescaped+0x12c>
nopl   0x0(%rax,%rax,1)
cmp    $0x22,%ecx
je     11a0 <strndup_unescaped+0x50>
cmp    $0x2f,%ecx
je     11a0 <strndup_unescaped+0x50>
jmp    1198 <strndup_unescaped+0x48>
movb   $0xa,0x0(%r13)
jmp    1253 <strndup_unescaped+0x103>
movb   $0x9,0x0(%r13)
add    $0x2,%rbx
add    $0x2,%ebp
add    $0x1,%r13
jmp    11a7 <strndup_unescaped+0x57>
mov    %eax,%ecx
shr    $0x6,%ecx
or     $0xc0,%cl
mov    %cl,0x0(%r13)
and    $0x3f,%al
or     $0x80,%al
mov    %al,0x1(%r13)
mov    $0x2,%eax
add    %rax,%r13
add    $0x6,%ebp
add    $0x6,%rbx
jmp    11a7 <strndup_unescaped+0x57>
xor    %r14d,%r14d
jmp    12a1 <strndup_unescaped+0x151>
lea    0xd70(%rip),%rdi
call   1040 <puts@plt>
movb   $0x0,0x0(%r13)
mov    %r14,%rax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
lea    0xd46(%rip),%rdi
call   1070 <perror@plt>
xor    %r14d,%r14d
jmp    12a1 <strndup_unescaped+0x151>

LLVM IR (-O0):
@.str = [7 x i8] c"malloc\00"
@.str.1 = [16 x i8] c"Unexpected EOF\0A\00"
define i8* @strndup_unescaped(i8* %0, i64 %1) {
%3 = alloca i8*
%4 = alloca i8*
%5 = alloca i64
%6 = alloca i8*
%7 = alloca i8*
%8 = alloca i8*
%9 = alloca i32
%10 = alloca i8
%11 = alloca [5 x i8]
%12 = alloca i32
%13 = alloca i32
store i8* %0, i8** %4
store i64 %1, i64* %5
%14 = load i8*, i8** %4
store i8* %14, i8** %7
%15 = load i64, i64* %5
%16 = icmp eq i64 %15, 0
br i1 %16, label %17, label %18
17: ; preds = %2
store i8* null, i8** %3
br label %152
18: ; preds = %2
%19 = load i64, i64* %5
%20 = add i64 %19, 1
%21 = mul i64 1, %20
%22 = trunc i64 %21 to i32
%23 = call i8* @malloc(i32 %22)
store i8* %23, i8** %6
%24 = load i8*, i8** %6
%25 = icmp eq i8* %24, null
br i1 %25, label %26, label %28
26: ; preds = %18
%27 = call i32 @perror(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i64 0, i64 0))
store i8* null, i8** %3
br label %152
28: ; preds = %18
%29 = load i8*, i8** %6
store i8* %29, i8** %8
store i32 0, i32* %9
br label %30
30: ; preds = %146, %28
%31 = load i32, i32* %9
%32 = sext i32 %31 to i64
%33 = load i64, i64* %5
%34 = icmp ult i64 %32, %33
br i1 %34, label %35, label %40
35: ; preds = %30
%36 = load i8*, i8** %4
%37 = load i8, i8* %36
%38 = sext i8 %37 to i32
%39 = icmp ne i32 %38, 0
br label %40
40: ; preds = %35, %30
%41 = phi i1 [ false, %30 ], [ %39, %35 ]
br i1 %41, label %42, label %147
42: ; preds = %40
%43 = load i8*, i8** %4
%44 = load i8, i8* %43
store i8 %44, i8* %10
%45 = load i8*, i8** %4
%46 = load i8, i8* %45
%47 = sext i8 %46 to i32
%48 = icmp eq i32 %47, 92
br i1 %48, label %49, label %136
49: ; preds = %42
%50 = load i8*, i8** %4
%51 = getelementptr inbounds i8, i8* %50, i64 1
%52 = load i8, i8* %51
store i8 %52, i8* %10
%53 = load i8, i8* %10
%54 = sext i8 %53 to i32
switch i32 %54, label %135 [
i32 0, label %55
i32 34, label %56
i32 47, label %56
i32 110, label %61
i32 116, label %69
i32 117, label %77
]
55: ; preds = %49
br label %135
56: ; preds = %49, %49
%57 = load i8*, i8** %4
%58 = getelementptr inbounds i8, i8* %57, i32 1
store i8* %58, i8** %4
%59 = load i32, i32* %9
%60 = add nsw i32 %59, 1
store i32 %60, i32* %9
br label %146
61: ; preds = %49
%62 = load i8*, i8** %8
store i8 10, i8* %62
%63 = load i8*, i8** %4
%64 = getelementptr inbounds i8, i8* %63, i64 2
store i8* %64, i8** %4
%65 = load i32, i32* %9
%66 = add nsw i32 %65, 2
store i32 %66, i32* %9
%67 = load i8*, i8** %8
%68 = getelementptr inbounds i8, i8* %67, i32 1
store i8* %68, i8** %8
br label %146
69: ; preds = %49
%70 = load i8*, i8** %8
store i8 9, i8* %70
%71 = load i8*, i8** %4
%72 = getelementptr inbounds i8, i8* %71, i64 2
store i8* %72, i8** %4
%73 = load i32, i32* %9
%74 = add nsw i32 %73, 2
store i32 %74, i32* %9
%75 = load i8*, i8** %8
%76 = getelementptr inbounds i8, i8* %75, i32 1
store i8* %76, i8** %8
br label %146
77: ; preds = %49
%78 = load i8*, i8** %4
%79 = getelementptr inbounds i8, i8* %78, i64 2
%80 = load i8, i8* %79
store i8 %80, i8* %10
store i32 2, i32* %13
br label %81
81: ; preds = %96, %77
%82 = load i32, i32* %13
%83 = icmp slt i32 %82, 6
br i1 %83, label %84, label %99
84: ; preds = %81
%85 = load i8, i8* %10
%86 = sext i8 %85 to i32
%87 = icmp eq i32 %86, 0
br i1 %87, label %88, label %90
88: ; preds = %84
%89 = call i32 @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.1, i64 0, i64 0))
br label %148
90: ; preds = %84
%91 = load i8*, i8** %4
%92 = load i32, i32* %13
%93 = sext i32 %92 to i64
%94 = getelementptr inbounds i8, i8* %91, i64 %93
%95 = load i8, i8* %94
store i8 %95, i8* %10
br label %96
96: ; preds = %90
%97 = load i32, i32* %13
%98 = add nsw i32 %97, 1
store i32 %98, i32* %13
br label %81
99: ; preds = %81
%100 = getelementptr inbounds [5 x i8], [5 x i8]* %11, i64 0, i64 0
%101 = load i8*, i8** %4
%102 = getelementptr inbounds i8, i8* %101, i64 2
%103 = call i32 @strncpy(i8* %100, i8* %102, i32 4)
%104 = getelementptr inbounds [5 x i8], [5 x i8]* %11, i64 0, i64 4
store i8 0, i8* %104
%105 = getelementptr inbounds [5 x i8], [5 x i8]* %11, i64 0, i64 0
%106 = call i32 @strtol(i8* %105, i32* null, i32 16)
store i32 %106, i32* %12
%107 = load i32, i32* %12
%108 = icmp slt i32 %107, 128
br i1 %108, label %109, label %115
109: ; preds = %99
%110 = load i32, i32* %12
%111 = trunc i32 %110 to i8
%112 = load i8*, i8** %8
store i8 %111, i8* %112
%113 = load i8*, i8** %8
%114 = getelementptr inbounds i8, i8* %113, i32 1
store i8* %114, i8** %8
br label %130
115: ; preds = %99
%116 = load i32, i32* %12
%117 = ashr i32 %116, 6
%118 = or i32 %117, 192
%119 = trunc i32 %118 to i8
%120 = load i8*, i8** %8
store i8 %119, i8* %120
%121 = load i8*, i8** %8
%122 = getelementptr inbounds i8, i8* %121, i32 1
store i8* %122, i8** %8
%123 = load i32, i32* %12
%124 = and i32 %123, 63
%125 = or i32 %124, 128
%126 = trunc i32 %125 to i8
%127 = load i8*, i8** %8
store i8 %126, i8* %127
%128 = load i8*, i8** %8
%129 = getelementptr inbounds i8, i8* %128, i32 1
store i8* %129, i8** %8
br label %130
130: ; preds = %115, %109
%131 = load i32, i32* %9
%132 = add nsw i32 %131, 6
store i32 %132, i32* %9
%133 = load i8*, i8** %4
%134 = getelementptr inbounds i8, i8* %133, i64 6
store i8* %134, i8** %4
br label %146
135: ; preds = %49, %55
br label %136
136: ; preds = %135, %42
%137 = load i8*, i8** %4
%138 = load i8, i8* %137
%139 = load i8*, i8** %8
store i8 %138, i8* %139
%140 = load i8*, i8** %8
%141 = getelementptr inbounds i8, i8* %140, i32 1
store i8* %141, i8** %8
%142 = load i8*, i8** %4
%143 = getelementptr inbounds i8, i8* %142, i32 1
store i8* %143, i8** %4
%144 = load i32, i32* %9
%145 = add nsw i32 %144, 1
store i32 %145, i32* %9
br label %146
146: ; preds = %136, %130, %69, %61, %56
br label %30
147: ; preds = %40
br label %148
148: ; preds = %147, %88
%149 = load i8*, i8** %8
store i8 0, i8* %149
%150 = load i8*, i8** %7
store i8* %150, i8** %4
%151 = load i8*, i8** %6
store i8* %151, i8** %3
br label %152
152: ; preds = %148, %26, %17
%153 = load i8*, i8** %3
ret i8* %153
}

LLVM IR (-O2):
@.str = [7 x i8] c"malloc\00"
@str = [15 x i8] c"Unexpected EOF\00"
define noalias i8* @strndup_unescaped(i8* %0, i64 %1) {
%3 = alloca [5 x i8]
%4 = getelementptr inbounds [5 x i8], [5 x i8]* %3, i64 0, i64 0
%5 = icmp eq i64 %1, 0
br i1 %5, label %79, label %6
6: ; preds = %2
%7 = trunc i64 %1 to i32
%8 = add i32 %7, 1
%9 = tail call i8* @malloc(i32 %8)
%10 = icmp eq i8* %9, null
br i1 %10, label %13, label %11
11: ; preds = %6
%12 = getelementptr inbounds [5 x i8], [5 x i8]* %3, i64 0, i64 4
br label %15
13: ; preds = %6
%14 = tail call i32 @perror(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i64 0, i64 0))
br label %79
15: ; preds = %11, %71
%16 = phi i32 [ 0, %11 ], [ %74, %71 ]
%17 = phi i8* [ %9, %11 ], [ %73, %71 ]
%18 = phi i8* [ %0, %11 ], [ %72, %71 ]
%19 = load i8, i8* %18
switch i8 %19, label %67 [
i8 0, label %77
i8 92, label %20
]
20: ; preds = %15
%21 = getelementptr inbounds i8, i8* %18, i64 1
%22 = load i8, i8* %21
%23 = sext i8 %22 to i32
switch i32 %23, label %67 [
i32 117, label %34
i32 34, label %24
i32 47, label %24
i32 110, label %26
i32 116, label %30
]
24: ; preds = %20, %20
%25 = add nsw i32 %16, 1
br label %71
26: ; preds = %20
store i8 10, i8* %17
%27 = getelementptr inbounds i8, i8* %18, i64 2
%28 = add nsw i32 %16, 2
%29 = getelementptr inbounds i8, i8* %17, i64 1
br label %71
30: ; preds = %20
store i8 9, i8* %17
%31 = getelementptr inbounds i8, i8* %18, i64 2
%32 = add nsw i32 %16, 2
%33 = getelementptr inbounds i8, i8* %17, i64 1
br label %71
34: ; preds = %20
%35 = getelementptr inbounds i8, i8* %18, i64 2
%36 = load i8, i8* %35
%37 = icmp eq i8 %36, 0
br i1 %37, label %50, label %38
38: ; preds = %34
%39 = getelementptr inbounds i8, i8* %18, i64 3
%40 = load i8, i8* %39
%41 = icmp eq i8 %40, 0
br i1 %41, label %50, label %42
42: ; preds = %38
%43 = getelementptr inbounds i8, i8* %18, i64 4
%44 = load i8, i8* %43
%45 = icmp eq i8 %44, 0
br i1 %45, label %50, label %46
46: ; preds = %42
%47 = call i32 @strncpy(i8* %4, i8* %35, i32 4)
store i8 0, i8* %12
%48 = call i32 @strtol(i8* nocapture %4, i32* null, i32 16)
%49 = icmp slt i32 %48, 128
br i1 %49, label %52, label %54
50: ; preds = %42, %38, %34
%51 = call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([15 x i8], [15 x i8]* @str, i64 0, i64 0))
br label %77
52: ; preds = %46
%53 = trunc i32 %48 to i8
store i8 %53, i8* %17
br label %62
54: ; preds = %46
%55 = lshr i32 %48, 6
%56 = trunc i32 %55 to i8
%57 = or i8 %56, -64
store i8 %57, i8* %17
%58 = getelementptr inbounds i8, i8* %17, i64 1
%59 = trunc i32 %48 to i8
%60 = and i8 %59, 63
%61 = or i8 %60, -128
store i8 %61, i8* %58
br label %62
62: ; preds = %54, %52
%63 = phi i64 [ 2, %54 ], [ 1, %52 ]
%64 = getelementptr inbounds i8, i8* %17, i64 %63
%65 = add nsw i32 %16, 6
%66 = getelementptr inbounds i8, i8* %18, i64 6
br label %71
67: ; preds = %15, %20
store i8 %19, i8* %17
%68 = getelementptr inbounds i8, i8* %17, i64 1
%69 = getelementptr inbounds i8, i8* %18, i64 1
%70 = add nsw i32 %16, 1
br label %71
71: ; preds = %67, %62, %30, %26, %24
%72 = phi i8* [ %69, %67 ], [ %31, %30 ], [ %27, %26 ], [ %21, %24 ], [ %66, %62 ]
%73 = phi i8* [ %68, %67 ], [ %33, %30 ], [ %29, %26 ], [ %17, %24 ], [ %64, %62 ]
%74 = phi i32 [ %70, %67 ], [ %32, %30 ], [ %28, %26 ], [ %25, %24 ], [ %65, %62 ]
%75 = sext i32 %74 to i64
%76 = icmp ult i64 %75, %1
br i1 %76, label %15, label %77
77: ; preds = %71, %15, %50
%78 = phi i8* [ %17, %50 ], [ %73, %71 ], [ %17, %15 ]
store i8 0, i8* %78
br label %79
79: ; preds = %2, %77, %13
%80 = phi i8* [ null, %13 ], [ %9, %77 ], [ null, %2 ]
ret i8* %80
}