// File: lega911[P]ijson/src/main.cpp
// Function: main
int main(int argc, char** argv) {
    #ifdef DEBUG
        catch_fatal();
    #endif
    generator_init();

    Server server;
    server.log = 15;

    Slice s, next;
    for(int i=1;i<argc;i++) {
        s.set(argv[i]);
        if(i + 1 < argc) next.set(argv[i + 1]);
        else next.reset();

        if(s == "--host") {
            if(next.valid()) {
                Slice _h = next.split_left(':');
                if(!_h.empty()) server.host.set(_h);
                if(!next.empty()) {
                    try {
                        server.port = next.atoi();
                    } catch(const Exception &e) {
                        std::cout << "Wrong host option\n";
                        return 1;
                    }
                }
                i++;
            } else {
                std::cout << "Wrong host\n";
                return 1;
            }
        } else if(s == "--filter") {
            if(next.valid()) {
                NetFilter nf(next);
                server.net_filter.push_back(nf);
                i++;
                if(server.host.empty()) server.host.set("0.0.0.0");
            } else {
                std::cout << "Wrong port\n";
                return 1;
            }
        } else if(s == "--log") {
            if(next.valid()) {
                try {
                    server.log = next.atoi();
                } catch(const Exception &e) {
                    std::cout << "Wrong log option\n";
                    return 1;
                }
                i++;
            } else {
                std::cout << "Wrong log option\n";
                return 1;
            }
        } else if(s == "--help") {
            std::cout << "ijson " << ijson_version << std::endl;
            std::cout << help_info;
            return 0;
        } else if(s == "--jsonrpc2") {
            server.jsonrpc2 = true;
        } else if(s == "--version") {
            std::cout << ijson_version << std::endl;
            return 0;
        } else if(s == "--threads") {
            server.threads = -1;
            if(next.valid()) {
                try {
                    server.threads = next.atoi();
                } catch(const Exception &e) {}
                i++;
            };
            if(server.threads < 0 || server.threads > 32) {
                std::cout << "Wrong thread option\n";
                return 1;
            }
        } else {
            std::cout << "Wrong option (" << s.as_string() << ")\n\nuse --help\n";
            return 1;
        }
    }

    if(server.host.empty()) {
        #ifdef DOCKER
            server.host.set("0.0.0.0");
        #else
            server.host.set("127.0.0.1");
        #endif
    }

    try {
        server.start();
    } catch (const Exception &e) {
        if(server.log & 1) e.print("Exception in server.start");
    } catch (const std::exception &e) {
        if(server.log & 1) std::cout << ltime() << "Fatal exception: " << e.what() << std::endl;
    }
    return 1;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x202f0, %rsp          # imm = 0x202F0
movl $0x0, -0x4(%rbp)
movl %edi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
callq 0x23260
callq 0x36c60
leaq -0x20198(%rbp), %rdi
callq 0x24bf0
movl $0xf, -0x20178(%rbp)
leaq -0x201a8(%rbp), %rdi
callq 0x1e9d0
jmp 0x24227
leaq -0x201c8(%rbp), %rdi
callq 0x1e9d0
jmp 0x24235
movl $0x1, -0x201cc(%rbp)
movl -0x201cc(%rbp), %eax
cmpl -0x8(%rbp), %eax
jge 0x249ee
movq -0x10(%rbp), %rax
movslq -0x201cc(%rbp), %rcx
movq (%rax,%rcx,8), %rsi
leaq -0x201a8(%rbp), %rdi
callq 0x1fce0
jmp 0x2426b
movl -0x201cc(%rbp), %eax
addl $0x1, %eax
cmpl -0x8(%rbp), %eax
jge 0x242b0
movq -0x10(%rbp), %rax
movslq -0x201cc(%rbp), %rcx
movq 0x8(%rax,%rcx,8), %rsi
leaq -0x201c8(%rbp), %rdi
callq 0x1fce0
jmp 0x24297
jmp 0x242c0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x201b0(%rbp)
movl %eax, -0x201b4(%rbp)
jmp 0x24bce
leaq -0x201c8(%rbp), %rdi
callq 0x1ed70
jmp 0x242be
jmp 0x242c0
leaq 0x14e13(%rip), %rsi     # 0x390da
leaq -0x201a8(%rbp), %rdi
callq 0x1ee30
movb %al, -0x20249(%rbp)
jmp 0x242db
movb -0x20249(%rbp), %al
testb $0x1, %al
jne 0x242ea
jmp 0x244ae
leaq -0x201c8(%rbp), %rdi
callq 0x1ec10
movb %al, -0x2024a(%rbp)
jmp 0x242fe
movb -0x2024a(%rbp), %al
testb $0x1, %al
jne 0x2430d
jmp 0x2447e
leaq -0x201c8(%rbp), %rdi
movl $0x3a, %esi
callq 0x232a0
movl %edx, -0x2025c(%rbp)
movq %rax, -0x20258(%rbp)
jmp 0x2432d
movl -0x2025c(%rbp), %eax
movq -0x20258(%rbp), %rcx
movq %rcx, -0x201f0(%rbp)
movl %eax, -0x201e8(%rbp)
movl -0x201e8(%rbp), %eax
movl %eax, -0x201d8(%rbp)
movq -0x201f0(%rbp), %rax
movq %rax, -0x201e0(%rbp)
leaq -0x201e0(%rbp), %rdi
callq 0x1eb40
movb %al, -0x2025d(%rbp)
jmp 0x24375
movb -0x2025d(%rbp), %al
testb $0x1, %al
jne 0x24398
jmp 0x24381
leaq -0x20188(%rbp), %rdi
leaq -0x201e0(%rbp), %rsi
callq 0x1f580
jmp 0x24396
jmp 0x24398
leaq -0x201c8(%rbp), %rdi
callq 0x1eb40
movb %al, -0x2025e(%rbp)
jmp 0x243ac
movb -0x2025e(%rbp), %al
testb $0x1, %al
jne 0x2446d
jmp 0x243bc
leaq -0x201c8(%rbp), %rdi
callq 0x1efb0
movq %rax, -0x20268(%rbp)
jmp 0x243d1
movq -0x20268(%rbp), %rax
movl %eax, -0x20174(%rbp)
jmp 0x2446b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x201b0(%rbp)
movl %eax, -0x201b4(%rbp)
movl -0x201b4(%rbp), %eax
movl $0x2, %ecx
cmpl %ecx, %eax
jne 0x24bce
movq -0x201b0(%rbp), %rdi
callq 0x19120
movq %rax, -0x201f8(%rbp)
movq 0x22bae(%rip), %rdi     # 0x46fd0
leaq 0x14cb8(%rip), %rsi     # 0x390e1
callq 0x192e0
jmp 0x24430
movl $0x1, -0x4(%rbp)
movl $0x1, -0x201fc(%rbp)
callq 0x19450
jmp 0x24461
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x201b0(%rbp)
movl %eax, -0x201b4(%rbp)
callq 0x19450
jmp 0x24466
jmp 0x24bb6
jmp 0x24bce
jmp 0x2446d
movl -0x201cc(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x201cc(%rbp)
jmp 0x244a9
movq 0x22b4b(%rip), %rdi     # 0x46fd0
leaq 0x14c68(%rip), %rsi     # 0x390f4
callq 0x192e0
jmp 0x24493
movl $0x1, -0x4(%rbp)
movl $0x1, -0x201fc(%rbp)
jmp 0x24bb6
jmp 0x249d8
leaq 0x14c4b(%rip), %rsi     # 0x39100
leaq -0x201a8(%rbp), %rdi
callq 0x1ee30
movb %al, -0x20269(%rbp)
jmp 0x244c9
movb -0x20269(%rbp), %al
testb $0x1, %al
jne 0x244d8
jmp 0x24599
leaq -0x201c8(%rbp), %rdi
callq 0x1ec10
movb %al, -0x2026a(%rbp)
jmp 0x244ec
movb -0x2026a(%rbp), %al
testb $0x1, %al
jne 0x244f8
jmp 0x24569
leaq -0x20204(%rbp), %rdi
leaq -0x201c8(%rbp), %rsi
callq 0x27340
jmp 0x2450d
leaq -0x20160(%rbp), %rdi
leaq -0x20204(%rbp), %rsi
callq 0x24d20
jmp 0x24522
movl -0x201cc(%rbp), %eax
incl %eax
movl %eax, -0x201cc(%rbp)
leaq -0x20188(%rbp), %rdi
callq 0x1eb40
movb %al, -0x2026b(%rbp)
jmp 0x24544
movb -0x2026b(%rbp), %al
testb $0x1, %al
jne 0x24550
jmp 0x24567
leaq -0x20188(%rbp), %rdi
leaq 0x14bab(%rip), %rsi     # 0x39109
callq 0x1fce0
jmp 0x24565
jmp 0x24567
jmp 0x24594
movq 0x22a60(%rip), %rdi     # 0x46fd0
leaq 0x14b9a(%rip), %rsi     # 0x39111
callq 0x192e0
jmp 0x2457e
movl $0x1, -0x4(%rbp)
movl $0x1, -0x201fc(%rbp)
jmp 0x24bb6
jmp 0x249d6
leaq 0x14b7d(%rip), %rsi     # 0x3911d
leaq -0x201a8(%rbp), %rdi
callq 0x1ee30
movb %al, -0x2026c(%rbp)
jmp 0x245b4
movb -0x2026c(%rbp), %al
testb $0x1, %al
jne 0x245c3
jmp 0x246d6
leaq -0x201c8(%rbp), %rdi
callq 0x1ec10
movb %al, -0x2026d(%rbp)
jmp 0x245d7
movb -0x2026d(%rbp), %al
testb $0x1, %al
jne 0x245e6
jmp 0x246a6
leaq -0x201c8(%rbp), %rdi
callq 0x1efb0
movq %rax, -0x20278(%rbp)
jmp 0x245fb
movq -0x20278(%rbp), %rax
movl %eax, -0x20178(%rbp)
jmp 0x24695
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x201b0(%rbp)
movl %eax, -0x201b4(%rbp)
movl -0x201b4(%rbp), %eax
movl $0x2, %ecx
cmpl %ecx, %eax
jne 0x24bce
movq -0x201b0(%rbp), %rdi
callq 0x19120
movq %rax, -0x20210(%rbp)
movq 0x22984(%rip), %rdi     # 0x46fd0
leaq 0x14ad0(%rip), %rsi     # 0x39123
callq 0x192e0
jmp 0x2465a
movl $0x1, -0x4(%rbp)
movl $0x1, -0x201fc(%rbp)
callq 0x19450
jmp 0x2468b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x201b0(%rbp)
movl %eax, -0x201b4(%rbp)
callq 0x19450
jmp 0x24690
jmp 0x24bb6
jmp 0x24bce
movl -0x201cc(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x201cc(%rbp)
jmp 0x246d1
movq 0x22923(%rip), %rdi     # 0x46fd0
leaq 0x14a6f(%rip), %rsi     # 0x39123
callq 0x192e0
jmp 0x246bb
movl $0x1, -0x4(%rbp)
movl $0x1, -0x201fc(%rbp)
jmp 0x24bb6
jmp 0x249d4
leaq 0x14a58(%rip), %rsi     # 0x39135
leaq -0x201a8(%rbp), %rdi
callq 0x1ee30
movb %al, -0x20279(%rbp)
jmp 0x246f1
movb -0x20279(%rbp), %al
testb $0x1, %al
jne 0x246fd
jmp 0x24775
movq 0x228cc(%rip), %rdi     # 0x46fd0
leaq 0x13f91(%rip), %rsi     # 0x3869c
callq 0x192e0
movq %rax, -0x20288(%rbp)
jmp 0x24719
movq -0x20288(%rbp), %rdi
movq 0x22b99(%rip), %rsi     # 0x472c0
callq 0x192e0
movq %rax, -0x20290(%rbp)
jmp 0x24735
movq -0x20290(%rbp), %rdi
movq 0x2286d(%rip), %rsi     # 0x46fb0
callq 0x19320
jmp 0x2474a
movq 0x22b67(%rip), %rsi     # 0x472b8
movq 0x22878(%rip), %rdi     # 0x46fd0
callq 0x192e0
jmp 0x2475f
movl $0x0, -0x4(%rbp)
movl $0x1, -0x201fc(%rbp)
jmp 0x24bb6
leaq 0x149c0(%rip), %rsi     # 0x3913c
leaq -0x201a8(%rbp), %rdi
callq 0x1ee30
movb %al, -0x20291(%rbp)
jmp 0x24790
movb -0x20291(%rbp), %al
testb $0x1, %al
jne 0x2479c
jmp 0x247a8
movb $0x1, -0x2016c(%rbp)
jmp 0x249d0
leaq 0x14998(%rip), %rsi     # 0x39147
leaq -0x201a8(%rbp), %rdi
callq 0x1ee30
movb %al, -0x20292(%rbp)
jmp 0x247c3
movb -0x20292(%rbp), %al
testb $0x1, %al
jne 0x247cf
jmp 0x24816
movq 0x22aea(%rip), %rsi     # 0x472c0
movq 0x227f3(%rip), %rdi     # 0x46fd0
callq 0x192e0
movq %rax, -0x202a0(%rbp)
jmp 0x247eb
movq -0x202a0(%rbp), %rdi
movq 0x227b7(%rip), %rsi     # 0x46fb0
callq 0x19320
jmp 0x24800
movl $0x0, -0x4(%rbp)
movl $0x1, -0x201fc(%rbp)
jmp 0x24bb6
leaq 0x14934(%rip), %rsi     # 0x39151
leaq -0x201a8(%rbp), %rdi
callq 0x1ee30
movb %al, -0x202a1(%rbp)
jmp 0x24831
movb -0x202a1(%rbp), %al
testb $0x1, %al
jne 0x24840
jmp 0x24920
movl $0xffffffff, -0x20170(%rbp) # imm = 0xFFFFFFFF
leaq -0x201c8(%rbp), %rdi
callq 0x1ec10
movb %al, -0x202a2(%rbp)
jmp 0x2485e
movb -0x202a2(%rbp), %al
testb $0x1, %al
jne 0x2486a
jmp 0x248de
leaq -0x201c8(%rbp), %rdi
callq 0x1efb0
movq %rax, -0x202b0(%rbp)
jmp 0x2487f
movq -0x202b0(%rbp), %rax
movl %eax, -0x20170(%rbp)
jmp 0x248cf
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x201b0(%rbp)
movl %eax, -0x201b4(%rbp)
movl -0x201b4(%rbp), %eax
movl $0x2, %ecx
cmpl %ecx, %eax
jne 0x24bce
movq -0x201b0(%rbp), %rdi
callq 0x19120
movq %rax, -0x20218(%rbp)
callq 0x19450
jmp 0x248cd
jmp 0x248cf
movl -0x201cc(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x201cc(%rbp)
cmpl $0x0, -0x20170(%rbp)
jl 0x248f0
cmpl $0x20, -0x20170(%rbp)
jle 0x2491b
movq 0x226d9(%rip), %rdi     # 0x46fd0
leaq 0x1485d(%rip), %rsi     # 0x3915b
callq 0x192e0
jmp 0x24905
movl $0x1, -0x4(%rbp)
movl $0x1, -0x201fc(%rbp)
jmp 0x24bb6
jmp 0x249cc
movq 0x226a9(%rip), %rdi     # 0x46fd0
leaq 0x14842(%rip), %rsi     # 0x39170
callq 0x192e0
movq %rax, -0x202b8(%rbp)
jmp 0x2493c
leaq -0x20238(%rbp), %rdi
leaq -0x201a8(%rbp), %rsi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
callq 0x1f340
jmp 0x24956
movq -0x202b8(%rbp), %rdi
leaq -0x20238(%rbp), %rsi
callq 0x19290
movq %rax, -0x202c0(%rbp)
jmp 0x24972
movq -0x202c0(%rbp), %rdi
leaq 0x147ff(%rip), %rsi     # 0x3917f
callq 0x192e0
jmp 0x24987
leaq -0x20238(%rbp), %rdi
callq 0x191e0
movl $0x1, -0x4(%rbp)
movl $0x1, -0x201fc(%rbp)
jmp 0x24bb6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x201b0(%rbp)
movl %eax, -0x201b4(%rbp)
leaq -0x20238(%rbp), %rdi
callq 0x191e0
jmp 0x24bce
jmp 0x249ce
jmp 0x249d0
jmp 0x249d2
jmp 0x249d4
jmp 0x249d6
jmp 0x249d8
jmp 0x249da
movl -0x201cc(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x201cc(%rbp)
jmp 0x2423f
leaq -0x20188(%rbp), %rdi
callq 0x1eb40
movb %al, -0x202c1(%rbp)
jmp 0x24a02
movb -0x202c1(%rbp), %al
testb $0x1, %al
jne 0x24a0e
jmp 0x24a25
leaq -0x20188(%rbp), %rdi
leaq 0x14772(%rip), %rsi     # 0x3918e
callq 0x1fce0
jmp 0x24a23
jmp 0x24a25
leaq -0x20198(%rbp), %rdi
callq 0x27f60
jmp 0x24a33
jmp 0x24ba1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x201b0(%rbp)
movl %eax, -0x201b4(%rbp)
movl -0x201b4(%rbp), %eax
movl %eax, -0x202c8(%rbp)
movl $0x2, %ecx
cmpl %ecx, %eax
jne 0x24a9e
movq -0x201b0(%rbp), %rdi
callq 0x19120
movq %rax, -0x20248(%rbp)
movl -0x20178(%rbp), %eax
andl $0x1, %eax
cmpl $0x0, %eax
je 0x24b98
movq -0x20248(%rbp), %rdi
leaq 0x14718(%rip), %rsi     # 0x391aa
callq 0x22ff0
jmp 0x24a99
jmp 0x24b98
movl -0x202c8(%rbp), %eax
movl $0x1, %ecx
cmpl %ecx, %eax
jne 0x24bce
movq -0x201b0(%rbp), %rdi
callq 0x19120
movq %rax, -0x20240(%rbp)
movl -0x20178(%rbp), %eax
andl $0x1, %eax
cmpl $0x0, %eax
je 0x24b74
callq 0x36960
movq %rax, -0x202d0(%rbp)
jmp 0x24ae4
movq -0x202d0(%rbp), %rsi
movq 0x224de(%rip), %rdi     # 0x46fd0
callq 0x192e0
movq %rax, -0x202d8(%rbp)
jmp 0x24b00
movq -0x202d8(%rbp), %rdi
leaq 0x1468a(%rip), %rsi     # 0x39198
callq 0x192e0
movq %rax, -0x202e0(%rbp)
jmp 0x24b1c
movq -0x20240(%rbp), %rdi
movq (%rdi), %rax
movq 0x10(%rax), %rax
callq *%rax
movq -0x202e0(%rbp), %rdi
movq %rax, %rsi
callq 0x192e0
movq %rax, -0x202e8(%rbp)
jmp 0x24b44
movq -0x202e8(%rbp), %rdi
movq 0x2245e(%rip), %rsi     # 0x46fb0
callq 0x19320
jmp 0x24b59
jmp 0x24b74
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x201b0(%rbp)
movl %eax, -0x201b4(%rbp)
callq 0x19450
jmp 0x24b7d
callq 0x19450
jmp 0x24b7b
jmp 0x24ba1
jmp 0x24bce
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x201b0(%rbp)
movl %eax, -0x201b4(%rbp)
callq 0x19450
jmp 0x24bb4
callq 0x19450
jmp 0x24b9f
jmp 0x24ba1
movl $0x1, -0x4(%rbp)
movl $0x1, -0x201fc(%rbp)
jmp 0x24bb6
jmp 0x24bce
leaq -0x20198(%rbp), %rdi
callq 0x24d90
movl -0x4(%rbp), %eax
addq $0x202f0, %rsp          # imm = 0x202F0
popq %rbp
retq
leaq -0x20198(%rbp), %rdi
callq 0x24d90
movq -0x201b0(%rbp), %rdi
callq 0x194a0
movq %rax, %rdi
callq 0x1eb30
nop