// File: tcannon686[P]obj2webgl/./obj_parser.hpp
// Function: ObjParser<std::basic_ifstream<char, std::char_traits<char>>>::parseFace()
bool parseFace()
    {
        if(accept(TokenType::FACE))
        {
            std::vector<int> vIndices;
            std::vector<int> tIndices;
            std::vector<int> nIndices;

            while(accept(TokenType::NUMBER))
            {
                int v_index = stoi(token) - 1;
                vIndices.push_back(v_index);
                
                if(accept(TokenType::INDEX_SEPARATOR))
                {
                    if(accept(TokenType::NUMBER))
                    {
                        int t_index = stoi(token) - 1;
                        tIndices.push_back(t_index);
                    }
                }

                if(accept(TokenType::INDEX_SEPARATOR))
                {
                    if(accept(TokenType::NUMBER))
                    {
                        int n_index = stoi(token) - 1;
                        nIndices.push_back(n_index);
                    }
                }
            }

            if(tIndices.size() > 0)
                assert(tIndices.size() == vIndices.size());
            if(nIndices.size() > 0)
                assert(nIndices.size() == vIndices.size());

            /* Convert to triangles. */
            for(std::size_t i = 1; i < vIndices.size() - 1; i ++)
            {
                this->vIndices.push_back(vIndices[0]);
                if(nIndices.size() > 0)
                    this->nIndices.push_back(nIndices[0]);
                if(tIndices.size() > 0)
                    this->tIndices.push_back(tIndices[0]);
                for(std::size_t j = 0; j < 2; j ++)
                {
                    this->vIndices.push_back(vIndices[i + j]);
                    if(nIndices.size() > 0)
                        this->nIndices.push_back(nIndices[i + j]);
                    if(tIndices.size() > 0)
                        this->tIndices.push_back(tIndices[i + j]);
                }
            }

            if(this->nIndices.size() > 0)
                assert(this->nIndices.size() == this->vIndices.size());
            
            if(this->tIndices.size() > 0)
                assert(this->tIndices.size() == this->vIndices.size());

            return true;
        }
        return false;
    }

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x100, %rsp            # imm = 0x100
movq %rdi, -0x10(%rbp)
movq -0x10(%rbp), %rdi
movq %rdi, -0x88(%rbp)
movl $0x4, %esi
callq 0x73b0
testb $0x1, %al
jne 0x76cd
jmp 0x7c38
leaq -0x28(%rbp), %rdi
callq 0x6970
leaq -0x40(%rbp), %rdi
callq 0x6970
leaq -0x58(%rbp), %rdi
callq 0x6970
movq -0x88(%rbp), %rdi
movl $0xb, %esi
callq 0x73b0
movb %al, -0x89(%rbp)
jmp 0x7701
movb -0x89(%rbp), %al
testb $0x1, %al
jne 0x7710
jmp 0x789a
movq -0x88(%rbp), %rdi
addq $0xa0, %rdi
xorl %eax, %eax
movl %eax, %esi
movl $0xa, %edx
callq 0xa000
movl %eax, -0x90(%rbp)
jmp 0x7734
movl -0x90(%rbp), %eax
decl %eax
movl %eax, -0x68(%rbp)
leaq -0x28(%rbp), %rdi
leaq -0x68(%rbp), %rsi
callq 0xa040
jmp 0x774e
movq -0x88(%rbp), %rdi
movl $0xa, %esi
callq 0x73b0
movb %al, -0x91(%rbp)
jmp 0x7767
movb -0x91(%rbp), %al
testb $0x1, %al
jne 0x7776
jmp 0x7809
movq -0x88(%rbp), %rdi
movl $0xb, %esi
callq 0x73b0
movb %al, -0x92(%rbp)
jmp 0x778f
movb -0x92(%rbp), %al
testb $0x1, %al
jne 0x779b
jmp 0x7807
movq -0x88(%rbp), %rdi
addq $0xa0, %rdi
xorl %eax, %eax
movl %eax, %esi
movl $0xa, %edx
callq 0xa000
movl %eax, -0x98(%rbp)
jmp 0x77bf
movl -0x98(%rbp), %eax
decl %eax
movl %eax, -0x6c(%rbp)
leaq -0x40(%rbp), %rdi
leaq -0x6c(%rbp), %rsi
callq 0xa040
jmp 0x77d9
jmp 0x7807
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x60(%rbp)
movl %eax, -0x64(%rbp)
leaq -0x58(%rbp), %rdi
callq 0x5e20
leaq -0x40(%rbp), %rdi
callq 0x5e20
leaq -0x28(%rbp), %rdi
callq 0x5e20
jmp 0x7c4a
jmp 0x7809
movq -0x88(%rbp), %rdi
movl $0xa, %esi
callq 0x73b0
movb %al, -0x99(%rbp)
jmp 0x7822
movb -0x99(%rbp), %al
testb $0x1, %al
jne 0x782e
jmp 0x7895
movq -0x88(%rbp), %rdi
movl $0xb, %esi
callq 0x73b0
movb %al, -0x9a(%rbp)
jmp 0x7847
movb -0x9a(%rbp), %al
testb $0x1, %al
jne 0x7853
jmp 0x7893
movq -0x88(%rbp), %rdi
addq $0xa0, %rdi
xorl %eax, %eax
movl %eax, %esi
movl $0xa, %edx
callq 0xa000
movl %eax, -0xa0(%rbp)
jmp 0x7877
movl -0xa0(%rbp), %eax
decl %eax
movl %eax, -0x70(%rbp)
leaq -0x58(%rbp), %rdi
leaq -0x70(%rbp), %rsi
callq 0xa040
jmp 0x7891
jmp 0x7893
jmp 0x7895
jmp 0x76e8
leaq -0x40(%rbp), %rdi
callq 0xa0b0
cmpq $0x0, %rax
jbe 0x78f4
leaq -0x40(%rbp), %rdi
callq 0xa0b0
movq %rax, -0xa8(%rbp)
leaq -0x28(%rbp), %rdi
callq 0xa0b0
movq %rax, %rcx
movq -0xa8(%rbp), %rax
cmpq %rcx, %rax
jne 0x78d3
jmp 0x78f2
leaq 0x7c8a(%rip), %rdi      # 0xf564
leaq 0x7ca6(%rip), %rsi      # 0xf587
movl $0x158, %edx            # imm = 0x158
leaq 0x7cab(%rip), %rcx      # 0xf598
callq 0x31b0
jmp 0x78f4
leaq -0x58(%rbp), %rdi
callq 0xa0b0
cmpq $0x0, %rax
jbe 0x794e
leaq -0x58(%rbp), %rdi
callq 0xa0b0
movq %rax, -0xb0(%rbp)
leaq -0x28(%rbp), %rdi
callq 0xa0b0
movq %rax, %rcx
movq -0xb0(%rbp), %rax
cmpq %rcx, %rax
jne 0x792d
jmp 0x794c
leaq 0x7cc0(%rip), %rdi      # 0xf5f4
leaq 0x7c4c(%rip), %rsi      # 0xf587
movl $0x15a, %edx            # imm = 0x15A
leaq 0x7c51(%rip), %rcx      # 0xf598
callq 0x31b0
jmp 0x794e
movq $0x1, -0x78(%rbp)
movq -0x78(%rbp), %rax
movq %rax, -0xb8(%rbp)
leaq -0x28(%rbp), %rdi
callq 0xa0b0
movq %rax, %rcx
movq -0xb8(%rbp), %rax
subq $0x1, %rcx
cmpq %rcx, %rax
jae 0x7b33
movq -0x88(%rbp), %rax
addq $0x50, %rax
movq %rax, -0xc0(%rbp)
xorl %eax, %eax
movl %eax, %esi
leaq -0x28(%rbp), %rdi
callq 0xa0d0
movq -0xc0(%rbp), %rdi
movq %rax, %rsi
callq 0xa040
jmp 0x79b1
leaq -0x58(%rbp), %rdi
callq 0xa0b0
cmpq $0x0, %rax
jbe 0x79f2
movq -0x88(%rbp), %rax
addq $0x68, %rax
movq %rax, -0xc8(%rbp)
xorl %eax, %eax
movl %eax, %esi
leaq -0x58(%rbp), %rdi
callq 0xa0d0
movq -0xc8(%rbp), %rdi
movq %rax, %rsi
callq 0xa040
jmp 0x79f0
jmp 0x79f2
leaq -0x40(%rbp), %rdi
callq 0xa0b0
cmpq $0x0, %rax
jbe 0x7a33
movq -0x88(%rbp), %rax
subq $-0x80, %rax
movq %rax, -0xd0(%rbp)
xorl %eax, %eax
movl %eax, %esi
leaq -0x40(%rbp), %rdi
callq 0xa0d0
movq -0xd0(%rbp), %rdi
movq %rax, %rsi
callq 0xa040
jmp 0x7a31
jmp 0x7a33
movq $0x0, -0x80(%rbp)
cmpq $0x2, -0x80(%rbp)
jae 0x7b20
movq -0x88(%rbp), %rax
addq $0x50, %rax
movq %rax, -0xd8(%rbp)
movq -0x78(%rbp), %rsi
movq -0x80(%rbp), %rax
addq %rax, %rsi
leaq -0x28(%rbp), %rdi
callq 0xa0d0
movq -0xd8(%rbp), %rdi
movq %rax, %rsi
callq 0xa040
jmp 0x7a7d
leaq -0x58(%rbp), %rdi
callq 0xa0b0
cmpq $0x0, %rax
jbe 0x7ac5
movq -0x88(%rbp), %rax
addq $0x68, %rax
movq %rax, -0xe0(%rbp)
movq -0x78(%rbp), %rsi
movq -0x80(%rbp), %rax
addq %rax, %rsi
leaq -0x58(%rbp), %rdi
callq 0xa0d0
movq -0xe0(%rbp), %rdi
movq %rax, %rsi
callq 0xa040
jmp 0x7ac3
jmp 0x7ac5
leaq -0x40(%rbp), %rdi
callq 0xa0b0
cmpq $0x0, %rax
jbe 0x7b0d
movq -0x88(%rbp), %rax
subq $-0x80, %rax
movq %rax, -0xe8(%rbp)
movq -0x78(%rbp), %rsi
movq -0x80(%rbp), %rax
addq %rax, %rsi
leaq -0x40(%rbp), %rdi
callq 0xa0d0
movq -0xe8(%rbp), %rdi
movq %rax, %rsi
callq 0xa040
jmp 0x7b0b
jmp 0x7b0d
jmp 0x7b0f
movq -0x80(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x80(%rbp)
jmp 0x7a3b
jmp 0x7b22
movq -0x78(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x78(%rbp)
jmp 0x7956
movq -0x88(%rbp), %rdi
addq $0x68, %rdi
callq 0xa0b0
cmpq $0x0, %rax
jbe 0x7ba2
movq -0x88(%rbp), %rdi
addq $0x68, %rdi
callq 0xa0b0
movq -0x88(%rbp), %rdi
movq %rax, -0xf0(%rbp)
addq $0x50, %rdi
callq 0xa0b0
movq %rax, %rcx
movq -0xf0(%rbp), %rax
cmpq %rcx, %rax
jne 0x7b81
jmp 0x7ba0
leaq 0x7a8f(%rip), %rdi      # 0xf617
leaq 0x79f8(%rip), %rsi      # 0xf587
movl $0x16f, %edx            # imm = 0x16F
leaq 0x79fd(%rip), %rcx      # 0xf598
callq 0x31b0
jmp 0x7ba2
movq -0x88(%rbp), %rdi
addq $0x80, %rdi
callq 0xa0b0
cmpq $0x0, %rax
jbe 0x7c17
movq -0x88(%rbp), %rdi
addq $0x80, %rdi
callq 0xa0b0
movq -0x88(%rbp), %rdi
movq %rax, -0xf8(%rbp)
addq $0x50, %rdi
callq 0xa0b0
movq %rax, %rcx
movq -0xf8(%rbp), %rax
cmpq %rcx, %rax
jne 0x7bf6
jmp 0x7c15
leaq 0x7a49(%rip), %rdi      # 0xf646
leaq 0x7983(%rip), %rsi      # 0xf587
movl $0x172, %edx            # imm = 0x172
leaq 0x7988(%rip), %rcx      # 0xf598
callq 0x31b0
jmp 0x7c17
movb $0x1, -0x1(%rbp)
leaq -0x58(%rbp), %rdi
callq 0x5e20
leaq -0x40(%rbp), %rdi
callq 0x5e20
leaq -0x28(%rbp), %rdi
callq 0x5e20
jmp 0x7c3c
movb $0x0, -0x1(%rbp)
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0x100, %rsp            # imm = 0x100
popq %rbp
retq
movq -0x60(%rbp), %rdi
callq 0x34b0
nopw %cs:(%rax,%rax)
nopl (%rax)