// File: /workspace/github_c_makefile_star2_O3/deplinenoise[P]tundra/unittest/Test_Json.cpp
// Function: JsonTest_Doubles_Test::TestBody()
TEST_F(JsonTest, Doubles)
{
  char input[] = "[123.456, -100.10, -1.0e10, 5e7]";
  const JsonValue* v = JsonParse(input, &alloc, &scratch, error_msg);

  ASSERT_STREQ("", error_msg);
  ASSERT_NE(nullptr, v);

  const JsonArrayValue* array = v->AsArray();
  ASSERT_NE(nullptr, array);

  ASSERT_EQ(JsonValue::kArray, v->m_Type);
  ASSERT_EQ(4, array->m_Count);
  ASSERT_EQ(JsonValue::kNumber, array->m_Values[0]->m_Type);
  ASSERT_EQ(JsonValue::kNumber, array->m_Values[1]->m_Type);
  ASSERT_EQ(JsonValue::kNumber, array->m_Values[2]->m_Type);
  ASSERT_EQ(JsonValue::kNumber, array->m_Values[3]->m_Type);
  ASSERT_DOUBLE_EQ(array->m_Values[0]->AsNumber()->m_Number, 123.456);
  ASSERT_DOUBLE_EQ(array->m_Values[1]->AsNumber()->m_Number, -100.10);
  ASSERT_DOUBLE_EQ(array->m_Values[2]->AsNumber()->m_Number, -1.0e10);
  ASSERT_DOUBLE_EQ(array->m_Values[3]->AsNumber()->m_Number, 5e7);
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
subq $0x60, %rsp
movaps 0x1c7a0(%rip), %xmm0    # 0x55260
leaq 0x30(%rsp), %rax
movaps %xmm0, 0x10(%rax)
movaps 0x1c780(%rip), %xmm0    # 0x55250
movaps %xmm0, (%rax)
movb $0x0, 0x20(%rax)
leaq 0x18(%rdi), %rsi
leaq 0x50(%rdi), %rdx
leaq 0x88(%rdi), %r14
movq %rax, %rdi
movq %r14, %rcx
callq 0x41494
movq %rax, 0x28(%rsp)
leaq 0x1c262(%rip), %rsi     # 0x54d5f
leaq 0x1c25e(%rip), %rdx     # 0x54d62
leaq 0x1f3bc(%rip), %rbx     # 0x57ec7
leaq 0x10(%rsp), %r15
movq %r15, %rdi
movq %rbx, %rcx
movq %r14, %r8
callq 0x14ffa
cmpb $0x0, (%r15)
je 0x38eb9
leaq 0x18(%rsp), %rdi
xorl %esi, %esi
callq 0x2c37a
leaq 0x20(%rsp), %rcx
movq $0x0, (%rcx)
leaq 0x1b8c4(%rip), %rsi     # 0x5440b
leaq 0x1b2c3(%rip), %rdx     # 0x53e11
leaq 0x10(%rsp), %rbx
leaq 0x28(%rsp), %r8
movq %rbx, %rdi
callq 0x396c7
cmpb $0x0, (%rbx)
je 0x38f38
leaq 0x18(%rsp), %rdi
xorl %esi, %esi
callq 0x2c37a
movq 0x28(%rsp), %rax
xorl %ecx, %ecx
cmpl $0x3, (%rax)
cmoveq %rax, %rcx
leaq 0x20(%rsp), %r8
movq %rcx, (%r8)
movq %rsp, %rcx
movq $0x0, (%rcx)
leaq 0x1b86f(%rip), %rsi     # 0x5440b
leaq 0x1c390(%rip), %rdx     # 0x54f33
leaq 0x10(%rsp), %rbx
movq %rbx, %rdi
callq 0x39717
cmpb $0x0, (%rbx)
je 0x38f51
leaq 0x18(%rsp), %rdi
xorl %esi, %esi
callq 0x2c37a
movq %rsp, %rcx
movl $0x3, (%rcx)
movq 0x28(%rsp), %r8
leaq 0x1c2d3(%rip), %rsi     # 0x54ead
leaq 0x1c29d(%rip), %rdx     # 0x54e7e
leaq 0x10(%rsp), %rbx
movq %rbx, %rdi
callq 0x3a110
cmpb $0x0, (%rbx)
je 0x38fdb
leaq 0x18(%rsp), %rdi
xorl %esi, %esi
callq 0x2c37a
movq %rsp, %rcx
movl $0x4, (%rcx)
movq 0x20(%rsp), %r8
addq $0x8, %r8
leaq 0x1c3f2(%rip), %rsi     # 0x5500e
leaq 0x1c316(%rip), %rdx     # 0x54f39
leaq 0x10(%rsp), %rbx
movq %rbx, %rdi
callq 0x32e9d
cmpb $0x0, (%rbx)
je 0x39067
leaq 0x18(%rsp), %rdi
xorl %esi, %esi
callq 0x2c37a
movq %rsp, %rcx
movl $0x5, (%rcx)
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movq (%rax), %r8
leaq 0x1c148(%rip), %rsi     # 0x54da9
leaq 0x1c2e0(%rip), %rdx     # 0x54f48
leaq 0x10(%rsp), %rbx
movq %rbx, %rdi
callq 0x3a110
cmpb $0x0, (%rbx)
je 0x390f3
leaq 0x18(%rsp), %rdi
xorl %esi, %esi
callq 0x2c37a
movq %rsp, %rcx
movl $0x5, (%rcx)
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %r8
leaq 0x1c102(%rip), %rsi     # 0x54da9
leaq 0x1c2f1(%rip), %rdx     # 0x54f9f
leaq 0x10(%rsp), %rbx
movq %rbx, %rdi
callq 0x3a110
cmpb $0x0, (%rbx)
je 0x3917f
leaq 0x18(%rsp), %rdi
xorl %esi, %esi
callq 0x2c37a
movq %rsp, %rcx
movl $0x5, (%rcx)
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movq 0x10(%rax), %r8
leaq 0x1c0bc(%rip), %rsi     # 0x54da9
leaq 0x1c2c6(%rip), %rdx     # 0x54fba
leaq 0x10(%rsp), %rbx
movq %rbx, %rdi
callq 0x3a110
cmpb $0x0, (%rbx)
je 0x3920b
leaq 0x18(%rsp), %rdi
xorl %esi, %esi
callq 0x2c37a
movq %rsp, %rcx
movl $0x5, (%rcx)
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movq 0x18(%rax), %r8
leaq 0x1c076(%rip), %rsi     # 0x54da9
leaq 0x1c2d6(%rip), %rdx     # 0x55010
leaq 0x10(%rsp), %rbx
movq %rbx, %rdi
callq 0x3a110
cmpb $0x0, (%rbx)
je 0x39297
leaq 0x18(%rsp), %rdi
xorl %esi, %esi
callq 0x2c37a
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movq (%rax), %rax
xorl %ecx, %ecx
cmpl $0x5, (%rax)
cmoveq %rax, %rcx
movsd 0x8(%rcx), %xmm0
leaq 0x1c387(%rip), %rsi     # 0x55104
leaq 0x1c3a9(%rip), %rdx     # 0x5512d
leaq 0x10(%rsp), %rbx
movsd 0x1bf87(%rip), %xmm1    # 0x54d18
movq %rbx, %rdi
callq 0x3973f
cmpb $0x0, (%rbx)
je 0x39323
leaq 0x18(%rsp), %rdi
xorl %esi, %esi
callq 0x2c37a
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rax
xorl %ecx, %ecx
cmpl $0x5, (%rax)
cmoveq %rax, %rcx
movsd 0x8(%rcx), %xmm0
leaq 0x1c365(%rip), %rsi     # 0x55135
leaq 0x1c387(%rip), %rdx     # 0x5515e
leaq 0x10(%rsp), %rbx
movsd 0x1bf3c(%rip), %xmm1    # 0x54d20
movq %rbx, %rdi
callq 0x3973f
cmpb $0x0, (%rbx)
je 0x393af
leaq 0x18(%rsp), %rdi
xorl %esi, %esi
callq 0x2c37a
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movq 0x10(%rax), %rax
xorl %ecx, %ecx
cmpl $0x5, (%rax)
cmoveq %rax, %rcx
movsd 0x8(%rcx), %xmm0
leaq 0x1c343(%rip), %rsi     # 0x55166
leaq 0x1c365(%rip), %rdx     # 0x5518f
leaq 0x10(%rsp), %rbx
movsd 0x1bef1(%rip), %xmm1    # 0x54d28
movq %rbx, %rdi
callq 0x3973f
cmpb $0x0, (%rbx)
je 0x3943b
leaq 0x18(%rsp), %rdi
xorl %esi, %esi
callq 0x2c37a
movq 0x20(%rsp), %rax
movq 0x10(%rax), %rax
movq 0x18(%rax), %rax
xorl %ecx, %ecx
cmpl $0x5, (%rax)
cmoveq %rax, %rcx
movsd 0x8(%rcx), %xmm0
leaq 0x1c321(%rip), %rsi     # 0x55197
leaq 0x1c343(%rip), %rdx     # 0x551c0
leaq 0x10(%rsp), %rbx
movsd 0x1bea6(%rip), %xmm1    # 0x54d30
movq %rbx, %rdi
callq 0x3973f
cmpb $0x0, (%rbx)
jne 0x3956c
movq %rsp, %rdi
callq 0x12e46
movq 0x18(%rsp), %rax
testq %rax, %rax
je 0x3952b
movq (%rax), %r8
jmp 0x39532
leaq 0x20(%rsp), %rdi
callq 0x12e46
movq 0x18(%rsp), %rax
testq %rax, %rax
je 0x38ed0
movq (%rax), %rbx
leaq 0x1be71(%rip), %rdx     # 0x54d48
movq %rsp, %rdi
movl $0x2, %esi
movl $0x88, %ecx
movq %rbx, %r8
callq 0x10b64
movq %rsp, %rdi
leaq 0x20(%rsp), %rsi
callq 0x10c00
movq %rsp, %rdi
callq 0x10bd0
cmpq $0x0, 0x20(%rsp)
je 0x38f27
movl $0x1, %edi
callq 0x10b61
testb %al, %al
je 0x38f27
movq 0x20(%rsp), %rdi
testq %rdi, %rdi
je 0x38f27
movq (%rdi), %rax
callq *0x8(%rax)
leaq 0x18(%rsp), %rdi
xorl %esi, %esi
callq 0x2c37a
jmp 0x39578
leaq 0x20(%rsp), %rdi
callq 0x12e46
movq 0x18(%rsp), %rax
testq %rax, %rax
je 0x38f6f
movq (%rax), %r8
jmp 0x38f76
movq %rsp, %rdi
callq 0x12e46
movq 0x18(%rsp), %rax
testq %rax, %rax
je 0x38ff9
movq (%rax), %r8
jmp 0x39000
leaq 0x1ef51(%rip), %r8      # 0x57ec7
leaq 0x1bdcb(%rip), %rdx     # 0x54d48
movq %rsp, %rdi
movl $0x2, %esi
movl $0x89, %ecx
callq 0x10b64
movq %rsp, %rdi
leaq 0x20(%rsp), %rsi
callq 0x10c00
movq %rsp, %rdi
callq 0x10bd0
cmpq $0x0, 0x20(%rsp)
je 0x38fca
movl $0x1, %edi
callq 0x10b61
testb %al, %al
je 0x38fca
movq 0x20(%rsp), %rdi
testq %rdi, %rdi
je 0x38fca
movq (%rdi), %rax
callq *0x8(%rax)
leaq 0x18(%rsp), %rdi
xorl %esi, %esi
callq 0x2c37a
jmp 0x39578
movq %rsp, %rdi
callq 0x12e46
movq 0x18(%rsp), %rax
testq %rax, %rax
je 0x39085
movq (%rax), %r8
jmp 0x3908c
leaq 0x1eec7(%rip), %r8      # 0x57ec7
leaq 0x1bd41(%rip), %rdx     # 0x54d48
leaq 0x8(%rsp), %rdi
movl $0x2, %esi
movl $0x8c, %ecx
callq 0x10b64
leaq 0x8(%rsp), %rdi
movq %rsp, %rsi
callq 0x10c00
leaq 0x8(%rsp), %rdi
callq 0x10bd0
cmpq $0x0, (%rsp)
je 0x39056
movl $0x1, %edi
callq 0x10b61
testb %al, %al
je 0x39056
movq (%rsp), %rdi
testq %rdi, %rdi
je 0x39056
movq (%rdi), %rax
callq *0x8(%rax)
leaq 0x18(%rsp), %rdi
xorl %esi, %esi
callq 0x2c37a
jmp 0x39578
movq %rsp, %rdi
callq 0x12e46
movq 0x18(%rsp), %rax
testq %rax, %rax
je 0x39111
movq (%rax), %r8
jmp 0x39118
leaq 0x1ee3b(%rip), %r8      # 0x57ec7
leaq 0x1bcb5(%rip), %rdx     # 0x54d48
leaq 0x8(%rsp), %rdi
movl $0x2, %esi
movl $0x8e, %ecx
callq 0x10b64
leaq 0x8(%rsp), %rdi
movq %rsp, %rsi
callq 0x10c00
leaq 0x8(%rsp), %rdi
callq 0x10bd0
cmpq $0x0, (%rsp)
je 0x390e2
movl $0x1, %edi
callq 0x10b61
testb %al, %al
je 0x390e2
movq (%rsp), %rdi
testq %rdi, %rdi
je 0x390e2
movq (%rdi), %rax
callq *0x8(%rax)
leaq 0x18(%rsp), %rdi
xorl %esi, %esi
callq 0x2c37a
jmp 0x39578
movq %rsp, %rdi
callq 0x12e46
movq 0x18(%rsp), %rax
testq %rax, %rax
je 0x3919d
movq (%rax), %r8
jmp 0x391a4
leaq 0x1edaf(%rip), %r8      # 0x57ec7
leaq 0x1bc29(%rip), %rdx     # 0x54d48
leaq 0x8(%rsp), %rdi
movl $0x2, %esi
movl $0x8f, %ecx
callq 0x10b64
leaq 0x8(%rsp), %rdi
movq %rsp, %rsi
callq 0x10c00
leaq 0x8(%rsp), %rdi
callq 0x10bd0
cmpq $0x0, (%rsp)
je 0x3916e
movl $0x1, %edi
callq 0x10b61
testb %al, %al
je 0x3916e
movq (%rsp), %rdi
testq %rdi, %rdi
je 0x3916e
movq (%rdi), %rax
callq *0x8(%rax)
leaq 0x18(%rsp), %rdi
xorl %esi, %esi
callq 0x2c37a
jmp 0x39578
movq %rsp, %rdi
callq 0x12e46
movq 0x18(%rsp), %rax
testq %rax, %rax
je 0x39229
movq (%rax), %r8
jmp 0x39230
leaq 0x1ed23(%rip), %r8      # 0x57ec7
leaq 0x1bb9d(%rip), %rdx     # 0x54d48
leaq 0x8(%rsp), %rdi
movl $0x2, %esi
movl $0x90, %ecx
callq 0x10b64
leaq 0x8(%rsp), %rdi
movq %rsp, %rsi
callq 0x10c00
leaq 0x8(%rsp), %rdi
callq 0x10bd0
cmpq $0x0, (%rsp)
je 0x391fa
movl $0x1, %edi
callq 0x10b61
testb %al, %al
je 0x391fa
movq (%rsp), %rdi
testq %rdi, %rdi
je 0x391fa
movq (%rdi), %rax
callq *0x8(%rax)
leaq 0x18(%rsp), %rdi
xorl %esi, %esi
callq 0x2c37a
jmp 0x39578
movq %rsp, %rdi
callq 0x12e46
movq 0x18(%rsp), %rax
testq %rax, %rax
je 0x392b5
movq (%rax), %r8
jmp 0x392bc
leaq 0x1ec97(%rip), %r8      # 0x57ec7
leaq 0x1bb11(%rip), %rdx     # 0x54d48
leaq 0x8(%rsp), %rdi
movl $0x2, %esi
movl $0x91, %ecx
callq 0x10b64
leaq 0x8(%rsp), %rdi
movq %rsp, %rsi
callq 0x10c00
leaq 0x8(%rsp), %rdi
callq 0x10bd0
cmpq $0x0, (%rsp)
je 0x39286
movl $0x1, %edi
callq 0x10b61
testb %al, %al
je 0x39286
movq (%rsp), %rdi
testq %rdi, %rdi
je 0x39286
movq (%rdi), %rax
callq *0x8(%rax)
leaq 0x18(%rsp), %rdi
xorl %esi, %esi
callq 0x2c37a
jmp 0x39578
movq %rsp, %rdi
callq 0x12e46
movq 0x18(%rsp), %rax
testq %rax, %rax
je 0x39341
movq (%rax), %r8
jmp 0x39348
leaq 0x1ec0b(%rip), %r8      # 0x57ec7
leaq 0x1ba85(%rip), %rdx     # 0x54d48
leaq 0x8(%rsp), %rdi
movl $0x2, %esi
movl $0x92, %ecx
callq 0x10b64
leaq 0x8(%rsp), %rdi
movq %rsp, %rsi
callq 0x10c00
leaq 0x8(%rsp), %rdi
callq 0x10bd0
cmpq $0x0, (%rsp)
je 0x39312
movl $0x1, %edi
callq 0x10b61
testb %al, %al
je 0x39312
movq (%rsp), %rdi
testq %rdi, %rdi
je 0x39312
movq (%rdi), %rax
callq *0x8(%rax)
leaq 0x18(%rsp), %rdi
xorl %esi, %esi
callq 0x2c37a
jmp 0x39578
movq %rsp, %rdi
callq 0x12e46
movq 0x18(%rsp), %rax
testq %rax, %rax
je 0x393cd
movq (%rax), %r8
jmp 0x393d4
leaq 0x1eb7f(%rip), %r8      # 0x57ec7
leaq 0x1b9f9(%rip), %rdx     # 0x54d48
leaq 0x8(%rsp), %rdi
movl $0x2, %esi
movl $0x93, %ecx
callq 0x10b64
leaq 0x8(%rsp), %rdi
movq %rsp, %rsi
callq 0x10c00
leaq 0x8(%rsp), %rdi
callq 0x10bd0
cmpq $0x0, (%rsp)
je 0x3939e
movl $0x1, %edi
callq 0x10b61
testb %al, %al
je 0x3939e
movq (%rsp), %rdi
testq %rdi, %rdi
je 0x3939e
movq (%rdi), %rax
callq *0x8(%rax)
leaq 0x18(%rsp), %rdi
xorl %esi, %esi
callq 0x2c37a
jmp 0x39578
movq %rsp, %rdi
callq 0x12e46
movq 0x18(%rsp), %rax
testq %rax, %rax
je 0x39452
movq (%rax), %r8
jmp 0x39459
leaq 0x1eaf3(%rip), %r8      # 0x57ec7
leaq 0x1b96d(%rip), %rdx     # 0x54d48
leaq 0x8(%rsp), %rdi
movl $0x2, %esi
movl $0x94, %ecx
callq 0x10b64
leaq 0x8(%rsp), %rdi
movq %rsp, %rsi
callq 0x10c00
leaq 0x8(%rsp), %rdi
callq 0x10bd0
cmpq $0x0, (%rsp)
je 0x3942a
movl $0x1, %edi
callq 0x10b61
testb %al, %al
je 0x3942a
movq (%rsp), %rdi
testq %rdi, %rdi
je 0x3942a
movq (%rdi), %rax
callq *0x8(%rax)
leaq 0x18(%rsp), %rdi
xorl %esi, %esi
callq 0x2c37a
jmp 0x39578
movq %rsp, %rdi
callq 0x12e46
movq 0x18(%rsp), %rax
testq %rax, %rax
je 0x394c0
movq (%rax), %r8
jmp 0x394c7
leaq 0x1ea6e(%rip), %r8      # 0x57ec7
leaq 0x1b8e8(%rip), %rdx     # 0x54d48
leaq 0x8(%rsp), %rdi
movl $0x2, %esi
movl $0x95, %ecx
callq 0x10b64
leaq 0x8(%rsp), %rdi
movq %rsp, %rsi
callq 0x10c00
leaq 0x8(%rsp), %rdi
callq 0x10bd0
cmpq $0x0, (%rsp)
je 0x394af
movl $0x1, %edi
callq 0x10b61
testb %al, %al
je 0x394af
movq (%rsp), %rdi
testq %rdi, %rdi
je 0x394af
movq (%rdi), %rax
callq *0x8(%rax)
leaq 0x18(%rsp), %rdi
xorl %esi, %esi
callq 0x2c37a
jmp 0x39578
leaq 0x1ea00(%rip), %r8      # 0x57ec7
leaq 0x1b87a(%rip), %rdx     # 0x54d48
leaq 0x8(%rsp), %rdi
movl $0x2, %esi
movl $0x96, %ecx
callq 0x10b64
leaq 0x8(%rsp), %rdi
movq %rsp, %rsi
callq 0x10c00
leaq 0x8(%rsp), %rdi
callq 0x10bd0
cmpq $0x0, (%rsp)
je 0x3951d
movl $0x1, %edi
callq 0x10b61
testb %al, %al
je 0x3951d
movq (%rsp), %rdi
testq %rdi, %rdi
je 0x3951d
movq (%rdi), %rax
callq *0x8(%rax)
leaq 0x18(%rsp), %rdi
xorl %esi, %esi
callq 0x2c37a
jmp 0x39578
leaq 0x1e995(%rip), %r8      # 0x57ec7
leaq 0x1b80f(%rip), %rdx     # 0x54d48
leaq 0x8(%rsp), %rdi
movl $0x2, %esi
movl $0x97, %ecx
callq 0x10b64
leaq 0x8(%rsp), %rdi
movq %rsp, %rsi
callq 0x10c00
leaq 0x8(%rsp), %rdi
callq 0x10bd0
movq %rsp, %rdi
callq 0x31a70
leaq 0x18(%rsp), %rdi
xorl %esi, %esi
callq 0x2c37a
addq $0x60, %rsp
popq %rbx
popq %r14
popq %r15
retq
jmp 0x39663
jmp 0x39672
jmp 0x396aa
jmp 0x396bf
jmp 0x396bf
jmp 0x396bf
jmp 0x39663
jmp 0x39672
jmp 0x396aa
jmp 0x396bf
jmp 0x396bf
jmp 0x396bf
jmp 0x39663
jmp 0x39672
jmp 0x396aa
jmp 0x396bf
jmp 0x396bf
jmp 0x396bf
jmp 0x39663
jmp 0x39672
jmp 0x396aa
jmp 0x396bf
jmp 0x396bf
jmp 0x396bf
jmp 0x39663
jmp 0x39672
jmp 0x396aa
jmp 0x396bf
jmp 0x396bf
jmp 0x396bf
jmp 0x39663
jmp 0x39672
jmp 0x396aa
jmp 0x396bf
jmp 0x396bf
jmp 0x396bf
jmp 0x39663
jmp 0x39672
jmp 0x396aa
jmp 0x396bf
jmp 0x396bf
jmp 0x396bf
jmp 0x39663
jmp 0x39672
jmp 0x396aa
jmp 0x396bf
jmp 0x396bf
jmp 0x396bf
jmp 0x39663
jmp 0x39672
jmp 0x396aa
jmp 0x396bf
jmp 0x396bf
jmp 0x396bf
jmp 0x39663
jmp 0x39672
jmp 0x396aa
jmp 0x396bf
jmp 0x396bf
jmp 0x396bf
movq %rax, %rbx
leaq 0x8(%rsp), %rdi
callq 0x10bd0
jmp 0x39675
movq %rax, %rbx
movq %rsp, %rdi
jmp 0x396a3
jmp 0x396aa
jmp 0x396bf
jmp 0x396bf
jmp 0x396bf
jmp 0x3968e
jmp 0x3969b
jmp 0x396aa
jmp 0x396bf
jmp 0x396bf
jmp 0x396bf
movq %rax, %rbx
movq %rsp, %rdi
callq 0x10bd0
jmp 0x3969e
movq %rax, %rbx
leaq 0x20(%rsp), %rdi
callq 0x31a70
jmp 0x396ad
movq %rax, %rbx
leaq 0x10(%rsp), %rdi
callq 0x31a82
movq %rbx, %rdi
callq 0xcbb0
movq %rax, %rdi
callq 0x287ef